【问题标题】:What if logger can't log?如果记录器无法记录怎么办?
【发布时间】:2014-04-04 09:10:45
【问题描述】:

我最近遇到了一种情况,理论上操作已完成,但记录器未能将一些信息写入文件(没有对带有日志的文件夹的写访问权限)并且操作被报告为失败(甚至应用程序因异常而崩溃)。在我的项目中,我们经常使用类似的代码

try { /*Business logic*/}
catch (BusinessLogicEx1) {...}
catch (BusinessLogicEx2) {...}
catch (SomeKindOfException ex)
{
    LogThisException(ex);
}

如果日志由于某种原因不可用怎么办?您通常如何处理这种情况?你会以某种方式通知用户吗?

【问题讨论】:

    标签: c# logging error-handling error-logging


    【解决方案1】:

    我在开始时会检查日志路径、文件可用性和文件访问权限,以确保此类事情不会经常发生。如果您仍然遇到锁定/不可用的文件

    • 我通常通过 Gui 通知用户并写入临时目标,这样日志记录就不会丢失
    • 如果没有 Gui 可用,我会编写一个 windows 事件条目

      System.Diagnostics.EventLog appLog =  new System.Diagnostics.EventLog();  
      appLog.Source = "This Application's Name";  
      appLog.WriteEntry("An entry to the Application event log.");
      
    • 在大型项目中,有一个配置管理可以在开始时检查并记住错误,因此当应用程序以管理员模式执行时,它可以显示发生的任何内部错误

    最佳解决方案将取决于您的方案

    【讨论】:

      【解决方案2】:

      你尽最大努力优雅降级。尝试精简日志,尝试使用不同的 API 等记录到替代目标。如果可能,将消息排队以便稍后记录。这真的归结为你愿意付出多少努力,有多重要。并努力不让糟糕的情况变得更糟(通过尝试hard记录导致更多问题/崩溃应用程序)。

      有趣的问题是是否通知用户。考虑:

      • 是否有用户开始?如果您是服务人员,那么没有人可以看到您的消息。
      • 当前用户是正确的通知人吗?如果这是使用您的信息亭的店员,那么不是,您应该通知管理员。
      • 用户可以对此做些什么吗? “任何事情”可能包括“通知适当的管理员”。如果是这种情况,请确保错误消息具有描述性和可操作性。
      • 应该通知用户(或用户站点上的管理员),还是,开发人员(或您的公司)?您经常确实想听到有关问题的信息,因此您知道代码中的哪些问题,由于配置错误而通常会中断的内容,哪些依赖项是脆弱的(想想您依赖的 REST api)。我不会在这里进行隐私讨论,但您应该从法律/公关角度清楚地考虑这个角度。
      • 经常会记录一些内容并向用户显示其他内容。不同的受众(最终用户与调试/管理员)。

      我希望这能证明只有你才能回答这个问题,知道你的应用做了什么以及如何使用。就我个人而言,我遇到过许多必须明确通知用户的情况,以及必须静默登录的情况,以及代码必须“打电话回家”并向我报告问题的情况。 em>。

      【讨论】:

        猜你喜欢
        • 2019-01-22
        • 1970-01-01
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        • 1970-01-01
        • 2014-09-27
        相关资源
        最近更新 更多