Logging 什么&x2019;你的伐木哲学是什么?

Logging 什么&x2019;你的伐木哲学是什么?,logging,Logging,例如:“您的日志记录理念是什么?所有代码都应该充斥着.logthis()和.logthat()调用吗?或者您是在事后以某种方式注入日志记录吗?”我的日志记录理念可以很容易地概括为四个部分: 审计或业务逻辑日志 记录那些需要记录的事情。这源于应用程序要求,可能包括记录对任何数据库所做的每项更改(如在许多金融应用程序中)或记录对数据的访问(如卫生行业为满足行业法规可能需要的) 由于这是程序要求的一部分,许多人不把它包含在日志记录的一般讨论中,但是在这些领域中存在重叠,对于某些应用程序,考虑所有日志记

例如:“您的日志记录理念是什么?所有代码都应该充斥着
.logthis()
.logthat()
调用吗?或者您是在事后以某种方式注入日志记录吗?”

我的日志记录理念可以很容易地概括为四个部分:

审计或业务逻辑日志

记录那些需要记录的事情。这源于应用程序要求,可能包括记录对任何数据库所做的每项更改(如在许多金融应用程序中)或记录对数据的访问(如卫生行业为满足行业法规可能需要的)

由于这是程序要求的一部分,许多人不把它包含在日志记录的一般讨论中,但是在这些领域中存在重叠,对于某些应用程序,考虑所有日志记录活动是有用的。 程序记录

这些消息将帮助开发人员测试和调试应用程序,并更轻松地遵循数据流和程序逻辑,以了解实现、集成和其他错误可能存在的位置

通常,此日志记录会根据调试会话的需要打开和关闭

性能记录

根据需要添加以后的日志记录,以发现并解决性能瓶颈和其他程序问题,这些问题不会导致程序失败,但会导致更好的操作。在内存泄漏和一些非关键错误的情况下与程序日志记录重叠

安全日志

记录用户操作和与外部系统的交互,其中涉及安全问题。用于确定攻击者在攻击后如何破坏系统,但也可能与入侵检测系统结合以检测新的或正在进行的攻击


我把我所认为的传统做法视为事实;一些日志记录由条件定义包围。对于生产构造,我关闭了定义。

< P>我同意亚当,但是我也会考虑将感兴趣的东西或可以证明的东西作为一种证据来证明它们的发生。

< P>我选择刻意记录,因为这意味着日志数据是有意义的:

  • 根据日志框架,您可以添加级别/严重性/类别信息,以便可以过滤日志数据
  • 您可以确保提供正确级别的信息,不要太多,也不要太少
  • 您知道在编写代码时最重要的事情是什么,因此可以确保它们被记录下来

使用某种形式的代码注入、分析或跟踪工具来生成日志很可能会生成冗长、不太有用的日志,这些日志很难深入研究。但是,它们可以作为调试辅助工具使用。

我首先在代码中断言许多条件(在C#中,使用
System.Diagnostics.Assert
),但我只在调试或使系统处于压力下时,在找到的地方添加日志记录,我真的需要一种方法来跟踪代码内部发生的事情,而不需要永久附加调试程序


否则,我更喜欢使用Visual Studio的功能将跟踪作为特殊断点放在代码中(即,插入一个断点并右键单击它,然后选择“When hit…”并告诉它在这种情况下显示什么)。无需重新编译,而且很容易动态启用/禁用跟踪。

我认为总是,总是,总是在出现异常时添加日志记录,包括消息和完整堆栈跟踪。除此之外,我认为你是否经常使用日志是相当主观的

我经常尝试只在关键的地方添加日志记录,在这些地方我正在记录的内容应该很少受到影响,否则你会遇到他提到的日志增长太大的问题。。。这就是为什么记录错误案例是始终记录的理想方式(能够看到这些错误案例何时真正被击中,这样您就可以进一步检查问题,这是非常棒的)


要记录的其他好事情是,如果您有断言,并且断言失败,那么记录它。。。例如,这个查询应该少于10个结果,如果它更大,可能会有问题,所以记录它。当然,如果一个log语句最终填充了日志,那么它可能是一个提示,要么将其置于某种“调试”级别,要么调整或删除log语句。如果日志增长过大,您通常会忽略它们。

如果您正在编写一个将被许多人使用的程序,最好有某种机制来选择将记录什么和不记录什么。支持.logthis()函数的一个理由是,在某些情况下(如果操作正确),它们可以很好地替代内联注释


加上,它可以帮助您精确地缩小错误发生的范围。

记录所有错误并让Grep对其进行分类。

我定义了各种级别,并通过配置/调用传入设置。

我使用安全关键实时系统,而日志记录通常是捕获罕见错误的唯一方法,这些错误只有在每53个星期二发生时才会出现满月,如果你明白我的意思。这会让你对这个话题着迷,所以如果我开始口吐白沫,我现在就道歉

我设计的系统能够记录几乎所有的东西,但我并没有在默认情况下打开所有的东西。调试信息被发送到一个隐藏的调试对话框,该对话框给它加上时间戳,并将其输出到一个列表框(删除前限制在500行左右),该对话框允许我停止它,自动将它保存到日志文件,或将它转移到附加的调试程序(如DBWin32)。这种转移使我能够看到多个应用程序的调试输出都被整齐地序列化,这有时可以起到救命的作用。日志文件每N天自动清除一次。我曾经使用数字日志记录级别(级别设置越高,捕获的内容越多):

  • 只有错误
  • 基本的
  • 详细的
  • 一切
  • #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