4

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

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

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

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

4

5 回答 5

2

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

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

于 2008-09-08T21:57:26.100 回答
1

天,

一定要登录平面文件并添加 munge 脚本以稍后将其转换为 XMl。

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

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

然后看看一些 vim 语法文件并为您的日志格式创建一个新语法,以便让重要的日志条目真正脱颖而出。

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

HTH。

干杯,

于 2008-09-08T21:19:09.310 回答
0

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

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

于 2008-09-08T21:16:28.490 回答
0

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

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

如果您的数据库连接断开,或者您的表结构有些古怪,那么登录到数据库将毫无意义。

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

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

于 2008-09-08T22:05:40.807 回答
0

我不确定您到底要完成什么。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 位数据,您可以使用二进制文件查看器或稍后变得更复杂。

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

如果我的假设是错误的,我很抱歉。

——
布鲁斯

于 2008-09-08T22:17:05.960 回答