Code to logging ratio?

什么是logging比率的理想代码? 我不习惯写日志,因为我开发的大多数应用程序都没有太多的日志logging。

最近虽然我已经改变了工作,并且我注意到你看不到调用log4net的应用程序代码。 我明白,这是有用的,但肯定有太多的debugging语句是一样糟糕,根本没有任何?

有logging语句告诉你什么时候每个方法开始和结束以及它们返回什么。 几乎什么都做完了。

在编译时使用reflection来添加日志语句的插件会不会更容易,所以当您试图查看代码时,它们并没有妨碍您的工作。

同样在这些强大的IDE和远程debugging的日子,那么多日志logging真的nescisary?

实际上,有一个很好的库,可以像PostSharp所说的那样添加日志logging。 它可以让你通过基于属性的编程来做到这一点,除了日志之外,还有许多其他非常有用的东西。

我同意你说的是有点过度的日志logging。

其他人提出了一些好的观点,尤其是银行业务情景和其他关键任务应用程序。 可能需要进行极端的日志logging,或者至less可以根据需要打开或closures,或设置不同的级别。

由于log4net在阻塞资源方面做的非常出色,所以在日志logging方面我倾向于有点冗长,因为当你必须改变到debugging模式时,你拥有的信息越多越好。 以下是我通常logging的内容:

debugging级别

  • 传入该方法的任何参数
  • 来自我检索的结果集的任何行计数
  • 传递给方法时可能包含可疑数据的任何数据行
  • 任何“生成的”文件path,连接string或其他值在环境中“拼凑在一起”时可能会变得混乱。

信息级别

  • 方法的开始和结束
  • 任何主要循环的开始和结束
  • 任何重大案件/交换声明的开始

错误级别

  • 处理exception
  • 无效的login尝试(如果安全是个问题)
  • 我截获的数据是不正确的

致命的水平

  • 未处理的exception。

还有大量的日志logging细节,阻止我向用户询问当他们收到错误信息时他们正在做什么。 我可以很容易地把它拼在一起。

完整的日志文件非常有用。 考虑一下你的应用程序部署在某个银行的情况。 你不能进去debugging它们,他们肯定不会把你的数据发给你。 你可以得到一个完整的日志,可以指出你的问题发生的地方。 有一些日志级别是非常有帮助的。 通常情况下,应用程序将运行在一个只会报告致命错误或严重错误的模式。 当您需要debugging时,用户可以打开debugging或跟踪输出并获取更多信息。

你所看到的那种logging确实看起来太多了,但是我不能确切地说它是在不知道更多关于应用程序的位置以及它可能被部署的地方。

同样在这些强大的IDE和远程debugging的日子,那么多日志logging真的nescisary?

是的,尽pipe许多不熟练的开发人员犯的错误是尝试用错误的方法来修复错误,但通常在debugging时倾向于logging。 每个地方都有一个地方,但是至less有几个地区几乎总是需要采伐:

  • 为了检查实时代码中的问题,暂停debugging器会影响计算的结果(授予,日志会对这样的实时过程中的时间产生轻微的影响,但是多大程度上取决于软件)
  • 将版本发送给Beta版testing人员或其他可能无法访问debugging器的同事
  • 将数据转储到磁盘上,这可能不容易在debugging器中查看。 例如,某些IDE无法正确parsingSTL结构。
  • 获得对程序正常stream程的“感觉”
  • 除了评论之外,为了使代码更具可读性,如下所示:
 //现在打开数据文件
 fp = fopen(“data.bin”,“rb”);

上述评论可以很容易地被放置在一个日志logging调用中:

 const char * kDataFile =“data.bin”;
日志(“现在打开数据文件%s”,kDataFile);
 fp = fopen(kDataFile,“rb”);

这就是说,你在某些方面是正确的。 使用日志logging机制作为荣誉化的堆栈跟踪logging器将生成质量很差的日志文件,因为它不会为开发人员提供足够的故障点。 所以这里的关键显然是日志调用的正确和谨慎的使用,我认为这归结于开发人员的判断。 你需要考虑到你本质上是在为自己做日志文件。 您的用户不关心他们,通常会严重曲解他们的内容,但是您可以使用它们来至less确定您的程序为什么行为不当。

此外,日志文件很难将您指向特定错误的直接来源。 根据我的经验,通常会提供一些有关如何复制错误的信息,然后通过复制或debugging它的过程来找出问题的原因。

那么多的日志logging是不必要的。 (生产中)没有理由知道每种方法何时开始和结束。 也许你需要某些方法,但是在日志文件中有这么多的噪音使得他们几乎不可能有效地进行分析。

你应该logging什么时候发生重要的事情,比如错误,用户login(审计日志),事务开始,重要数据更新等等等等。 如果你有一个问题,你不能从日志中找出,那么你可以添加更多,如果有必要…但只有在必要时。

此外,只是为了您的信息,在编译时添加日志logging将是所谓的面向方面编程的一个例子。 伐木将是“交叉关切”。

