格式化日志的最佳做法是什么?

时间:2009-11-19 18:54:50

标签: standards logging

我正在编写一个蜜罐软件,它会广泛记录与它的交互,我打算登录明文.log文件。

我有两个问题,来自对服务器日志记录不太熟悉的人。

  1. 首先我应该如何分解我的日志文件,我假设在运行一个月后我不想要一个大的.log文件,我是按日,月,年来做的?它有一些标准吗?

  2. 每一行的格式,我有一个标准分隔符,无论是*, - ,+,还有什么?在任何地方都有标准(我的谷歌搜索没有带来多少)?

6 个答案:

答案 0 :(得分:25)

我喜欢这种日志文件格式:

$ python simple_logging_module.py
2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
2005-03-19 15:10:26,697 - simple_example - ERROR - error message
2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message

这是来自python的logging module。 我通常每天都有一个文件,每个月有一个文件夹,每年有一个文件夹。您将获得无法正确编辑的大型日志文件。

logs/
  2009/
    January/
     01012009.log
     02012009.log
     ...
    February/
     ...
  2008/
   ...

答案 1 :(得分:16)

此类日志记录没有标准。滚动,文件布局,这一切都取决于你需要什么。总的来说,我面临三个主要情况:

  • 全部在一个文件中。似乎不适合你。
  • 固定尺寸​​滚动。在当前文件大于定义值时,在创建新日志文件时定义大小。通常在大多数log4anything包中都有一个包装盒支持。
  • 总自定义滚动。我见过像这样的布局
    • 每天都会获得以YYYYMMDD格式命名的自己的目录。如果您不登录日志,请考虑目录布局,如YYYY \ MM \ YYYYMMDD,如其他答案所示。
    • 应在此目录中使用固定大小滚动
    • 每个文件的名称都为logfile_yyyymmdd_ccc.log,其中ccc的数量正在增加。添加文件名的时间也是一个好主意(例如,轻松判断您每分钟生成多少个日志)
    • 为了节省空间,每个日志都会自动压缩压缩。
    • 过去3天总是保持未压缩状态,因此您可以使用UNIX文字工具快速访问。

这个自定义的看起来像这样

logs/
  20090101/
     logfile_20090101_001.zip
     logfile_20090101_002.zip
     ...
  20090102/
     logfile_20090102_001.zip
     logfile_20090102_002.zip
   logfile_20090101_001.log
   logfile_20090101_002.log
   logfile_20090102_001.log
   logfile_20090102_002.log

还有一些很好的做法可用于良好的日志记录:

  • 始终在日志文件名中保留日期
  • 始终在日志文件名中添加一些名称。它将帮助您将日志文件与系统的不同实例区分开来。
  • 始终记录每个日志事件的时间和日期(最好是毫秒级分辨率)。
  • 始终将您的日期存储为YYYYMMDD。到处。在filename中,在logfile中。它有助于排序。允许使用一些分隔符(例如2009-11-29)。
  • 通常避免将日志存储在数据库中。 In是您的日志架构中的另一个故障点。
  • 如果您有多线程系统,请始终记录线程ID。
  • 如果您有多进程系统,请始终记录进程ID。
  • 如果您有许多计算机,请始终记录计算机ID。
  • 确保您以后可以处理日志。只需尝试将一个日志文件导入数据库或Excel。如果花费的时间超过30秒,则表示您的日志记录错误。这包括:
    • 选择良好的内部记录格式。我更喜欢空格分隔,因为它适用于Unix文本工具和Excel
    • 选择合适的日期/时间格式,以便您可以轻松导入某些SQL数据库或Excel以进一步处理。

答案 2 :(得分:2)

要分解日志文件,您可以使用logrotate之类的外部应用程序,并让它处理肮脏的工作。

至于每一行的格式,没有标准,所以你应该使用最适合你的。如果您稍后要自动解析日志文件,那么您可能希望在格式化日志输出时记住这一点。

答案 3 :(得分:2)

我建议您使用一个众所周知的日志库。大多数日志库都支持翻转。 Log4Net(.net)/ Log4J(java)是一个特别好用的日志库,它有很多你可能会觉得有用的选项。使用任何翻转间隔最适合您。对于蜜罐应用程序,我认为您会发现每小时或每日营业额最佳。您还可以使用固定限制(如256mb)来确保您的日志工作不会超出可用的可用磁盘空间。 Log4Net / Log4J也支持这一点。

Log4J @ Apache.Org
Log4Net @ Apache.Org

应根据需要设置日志文件的格式。非常希望使用不太可能出现在日志输入中的分隔符。对于您的应用,这可能是不可能的。在典型情况下,某些方使用空格(NCSA日志),某些方使用逗号(制作CSV文件),某些方使用制表符(制作制表符分隔文件)。这些都有各自的优点和缺点。

答案 4 :(得分:1)

建议:

它适用于蜜罐系统(除非坏人真的打击了应用程序/网站),您可以考虑花费额外的时间来登录数据库

这将使日志的分析和使用更容易,更实时(即,您无需在分析/浏览日志之前完成ETL过程。

这表示存在于数据库表或文件中,这并不排除定义格式的必要性。暂时,您可以使用“多态”格式,其中包含一些常见属性(ID,IP地址,时间戳,Cookie / ID,“级别”[重要性/紧迫性]),然后是短暂的助记符定义特定事件类型的代码(例如“LIA”=登录尝试,“GURL”=猜测网址,“SQLI”SQL注入尝试等...)后跟几个数字字段,以及一些字符串字段,语义将随之变化每个助记符。总结一下:

 - Id
 - TimeStamp  (maybe split in date and time)
 - IP_Address
 - UserID_of_sorts
 - // other generic/common fields that you may think of
 - EventCode   (LIA, GURL, SQLI...)
 - Message   Text message (varies with particular event instance)
 - Int1      // Numbers...
 - Int2
 - Str1      // ...and text which meaning varies with the EventCode
 - Str2
 - //... ?

现在......无论是平面文件还是SQL数据库(尤其是转到数据库),您都可以使用标准日志库。也许 log4j 正如其他回复中所建议的那样(虽然我不确定它是否容易在Python中绑定,无论如何,Python的标准日志记录模块是+/-相同的......)甚至是Python's standard library's logging module可能可以根据您的需求量身定制。

答案 5 :(得分:1)

在我看来,最重要的是: