作为 杰夫*阿特伍德要求:"什么是你记录的哲学?应所有的代码被充满了 .logthis().logthat() 电话?或者你注入记录的事实后以某种方式?"

有帮助吗?

解决方案

我的日志记录的理念是很容易地归纳在四个部分:

审计或商业逻辑登录

日志的那些事都必须记录。这是来自应用程序的要求,并且可以包括记录的每一个变化做出任何数据库(因为在许多财务应用程序)或者登录访问的数据(如可能需要在保健行业,以满足行业的法规)

因为这是程序的一部分要求许多不包括在他们的一般性讨论的记录,但是有重叠,在这些领域,并且对于某些应用是有用的,以考虑的所有伐木活动在一起。

程序的记录

消息,这将有助于开发测试和调试的应用程序,并更容易地按照数据的流程和程序的逻辑,以了解那里实施、整合和其他错误可能存在。

一般来说,这种记录是开启和关闭作为需要进行调试的会议。

性能记录

后添加记录作为需要找到并解决业绩的瓶颈和其他程序问题而不是造成该程序失败,但是会导致更好地运作。重叠的程序记录的情况下存储器泄漏,和一些非关键性的错误。

保安记录

记录用户的行动和相互作用与外部系统的安全是令人关切的问题。用于确定攻击者打破了一个系统的攻击之后,但也可以扎入一个入侵检测系统来检测新的或正在进行的攻击。

其他提示

我的工作与安全性至关重要的实时系统和记录往往是唯一的办法赶上罕见的错误,仅仅把第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

这个记录系统附带释放的建立,导和保存文件的默认。太晚找出来你应该已经记录之后的错误已经发生,如果这一错误,只会发生一次,每隔六个月的平均水平和你有没有办法的再现。

该软件通常附带的错误,基础,STATE_CHANGE和异常变,但这是可以改变在该领域通过调试对话(或注册/ini/cfg的环境,在那里这些东西得到保存)。

哦还有一件事-我试系统产生一个文件的每一天。你的要求可能是不同的。但要确保你的代码开始调试 文件的日期、代码版本,你们的运行,如果可能的话,有些标记的客户标识、位置的系统或什么的。你可以得到一个大杂烩日志文件来自外地,而且你需要一些记录的什么来了从哪里和什么样的版本系统,他们正在运行,这实际上是在数据本身,你不能信任的客户/工程师来告诉你什么的版本,他们已经有了-他们可能只是告诉你什么的版本,他们认为他们已经得到了。更糟糕的是,他们可能报告的可执行软件版本的磁盘上,但旧的版本仍然是在运行,因为他们忘了之后重新启动更换。有你的代码告诉你本身。

这是我的大脑倾倒...

我认为,总是,总是,总是添加记录时有一个例外,包括信息和完整堆踪。除此之外,我认为这是相当主观的,是否使用的记录经常或不...

我经常试图只会增加登录在关键的地方哪里有什么我的日志记录应很少的打击,否则你等问题,他提到的记录,增长太大...这就是为什么日志记录错误的情况是理想的事情总是记录(这是伟大的,能够看到当这些出现错误的情况下实际上被击中,所以你可以检查问题进一步).

其他好的东西要登录是如果你有的主张,并断言失败,然后登录它...例如,这种查询应该是10岁以下的结果,如果它是大有可能是一个问题,所以登录。当然,如果一登录的发言结束了填充日志,它可能是一个提示,要么把它放到某种形式的"调试"的水平,或调整或删除的日志发言。如果日志的增长太大,你会往往忽视了他们。

我要我考虑传统方法;一些记录,四周有条件的定义。用于生产基础,我关闭的定义。

我选择记录故意作为我去,因为这意味着所记录的数据是有意义的:

  • 根据日志框架可以增加水平/严重程度/类别的信息,以便登录的数据可以过滤
  • 你可以确保适当级别的信息是存在的,不会太多,不过小
  • 你知道什么时候写的代码,其中最重要的事情,因此,可以确保它们的记录

使用某种形式的代码注、分析或跟踪工具,以生成的日志最有可能产生繁琐,不用的记录,这将是难以潜入。他们可能是有用的作为调试的援助,但是。

