Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 记录良好/经验证的实践-EntLib_C#_.net_Asp.net Mvc_Logging_Enterprise Library - Fatal编程技术网

C# 记录良好/经验证的实践-EntLib

C# 记录良好/经验证的实践-EntLib,c#,.net,asp.net-mvc,logging,enterprise-library,C#,.net,Asp.net Mvc,Logging,Enterprise Library,我目前正在为我们的企业应用程序进行日志记录。我们(团队)同意使用企业库。我需要做一些关于这个主题的文档,但我是个新手,这很难。如果你能提出一些观点,我需要你指出什么。最佳实践是什么。到目前为止,我发现的只是一些具体的文章,如何在代码中实现它,这不是我想要的,我需要讨论什么日志,如何记录什么等等。 它是用.Net编写的MVC应用程序,以下是有关在生产系统中登录的一些最佳实践: 只记录有用的或高于某个日志记录级别的内容。不要将日志记录级别设置得太低,这会导致记录许多内容。如果日志记录太多,应用程序

我目前正在为我们的企业应用程序进行日志记录。我们(团队)同意使用企业库。我需要做一些关于这个主题的文档,但我是个新手,这很难。如果你能提出一些观点,我需要你指出什么。最佳实践是什么。到目前为止,我发现的只是一些具体的文章,如何在代码中实现它,这不是我想要的,我需要讨论什么日志,如何记录什么等等。
它是用.Net编写的MVC应用程序,以下是有关在生产系统中登录的一些最佳实践:

  • 只记录有用的或高于某个日志记录级别的内容。不要将日志记录级别设置得太低,这会导致记录许多内容。如果日志记录太多,应用程序性能将受到影响,因为日志记录涉及文件I/O

  • 还要记录线程名和类名,如果代码由多个线程执行,则有助于调试


一般来说,您应该考虑您的需求(如果没有业务需求,那么是技术需求),并尝试解决这些需求

就记录的数量而言,我倾向于使用更多的仪器而不是更少的仪器(只要级别可以调高或调低)。当你遇到那个毫无意义的奇怪的生产问题时,你会心存感激

以下是一些注意事项:

  • 能够启用不同的日志记录级别
  • 能够为不同的程序集/类启用日志记录
  • 能够为不同的功能区域启用日志记录
  • 能够记录方法入口/出口/计时
  • 能够在运行时更改日志记录级别,而无需更改代码
  • 日志存放在哪里?中央存储库还是各种分布式日志
  • 日志记录格式是什么(例如XML)?标准化信息还是临时信息
  • 您需要唯一的EventID吗
  • 日志记录是否会触发警报/通知(例如Tivoli)?如果有,要求是什么
  • 是否需要能够报告/查询日志

还考虑使用策略注入/AOP进行横切测井问题。


我建议不要使用优先级,除非您有充分的理由这样做(类别和严重性应该足够灵活)。

我有一个关于检测的一般理论。它从一个“思维实验”开始。想象一下,应用程序中根本没有任何工具,它被部署到生产环境中。到底会发生什么事情让我们希望我们已经检测了应用程序

我的回答是,一般来说,应用程序知道一些我们希望它能告诉我们的事情。这就是我们应该装备的东西

  • 我们可能希望知道特定事件发生的频率(例如,由于会话已过期,用户注销的次数)
  • 我们可能希望知道任何未处理的异常(通过ASP.NET运行状况监视几乎可以免费获得,但仍然如此)
  • 我们可能希望从某个抛出异常的代码的调用站点知道五条信息
  • 第一种情况建议我们添加一个性能计数器。第二条建议我们开启健康监测。第三个建议我们在异常发生时记录一些附加信息(然后使用
    throw;
    让异常传播)

    在我看来,这些情况都不表明花时间记录每个函数的入口和出口以及所有参数是一个好主意,也不表明我们应该捕获每个异常并在重新引用(或忽略它)之前记录它


    这些事情相当于让节目给我们“太多的信息”。

    考虑一下你的观众。在这些场景中会弹出日志记录

    用于错误日志记录。观众是维护开发人员,他们真正想知道真正的错误和相关的代码部分

    用于调试/跟踪。类似于错误日志记录,但即使在没有出错的情况下也会写入。在出现bug之前,很难说什么跟踪最有价值,所以您会在怀疑有bug的区域或事后希望知道运行了哪些方法的区域中进行大量日志记录。EntLib针对这种日志记录进行了优化。对于我在这里列出的其他日志记录目标,EntLib并不是最好的

    对于性能调优,在这种情况下,您确实希望日志记录是临时的,或者只是捕获性能低下的事件

    为了安全起见,如果您试图检测“不良行为”事件,受众可能是人力资源部或执法部门


    对于商业驱动的事物。在这种情况下,观众是客户端。

    在考虑日志记录策略时,考虑日志条目稍后如何被消费或处理是至关重要的。当事件在日志记录时变得平坦时,有价值的上下文信息往往会丢失;因此,日志在故障排除中的作用会降低


    语义日志允许您保留离散有效负载的语义值。它还将努力放在正确的位置,并使您的应用程序代码更干净。我在这篇文章中进一步讨论了这一点。

    底线是仍然需要思考。过度记录是一个问题,为了记录而记录是愚蠢的。我很喜欢John提出的思想体验——我鼓励更多的人在设计他们的日志策略时这样做。我不确定你的观点是什么。我将“记录所有事情”的典型策略与“只记录那些你会错过的事情,如果它们不存在的话”。你真的要测试所有这些选项吗?特别是,您是否要测试您的应用程序是否仍然能够正确工作,并且在使用列出的所有选项组合时表现良好?如果你不打算测试它们,那么不要