【问题标题】:Python parse configuration tokens from log4j in order to parse logsPython 从 log4j 解析配置令牌以解析日志
【发布时间】:2018-02-04 17:11:35
【问题描述】:

我想解析一个 log4j 配置,以便知道如何解析给定的日志。

要求:python 2.6+,没有自定义 c 模块(除非绝对需要)。

例如:

%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p{length=5} [%t] %c:%L %message%n

%d{ISO8601} %-5p{length=5} ((%t) %c:%L) %message%n

作为参考,这里描述了模式布局:

Pattern Layouts for log4j

最初,我打算为每个日志模式自定义它,例如使用 re:

log1 = re.compile(r'([\d-]{10}) ([\d:.]{12}) {1}([A-Z]{0,}) \[(catalina-exec-[0-9]{2})\]{0,} (.*)\n')

注意:我意识到这不是一个很全面的re使用,也不是一个优化的正则表达式。它只是测试。

我最初是这样开始使用parsimonious(非常早期):

    from parsimonious.grammar import Grammar
    grammar = Grammar(
        r"""
        category = "%c"
        category_precise = category optional_open number optional_close
        timedate = '%d'
        timedate_absolute = timedate optional_open timedate_abstext optional_close
        timedate_iso = timedate optional_open timedate_isotext optional_close
        timedate_date = timedate optional_open timedate_date optional_close
        timedate_era = "G"
        timedate_year_two_digit = ~"y{2}"
        timedate_year_number = ~"(?:y{1}|y{3,}"            
        timedate_month = "MM"
        timedate_minute = "mm"
        """

实际上,我想知道我是否走错了路?似乎我以错误的方式使用了 PEG 解析器,事实上,我越看它,我想我就是。

我不需要完整的代码,只需要一个好的概念、一个开始、一个想法或一个开始阅读的好地方。

最后,我希望能够查看日志格式,并且由于缺少更好的词“将 log4j2 模式转换为正则表达式”

任何帮助将不胜感激

【问题讨论】:

  • “Python 2.6+”是指“从 2.6 开始的所有 Python 版本”还是“从 2.6 开始的任何 Python 版本”或“Python 2.6 和/或 2.7”或其他?
  • 在撰写本文时它最好在 Python 2.6-3.6.x 上运行,例如,CentOS/RHEL 6 附带 Python 2.6,尽管 Python 2.7 接近 EOL,但 RHEL/CentOS 6主要更新有效期至 2020 年,维护有效期至 2024 年,因为我开始的项目是针对企业环境的,理想情况下它可以跨越。

标签: python parsing logging log4j


【解决方案1】:

我建议Plex 2.0。我发现编写代码很容易从配置文件中识别诸如 ISO8601、%d、%t 等令牌。然后,正如您从文档中看到的那样,我希望您能够编写正则表达式代码以由解析日志文件本身的 Plex 返回。

【讨论】:

  • 谢谢,我去看看!我计划为每个令牌编写一个正则表达式,这样我不仅可以通过正则表达式拆分日志,还可以分解日期和时间,以便 python 可以处理数据。完成后我会开源它。
  • 我已经尝试过查看@plex 2.0,虽然它看起来非常棒的产品,虽然我在使用 plex 时遇到了与之前相同的问题,但我最初的用例 [阅读 %d = = date, %d{yyyy-mm-dd ...} is date, in this format] 我似乎找不到任何示例,因为我能够设置常规日志,所以解析实际日志似乎更容易查看日志的表达式,但我似乎无法让 %d 和 %d{whatever} 工作。我可以使用正则表达式命名组,但我希望对所有内容都使用词法分析器。
  • 修改您的问题以提供特定配置行和特定日志行或与该配置匹配的日志行集合,我将尝试使用 Plex 编写词法分析器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多