简单的圆木卷缩机
collatelogs的Python项目详细描述
collatelogs
一个简单的日志整理器。也就是说,给定一个或多个日志文件路径,将它们按时间顺序整理在一起。
动机
在复杂的项目中,通常会同时生成各种日志。在一个完美的世界中,所有这些日志都有相同的日志格式,因此可以通过将它们全部追加并排序来轻松地进行整理/协调
然而,这个世界并不完美,您可能正在处理各种日志格式,甚至是时间戳格式的差异collatelogs
基于给定的正则表达式处理日志的消耗,然后整理它们并以通用格式(也可配置)输出它们
安装
$ pip install collatelogs
用法
除非日志文件恰好具有与示例配置中的一个正则表达式匹配的前缀结构,否则此脚本可能无法正常工作。所以,你可能会看到这样的东西:
$ collatelogs PATH_WITH_LOGS/*.log
<snip>
ValueError: Line 'some line from the logs' did not match against any of the given regexes!
因此,首先需要定义有关预期日志前缀的信息。
配置文件
为了易于使用,建议您创建一个配置文件,以避免每次运行脚本时都必须传递一堆参数。回购协议中包含一个示例,位于collatelogs/example_config.yaml
。这也将安装在软件包旁边
永久配置文件的建议位置是~/.cl_config.yaml
帮助中列出了搜索的其他路径。
在开始进行更改之前,$ cp example_config.yaml ~/.cl_config.yaml
可能是最容易的。
timestamp_output_format
(可选)
时间戳输出的格式。除非在运行时将--parse-timestamps
作为参数传递,或者在配置文件中将parse_timestamps
设置为True
,否则这不会有任何影响
line_output_format
(必需)
一个符合PEP-3101的格式字符串,定义每行的输出格式。这里的关键字必须是regex捕获组的子集plus由元处理程序贡献的任何关键字(见下文)换一种说法:如果您尝试在这里包含在每个正则表达式中没有被捕获的关键字,您将得到一个错误
log_parsing_info
(必需)
然后开始用您自己的条目替换log_parsing_info
中的示例条目(如果示例永远不会匹配任何内容,则离开示例只会减慢执行速度)
在log_parsing_info
list
中的每个dict
都有四个可能的部分:
regex
(必需):用于分析日志行的正则表达式timestamp_input_format
(可选):由regex
捕获的行的时间戳格式。如果没有给出这个值,dateutil.parse
将被用来一般地使用时间戳,但这将慢5倍timestamp_input_timezone
(可选):输出日志时间戳的时区如果未指定,则默认为计算机的本地时区timestamp_output_timezone
(可选):输出日志时间戳所在的时区如果未指定,则默认为计算机的本地时区
请注意,这必须利用捕获组来表示line_output_format
格式字符串中的每个关键字。
创建regex前缀和输出格式字符串
如果你有使用正则表达式的经验,这并不难
- 检查日志并标识前缀
- 将其分解为有用的部分(时间戳、消息等--请参见config.yaml以获取示例)
- 构造一个正则表达式,将这些部分捕获到适当命名的组中
- 制定一个格式字符串,将这些组输出为合理的格式
让我们看一个例子。假设我们的日志行采用以下格式:
2018-04-20 11:30:01 circus[1624] [INFO] circusd-stats stopped
即使不检查创建此日志的记录器,也可以将其分为四个部分:
{
'timestamp': '2018-04-20 11:30:01'
'module': 'circus[1624]', # Not technically a module, but close enough
'level': 'INFO'
'message': 'circusd-stats stopped'
}
上面是regex应该通过其groupdict
。那么,什么正则表达式可以实现这一点呢好吧,这实际上是从config.yaml
:
(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?P<module>\S+) (?P<level>\S+) (?P<message>.*)
因为这个前缀格式是由空格分隔的(我也不是正则表达式专家),所以正则表达式相当冗长我发现像regex 101这样的工具帮助很大:https://regex101.com/r/bTzhf4/1
既然已经构建了regex,那么按照上面的部分将它添加到配置文件中
meta_handlers
它们处理与每个日志文件相关联的元数据,使其作为关键字参数可供line_output_format
使用。
当前有两个可用的处理程序:
user
:日志文件的所有者filename
:日志文件的文件名(基名称)
您将看到这些都出现在示例line_output_format
目前还没有一种简单的方法可以添加您自己的代码,但是您可以通过定义它们,然后在all_meta_handlers
中将名称映射到它们,轻松地将它们破解到metahandlers.py