【发布时间】: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
作为参考,这里描述了模式布局:
最初,我打算为每个日志模式自定义它,例如使用 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