我开始主张通过了很多条件,在我的代码(C#中,使用 System.Diagnostics.Assert的),但是我只记录在那里我找到,同时调试,或将系统压力之下,我真的需要有一种方式遵循的是什么发生在我的代码没有一个调试器的永久连接。

否则,我更喜欢使用的视觉工作能力把痕迹在代码为特点(即你插入一个断点和权击它,然后选择"打的时候..."和告诉它该怎么会显示在这种情况下)。没有必要重新编译并且很容易启用/停用的痕迹。

如果你正在写一个程序,将被用于许多人来说,它是最好要有某种机构选择将是什么记录,什么也不会。一个论点支持。logthis()职能是,他们可以是一个很好的替代用于嵌意见,在某些情况下(如果适当地做).

另外,它可以帮助你缩小正好在错误的发生。

日志们,让查询排序'em。

我同意与亚当的,但我还将审议记录的事情感兴趣或东西,你可以展示成就作为一种证明他们在发生的事情。

我定义各种各样的水平,并通过在设置与配置/调用。

如果你真的需要记录在你的系统,那么你的测试都是废话或至少是不完整的,并不是非常透彻。一切都在你的系统应该是一个黑盒子尽可能的。注意到如何核心类似的串不需要记录的主要原因是他们是很好的测试和执行作为详细。没有惊喜。

我使用登录作为一种方法来缩小的问题是不现在我们单元的测试,让我们仅重复同样的步骤提供用户:那些稀有的故障,只出现在一些非常遥远的硬件(有时,尽管很少,甚至引起的一个驱动程序或第三方的库故障以外的我们的控制)。

我同意意见,这应该被抓住通过我们的测试程序,但很难找到一万LOC代码,需要非常低的水平,性能至关重要的代码没有满足这些要求。我不工作在特派团关键软件,但我在图工业在我们经常做的一切都从实施内存分配以利用GPU代码单指令.

甚至有非常模块化、松散耦合或甚至完全解耦合代码,该系统的相互作用可能导致非常复杂的输入和输出,与行为变化的平台之间偶尔在那里我们有流氓边缘的情况而逃避我们的测试。模块黑盒子可以非常简单,但它们之间的相互作用可以获得非常复杂,并导致偶尔意料之外的边缘的情况。

作为一个例子情况的记录保存我的屁股,一个时间我做了个奇怪的用户有一个原型机,英特尔,这是崩溃。我们列出的最低要求的计算机应支持SSE4,但是这个特殊机遇,这些最低要求,并仍然没有支持流单指令扩展过去SSE3尽管正在16个核心机。发现,迅速成为可能,通过看他的日志表明其精确的行号的SSE4说明了使用。我们没有在我们的队伍可能再现的问题让我们单独一个单一的其他用户参加了核查报告。理想情况下,我们应该已经编写代码,用于老年单指令的版本或至少没有一些分支和检查,以确保硬件支持的最低要求,但我们想做一个公司的假设通过的最低硬件要求简化和经济。在这里,也许,这是值得商榷,这是我们的最低要求,有"故障".

给我的使用记录在这里,我们倾向于获得相当大的日志。然而,我们的目标是不可读性--什么是常重要的是最后一个日志发送一份报告时的用户经验的一个崩溃的某一类,我们没有在队(让我们单独几其他用户在世界)可以重现。

尽管如此,一个把戏我雇用定期避免过度的日志发送垃圾邮件是,它常常是合理的假设一段代码,其中执行一次成功也将这样做随后(未硬的保障,但往往一个合理的假设).所以我通常采用的一个 log_once 一种功能为颗粒状的职能,以避免的开销支付的费用记录每次它被称为。

我不撒日志的产出所有的地方(我可能如果我有时间)。通常我保留它们大多数地区似乎在大多数危险:代码用GLSL着色,例如(GPU供应商的变化很大,在这方面的能力,甚至他们如何编码),代码使用单指令内部函数、低级别的代码、代码,不可避免地要依靠操作系统的具体行为,低级代码使假设表示荚(ex:代码,假设8位字节)--的种情况下,我们将同样洒大量的断言和理智的检查以及编写最多的单元的测试。这通常是足够的,并记录保存我的屁股很多次我在哪里否则将采取一unreproducible问题,并就必须采取盲目的刺在的问题,需要许多iteratons弹试图解决的一个用户在世界上谁可以再现问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top