当你有一个客户场景(也就是你没有物理访问的机器的人)时,唯一的事情就是重绘function和几乎所有被他们调用的东西(应该是几乎没有的)。 或者其他在运行过程中每秒被调用次数为100次的函数(程序启动没问题,但是,根据我的经验,有100多个调用获取/设置例程的函数,因为这是大多数问题的源头)。

否则,当你错过某个关键的日志点时,你只会踢自己,这个日志点会明确告诉你用户机器上的问题。

(注意:这里我指的是为面向开发人员的日志启用跟踪模式时发生的日志logging,而不是面向用户的正常操作日志。

有多less行默认logging? 我已经在一个系统上工作,就像你所描述的那样 – 只要引导它就会导致超过20MB的日志被写入,如果日志logging被启动了,但是即使是debugging,我们也没有把它全部转向所有模块。 默认情况下,它将在input代码模块时logging日志,以及重要的系统事件。 由于QA只需要将日志附加到票证上,因此对于debugging来说非常好,即使不能重现,也可以看到问题发生时的情况。 如果你有严重的multithreading的话,那么日志logging比我工作过的任何IDE或debugging器都要好。

当您在应用程序testing版发现错误时无法再现问题时,您应该已经完成​​了过多的日志logging。 同样的方式,如果客户报告错误,但你不能复制它过度的日志function可以节省一天。

我发现自从我开始使用TDD以来,日志logging就不那么必要了。 这使得更容易确定错误所在。 但是,我发现日志语句可以帮助理解代码中发生了什么。 当然,debugging器可以帮助您了解所发生的事情。 但是,如果我想获得高层次的视图,我可以更容易地将一行输出与一行代码进行匹配。

不过,我应该添加的一件事是:确保您的日志语句包含日志语句所在的模块! 我不能计算我不得不回头的次数,并找出日志声明的实际位置。

我认为“日志与代码比例”是对问题的误解。

在我的工作中,我偶尔会遇到这样一种情况:Java程序中的错误不能在生产环境之外复制,而且客户也不希望它再次发生。

然后,你可以用来修复这个bug,你自己把这些信息放在日志文件中。 没有debugging会话(反正在生产环境中禁止) – 不要在input数据戳 – 没有任何!

所以日志是你的时间机器发生错误的时间,因为你不能提前预测什么信息,你将需要修复一个未知的错误 – 否则你可以只修复这个错误 – 你需要login很多东西…

究竟什么东西取决于场景,但基本上足以确保你从来不怀疑会发生什么:)

当然这意味着很多日志会发生。 然后,您将创build两个日志 – 一个只保留足够长的时间,以确保您不需要它,另一个日志可以保存更长的时间。

忽略日志过多,通常是由那些没有其他的东西来解决bug的人去做:)

我个人认为,首先是没有硬性规定。 我有一些应用程序logging了很多方法,并通过中间状态更新。 这些应用程序虽然是预定的进程,但是运行起来还有另一个存储成功/失败的应用程序parsing日志。

我发现,在所有的现实中,许多用户应用程序不需要大量的日志logging,因为如果出现问题,您将进行debugging以追踪那里的值。 另外你通常不需要花费日志。

但是,这真的取决于这个项目。

在我的工作中,我写了很多Windows服务。 对我而言,采伐并不是奢侈品, 这实际上是我唯一的用户界面。 当我们部署到生产环境时,我们无法访问debugging,甚至无法访问我们的服务所写的数据库,而且无需logging,我们就无法知道任何具体的问题。

话虽如此,我相信简洁的日志风格是最好的方法。 日志消息往往局限于应用程序的业务逻辑,比如“接收来自账户xxx的消息”而不是“input的函数yyy”。 我们做日志exception,线程启动,环境设置和时间回应。 除此之外,我们期望debugging器在开发和QA阶段识别逻辑错误。

我必须承认,当开始编程时,我或多或lesslogging了“Dillie-O”所描述的所有细节。

相信我……在生产部署的最初几天里,我们非常依赖日志文件来解决数百个问题,这对我们有很大的帮助。

一旦系统稳定下来,我开始逐渐删除日志条目,因为它们的增加开始递减。 (在那个时候没有Log4j )

我认为,代码对日志条目的比例取决于项目和环境,并不一定是一个常数比率。

现在,我们在使用Log4j等软件包进行日志logging,dynamic启用日志级别等方面拥有很大的灵活性。

但是,如果程序员不恰当地使用它,比如什么时候使用,什么时候不使用INFO,DEBUG,ERROR等以及日志消息中的细节(我已经看到日志消息如“Hello X,Hello XX,你好XXX等“,只有程序员才能理解)比例将继续保持高位, 投资回报率较低。

我认为另一个因素是正在使用的工具集/平台以及随之而来的惯例。 例如,在J(2)EE世界中,日志似乎相当普遍,但我不记得在Ruby on Rails应用程序中编写日志语句。