记录策略与性能

时间:2010-04-12 21:56:26

标签: .net architecture logging synchronization log4net

我正在开发一个必须支持大量同步请求的Web应用程序,并且我希望保持足够快。我现在要实现一个日志记录策略,我将使用log4net,但是...我应该记录什么以及如何记录?我的意思是:

  1. 日志记录如何影响性能?是否可以/使用异步调用记录日志?
  2. 最好使用文本文件还是数据库?有可能有条件吗?例如,默认登录到数据库,如果失败,则切换到文本文件。
  3. 多线程怎么样?我使用log4net时应该关心同步吗?或者它是开箱即用的线程安全吗?
  4. 在要求中,应用程序应该为每个请求缓存一些内容,而且我担心它会对性能产生影响。

    干杯。

3 个答案:

答案 0 :(得分:14)

  1. 这会让事情变得更慢 - 做一些事情比无所事事需要更多时间。通常可以忽略不计。别担心。
  2. 登录到文本文件imo。它们易于移动/ grep /压缩/邮件等,您不必担心数据库已关闭这一事实会记录到数据库。如果您需要,可以使用登录到log4net数据库的附加程序。
  3. Yes,log4net是线程安全的。
  4. 记录/跟踪非常有价值 - 至少你应该记录错误,或者你永远不会知道它们。大多数日志记录apis允许您打开和关闭您需要记录的详细信息。

    在成为问题之前不要担心性能。这并不像你正在构建月球火箭,并希望通过测试它来看看它能携带多少重量 - 它只是代码,删除日志中的日志记录并重新编译,如果它成为一个问题。

答案 1 :(得分:4)

我会说你早期担心性能问题,使用log4net以后很容易关闭或自定义(例如:使用定义日志级别为NONE,ERROR,WARN的conf文件)调试,信息,全部,VERBOSE等......),

但是你的另外两个问题是有效的,对于问题2,我会选择普通文件,因为它们可以很容易地读取和访问而不是数据库。写入文件末尾的性能也优于db。

是的,因为nos已经声明log4net是线程安全的。

一条一般建议,如果您的项目规模很大,并且您希望拥有如上所述的可配置日志级别,那么您真的需要就团队内部的编码标准达成一致意见在不同的层面。

答案 2 :(得分:3)

我完全赞同hhafez和nos所说的话。您正在使用日志包而不是尝试滚动自己的路径。它更干净,更容易做对。与DB记录相比,记录到文本文件更容易管理长期(给定典型的项目技能集),但如果您计划对报告的数据进行任何复杂的分析,有时将其放在数据库中会更容易。

如果调试是您实现日志记录解决方案的既定目标之一,那么您必须事先标准化所有日志级别,并使代码审查过程成为您的一部分。在粒度方面有足够的差异,以便您可以通过进入下一级别逐步增加报告的深度。对PROD问题进行故障排除是非常令人沮丧的,没有足够的日志信息来查看问题,然后增加到下一级别的日志记录并使用如此多的喷射完全淹没日志,以至于您无法看到森林中的树木(以及由于音量,您的日志每5分钟滚动一次)。我见过它。

在大多数文本文件记录的情况下,性能应该不是问题。 DB日志记录有点棘手。插入操作只比附加到文本文件稍微强一些,但它是每单位时间的体积,这使得它在规模上更加丑陋。

此外,如果您要进行任何离线日志分析,您应该选择一种易于扩展的日志文件格式,如果您需要向日志添加内容,则不需要对分析代码进行大量更改。远离嵌套的多部分消息结构。解析那些会变得很痛苦。

祝你好运!