提问人:lkessler 提问时间:1/22/2010 最后编辑:lkessler 更新时间:2/4/2010 访问量:2784
标准错误日志文件的良好布局是什么?
What Is a Good Layout for a Standard Error Log File?
问:
我正在尝试为我的桌面程序设计错误和警告日志文件。
当我的程序读取用户的输入文件时,它可能会发现语法错误或某种无效数据。一旦所有内容都被读取并且程序正在处理数据,可能会发现更多问题。
我想将有关这些的消息写入一个简单的文本文件中。我可能还想包含信息性文本,以指示进度、时间、内存使用情况等。我想要包括行号,甚至可能包括导致错误的实际输入行。
这将是用户想要浏览的文件,因此显然它必须布局合理且易于使用。
您是否知道任何样式指南,或者您是否看到过一个错误日志文件,让您对自己说:“现在这是一个设计良好的日志文件!
随访:
前三个答案实际上更适用于服务器或事件日志。
我真的在为我的桌面程序寻找一种日志文件的格式,以详细说明它在输入文件中发现的任何问题以及其处理的成功(或失败)。
我确信您使用过的一些桌面应用程序会生成此类日志文件。你见过什么好的吗?
答:
我将日志写入 csv 文件,并发现它非常方便(您可以将它们用作数据库或使用电子表格软件打开它们以进行复杂的分析)。示例日志文件为:
Date;Time;Severity;TID;Module;This;Source;Message
2010/01/21;08:47:05:205;DEBUG;4936;MAIN;0x00000000;DllMain@36;DLL_PROCESS_ATTACH
2010/01/21;08:47:05:205;DEBUG;4936;MAIN;0x00000000;DllMain@40;DLL_PROCESS_DETACH
我不确定它是否适合您的需求,但我认为您已经掌握了主要想法。祝你好运!
很少有日志文件给我留下了深刻的印象 - 实际上,我很难想到任何日志文件(并且找不到任何日志文件)。根据我的经验,出现的问题部分是因为日志的格式是供内部人员(程序员)理解的,而不是供其他程序或外部人员(非程序员)理解的。
关键信息经常被省略;有时甚至是日期和时间信息。我建议让它们易于解析;我会使用 ISO 8601 表示法,例如“2010-01-22T10:23:21-08:00”(包括时区,注意)。我会包括进程(和线程)ID;我会考虑包括程序名称、参数(例如文件名);我也会以某种形式包含用户 ID。其中一些可能每次运行只需要一次,但每条消息可能需要其他位。这在一定程度上取决于日志文件在每次运行中是唯一的还是跨运行共享的,以及单个文件是否可以由多个用户/进程使用。
然后,您需要决定如何识别消息内容 - 以及消息内容的结尾。特别是对于机器解析(也适用于人工解析),如果内容格式明确并且可以检测到结尾,这将是有帮助的。您可能需要转义内容(这是最常撤消的步骤,因此,如果错误消息是关于格式错误的错误消息,则很难分辨文件中的数据以及文件中数据的新错误消息)。在多线程程序中 - 或者日志文件可能在进程之间共享 - 您还必须考虑如何缓冲写入,尤其是在必须处理长行的情况下。您希望每条消息在日志文件中单独分开。这不一定是微不足道的 - 您甚至可能需要处理锁定协议以确保受控访问。
考虑是否需要为日志提供漂亮的打印机。
考虑基于 XML 的格式(带有开始和结束标记)是否有帮助。我不是XML的忠实拥护者,但它在机器处理方面确实有一些优势。
syslog
并且是系统管理员可能熟悉的广泛使用的格式,并且有使用它们的工具。在进行自己的格式设置之前,您至少应该查看它们。log4j
对于 Windows,它几乎总是应用程序事件日志,我不太喜欢它,因为它不像文本文件那样,但它是正确的方式。我见过一些应用程序在他们的程序目录或其他东西中写入文本文件,但它总是临时的,从来都不是标准的。例如,McAfee VirusScan 将文件记录在 C:\Documents and Settings\All Users\Application Data\McAfee\DesktopProtection 中。我的机器在 C:\Documents and Settings\username\Local Settings\temp*.log 和 C:\WINDOWS\temp*.log 中有很多安装日志。但同样,它们都是不同的、临时的,而且没有明显的设计
评论
C:\Documents and Settings\All Users\Application Data\McAfee\DesktopProtection
C:\Documents and Settings\username\Local Settings\temp\*.log
C:\WINDOWS\temp\*.log