简单的圆木卷缩机

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_infolist中的每个dict都有四个可能的部分:

  • regex(必需):用于分析日志行的正则表达式
  • timestamp_input_format(可选):由regex捕获的行的时间戳格式。如果没有给出这个值,dateutil.parse将被用来一般地使用时间戳,但这将慢5倍
  • timestamp_input_timezone(可选):输出日志时间戳的时区如果未指定,则默认为计算机的本地时区
  • timestamp_output_timezone(可选):输出日志时间戳所在的时区如果未指定,则默认为计算机的本地时区

请注意,这必须利用捕获组来表示line_output_format格式字符串中的每个关键字。

创建regex前缀和输出格式字符串

如果你有使用正则表达式的经验,这并不难

  1. 检查日志并标识前缀
  2. 将其分解为有用的部分(时间戳、消息等--请参见config.yaml以获取示例)
  3. 构造一个正则表达式,将这些部分捕获到适当命名的组中
  4. 制定一个格式字符串,将这些组输出为合理的格式

让我们看一个例子。假设我们的日志行采用以下格式:

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用jaxb2annotateplugin和XJC工具的java自定义注释   java组织。xeustechnologies。jcl无法加载WstxInputFactory类   java JUnit在格式化字符串上比较失败   java Bukkit配置部分getKeys   如何关闭Java流?   java Struts2正则表达式配置   链式事务注释的java奇怪行为   java在两个JButton之间使用变量   java签署APK时内容会发生什么变化?   java LWJGL:Slick:3D世界中的绘图字体   如何分解Java数组?   在Java MySql中处理多个过滤器   java如何在Firebase数据库中跳过初始OnChildaded事件触发   java如何在PreviewView中使用CameraX?   在子类#中重写父类后访问父类原始方法的java已解决   java找不到类型的属性   游戏框架游戏!框架+Java