我使用的是对安全至关重要的实时系统,日志记录通常是捕获罕见错误的唯一方法,如果您发现我的漂移,它会在满月的每第53个星期二的蓝色月亮出现一次。这种让您沉迷于该主题的东西,所以如果我开始在嘴上起泡沫,我现在就道歉。以下内容是为本机代码调试日志编写的,但大多数内容也适用于托管世界...
使用文本日志文件。似乎很明显,但是有些人确实尝试生成二进制日志文件:这只是愚蠢的,因为当我在现场时,我不需要寻找阅读器工具。另外,如果是文本且调试很冗长,则现场工程师很有可能无需回过头就可以读取文件并诊断问题。每个人都赢。
我设计的系统几乎可以记录所有内容,但是默认情况下我不启用所有功能。调试信息将发送到一个隐藏的调试对话框,该对话框会对其进行时间戳记,然后将其输出到列表框(删除前限制为大约500行),并且该对话框允许我停止它,自动将其保存到日志文件或将其转移到附加的调试器。这种转移使我可以看到来自多个应用程序的调试输出,它们都被整齐地序列化了,有时可以节省生命。我曾经使用数字日志记录级别(设置的级别越高,捕获的内容越多):
off
errors only
basic
detailed
everything
但这太不灵活了-当您朝着错误的方向努力时,能够准确地登录所需的内容而不必经历大量的碎屑,效率会大大提高,这可能是一种特殊的事务或操作导致错误。如果这需要您打开所有内容,则只会使自己的工作变得更加困难。您需要更细粒度的东西。
所以现在我正在基于标志系统切换到日志记录。记录的所有内容都有一个标志,详细说明该操作的类型,并且有一组复选框允许我定义要记录的内容。通常,该列表如下所示:
#define DEBUG_ERROR 1
#define DEBUG_BASIC 2
#define DEBUG_DETAIL 4
#define DEBUG_MSG_BASIC 8
#define DEBUG_MSG_POLL 16
#define DEBUG_MSG_STATUS 32
#define DEBUG_METRICS 64
#define DEBUG_EXCEPTION 128
#define DEBUG_STATE_CHANGE 256
#define DEBUG_DB_READ 512
#define DEBUG_DB_WRITE 1024
#define DEBUG_SQL_TEXT 2048
#define DEBUG_MSG_CONTENTS 4096
此日志记录系统附带发行版本,默认情况下已打开并保存到文件。如果发现该错误平均每6个月发生一次且您无法重现,那么现在就发现您应该已经在进行日志记录已经太迟了。仅适用于调试版本的日志记录是正确的。普通 哑。
该软件通常附带ERROR,BASIC,STATE_CHANGE和EXCEPTION,但可以通过调试对话框(或保存这些内容的注册表/ ini / cfg设置)在现场进行更改。
哦,还有一件事-我的调试系统每天生成一个文件。您的要求可能有所不同。但是请确保您的调试代码以日期,正在运行的代码的版本以及每个文件的ID(系统可能的位置),每个客户ID,系统位置或其他任何内容开头。您可以从现场获得大量的日志文件,并且需要一些记录,这些记录来自何处以及它们运行的系统的哪个版本实际上在数据本身中,并且您无法信任客户/现场工程师告诉您他们所拥有的版本-他们可能只是告诉您他们所拥有的版本。更糟糕的是,他们可能会报告磁盘上的exe版本,但旧版本仍在运行,因为他们在更换后忘了重启。让您的代码告诉您自己。
最后,您不希望您的代码产生自己的问题,因此请放置计时器功能,以便在数天或数周后清除日志文件(只需检查现在和创建文件之间的时间差)。对于始终运行的服务器应用程序,这是可以的,在客户端应用程序上,您可以在启动时清除所有旧数据。我们通常会在30天左右后清除系统,而在没有工程师频繁访问的情况下,您可能希望将其保留更长时间。显然,这也取决于日志文件的大小。