【问题标题】:What is a good way to format logs?格式化日志的好方法是什么?
【发布时间】:2010-09-08 05:16:38
【问题描述】:

我正在设计一个应用程序,其中需要记录我从 Telnet 连接收到的所有传入消息。尽管可以包含提供文本颜色和格式(16 种颜色、粗体、下划线等)的 ANSI 标记,但文本基本上很简单。

我想格式化我的日志,以便稍后存储带有格式、日期/时间和可能的其他元数据的文本。我的第一个想法是所有 XML,但这可能会影响我以后编写快速搜索工具的能力。我目前的想法是日期/时间 + 文本在一个文件中,元数据存储在另一个 XML 文件中,由行号引用。

这是一个好的解决方案吗?另外,我应该在哪里以及如何存储格式化命令?原始的 ANSI 标签会破坏普通标签,但将它们放在两个不同的文件中可能会很尴尬。

附加:感谢到目前为止的一些答案,但我应该提到,大多数时候消息将是人与人之间的通信,而不是系统消息。一种更原始​​的 IRC。稍后由我的用户决定(通过添加元数据)哪些消息是重要的。这是过滤或编辑的日志可能来自于记录日志的原始数据。

【问题讨论】:

    标签: c# parsing logging


    【解决方案1】:

    如果您正在捕获日志信息以供将来搜索和分析,那么数据库可能是一个更好的答案。

    至于您的解决方案。平面文件根本不能很好地扩展,而数据库的扩展性要好得多。我也不会拆分文件,这只会加剧可伸缩性问题。如果您必须使用平面文件,我可能会尝试将元数据保存在 csv 中(开销较小),并将数据保存在 csv 文件索引的一系列文件中。这样所有数据都不会影响您的索引文件。只是我的想法。

    【讨论】:

    • 我将在以后添加自动拆分文件。这种情况下的数据库有点笨重,我希望日志也能够独立存在。
    【解决方案2】:

    生日,

    一定要在平面文件中进行日志记录,然后添加 munge 脚本以稍后将其转换为 XMl。

    第一个建议是确保所有日期/时间字符串都采用 ISO 8601 格式,即 YYYY-MM-DD hh:mm:ss。

    其次是使您的类别,例如异常、致命、错误、警告、信息等在您的日志中非常突出。

    然后看看一些 vim 语法文件并为你的日志格式创建一个新语法,这样重要的日志条目才能真正脱颖而出。

    获取标准语法文件之一并对其进行修改以处理您的日志字符串并不难。

    HTH。

    干杯,

    罗伯

    【讨论】:

      【解决方案3】:

      我的第一个建议是使用 log4net 之类的插入式日志记录工具,这将使格式化更加自动化。

      如果您打算使用两个文件(我同意 Craig 的观点,数据库可能是更好的选择),您可以通过拥有一个尽可能稀疏的文件来为自己省去很多心痛使其用于以后的快速搜索,并将所有信息(元数据和数据)保存在一个地方,而不是创建仅元数据的格式。

      【讨论】:

        【解决方案4】:

        我要“分道扬镳”,说将数据库用于所有分析/归档日志条目(例如 Telnet 通信)。这将使您受益于全文搜索、列以及搜索数据的简便方法。

        为您的任何调试/严重错误类型日志使用平面文件(或 XML 格式,因为文件不应太大)。

        如果您的数据库连接断开,或者您的表结构出现问题,那么记录到数据库将毫无意义。

        想一想,如果您正在寻找更“轻量级”的解决方案,您可以使用 SQLite 记录您的所有 telnet 流量,这样您就可以利用 DB 结构的优势,同时也可以使用文件。

        再次向 log4net 点头,您可以使用他们拥有的 ADO appender 轻松完成此任务。

        【讨论】:

          【解决方案5】:

          我不确定您到底想要完成什么。 Telnet 通常被认为是一个字符一次的协议,所以当您说“传入消息”时,您的意思是每个字符都是一条消息吗?还是整个用户的会话都是一条消息?

          我会做一些假设。 您有用户通过 telnet 登录,并且您希望捕获他们在登录时所做的一切。稍后,您希望能够将他们所做的事情与该用户以及他们所做的时间和日期相关联。稍后您需要能够搜索以找出“谁以 root 身份执行了 'rm *'?”

          我会将每个用户的会话存储为一个单独的文件,其命名约定包括用户的登录名和时间戳。

          例如2008_09_08_14_52_07_nidonocu

          在文件中,我会捕获收到的每个字节,假设它们大多是纯文本字符。

          例如

          ls
          cd www
          ls
          vi index.html
          /copyright 2007
          llllllllllllr8:wq
          exit
          

          也将 8 位 ANSI 字符写入文件。您应该能够使用文本编辑器和 grep 进行基本的审核和搜索。如果您需要实际读取 8 位数据,您可以使用二进制文件查看器或稍后变得更复杂。

          备份、归档、清除等都可以使用常规文件系统工具和脚本来完成。

          如果我的假设是错误的,我深表歉意。

          --
          布鲁斯

          【讨论】:

            猜你喜欢
            • 2010-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-11
            • 2013-09-20
            • 2015-04-10
            相关资源
            最近更新 更多