记录最佳实践[关闭]

风流意气都作罢 提交于 2020-03-13 18:41:46

我想了解人们如何处理跟踪和登录实际应用程序的故事。 以下是一些可能有助于解释您的答案的问题。

构架

你使用什么框架?

  • log4net的
  • System.Diagnostics.Trace
  • System.Diagnostics.TraceSource
  • 记录应用程序块
  • 其他?

如果使用跟踪,是否使用Trace.Correlation.StartLogicalOperation?

您是手动编写此代码,还是使用某种形式的面向方面编程来执行此操作? 小心共享代码片段?

您是否在跟踪源上提供任何形式的粒度? 例如,WPF TraceSources允许您在不同级别配置它们:

  • System.Windows - 所有WPF的设置
  • System.Windows.Animation - 专门为动画覆盖。

听众

你使用什么日志输出?

  • 文本文件
  • XML文件
  • 事件簿
  • 其他?

如果使用文件,您使用滚动日志还是仅使用单个文件? 如何使日志可供人们使用?

查看

您可以使用哪些工具查看日志?

  • 记事本
  • 尾巴
  • 事件查看器
  • Systems Center Operations Manager / Microsoft Operations Manger
  • WCF服务跟踪查看器
  • 其他?

如果要构建ASP.NET解决方案,是否还使用ASP.NET运行状况监视? 您是否在运行状况监视器事件中包含跟踪输出? 那么Trace.axd呢?

自定义性能计数器怎么样?


#1楼

就面向方面的日志记录而言,我推荐使用PostSharp来解决另一个问题 -

面向方面的日志使用Unity \\ T4 \\其他任何东西

如果您正在评估日志记录框架,那么答案中提供的链接值得访问。


#2楼

答案中有很多很棒的建议。

一般的最佳做法是考虑谁将阅读日志。 在我的情况下,它将是客户端站点的管理员。 所以我记录的消息给了他们可以采取行动的东西。 例如,“无法初始化应用程序。这通常是由......引起的”


#3楼

我没有资格评论.Net的日志记录,因为我的面包和黄油是Java,但是我们在过去8年的日志记录中有一个迁移,你可能会发现你的问题有用的类比。

我们从JVM中每个线程使用的Singleton记录器开始,并设置整个过程的日志记录级别。 如果我们不得不调试系统的一个非常特定的部分,这会产生巨大的日志,所以第一课就是分割你的日志记录。

我们当前的记录器版本允许多个实例,其中一个被定义为默认值。 我们可以实例化具有不同日志记录级别的任意数量的子记录器,但是该体系结构最有用的方面是只需更改日志记录属性即可为各个包和类创建记录器。 第二课是创建一个灵活的系统,允许在不更改代码的情况下覆盖其行为。

我们正在使用围绕Log4J的Apache commons-logging库。

希望这可以帮助!

*编辑*

在阅读下面的Jeffrey Hantin的帖子后,我意识到我应该注意到我们的内部日志包装器实际上已经变成了什么。 它现在基本上是一个工厂,并且严格用于使用正确的属性文件(由于遗留原因尚未移动到默认位置)来获取工作记录器。 既然你现在可以在命令行上指定日志配置文件,我怀疑它会变得更加精简,如果你正在开始一个新的应用程序,我肯定同意他的说法,你甚至不应该费心包装记录器。


#4楼

我们使用Log4Net作为日志记录提供程序,使用日志实例的单例包装器(尽管单例正在审核中,质疑它们是否是个好主意)。

我们选择它的原因如下:

  • 各种环境下的简单配置/重新配置
  • 良好数量的预制appender
  • 我们使用的其中一个CMS已经内置了它
  • 周围的日志级别和配置数量很多

我应该提一下,这是从ASP.NET开发的角度来讲

我可以看到使用.NET框架中的Trace的一些优点,但我并没有完全销售它,主要是因为我使用的组件并没有真正做任何跟踪调用。 我经常使用的唯一的东西是System.Net.Mail ,我可以告诉你。

所以我们有一个包装log4net的库,在我们的代码中我们只需要这样的东西:

Logger.Instance.Warn("Something to warn about");
Logger.Instance.Fatal("Something went bad!", new Exception());

try {
  var i = int.Parse("Hello World");
} catch(FormatException, ex) {
  Logger.Instance.Error(ex);
}

在这些方法中,我们检查日志级别是否已启用,因此您没有对log4net API进行冗余调用(因此,如果未启用Debug,则会忽略调试语句),但是当我得到一些时间时我将更新它以暴露那些,以便您可以自己进行检查。 这将阻止在不应进行评估时进行评估,例如:

Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

这将成为:

if(Logger.DebugEnabled) Logger.Instance.Debug(string.Format("Something to debug at {0}", DateTime.Now);

(节省一点时间)

默认情况下,我们登录两个位置:

  1. 网站的文件系统(在非服务文件扩展名中)
  2. 错误和致命的电子邮件发送

文件按每天滚动或10mb(IIRC)进行。 我们不使用EventLog,因为它可能需要比我们通常想要提供站点更高的安全性。

我发现Notepad可以很好地读取日志。


#5楼

我们在Web应用程序上使用log4net。

当应用程序在运行时出现故障并且您需要查看更多信息时,通过更改XML配置文件来在运行时自定义日志记录非常方便。

它还允许您定位特定的类或属性以进行登录。 当您知道错误发生的位置时,这非常方便。 一个典型的例子是NHibernate,你只想看到进入数据库的SQL。

编辑:

我们将所有事件写入数据库和Trace系统。 我们用于错误或异常的事件日志。 我们将大多数事件记录到数据库中,以便我们可以创建自定义报告,并让用户查看日志,如果他们想要直接从应用程序。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!