4
  1. 如果您的错误日志记录代码失败,您会怎么做?
  2. 您如何确保其当前正常工作?
  3. 你怎么知道它是否不起作用?
  4. 你如何测试它在生产环境中的工作?
  5. 如果一切都失败了,我应该抛出异常吗?

下面的代码使用 Microsoft 的 Enterprise Library Logging Application Block。你如何让它“更好”?

using Microsoft.Practices.EnterpriseLibrary.Logging;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            // Trying to write some data to the DB
            ...
        }
        catch (Exception ex)
        {
            LogHelper.LogException(ex, "Trying to write to the DB");
        }
    }
}

public class LogHelper
{
    public static void LogException(Exception ex, string exceptionType)
    {
        try
        {
            // Simplified version, only logging the message
            Logger.Write(exceptionType);
        }
        catch
        {
            // What do you do here???
        }
    }
}
4

3 回答 3

5

我的应用程序通常会在出现错误时做两件事。第一种是将其写入本地日志文件(即使它也使用某种类型的数据库日志记录)。然后它将错误的电子邮件发送到为支持而设置的分发列表。

因此,如果数据库日志写入失败,错误仍然在本地日志文件中,并且还通过电子邮件发送。

如果电子邮件失败,仍会记录错误,以便您稍后解决问题。

恕我直言,获得比这更高的容错性只值得为极其关键的应用程序付出努力。

于 2009-04-01T18:03:56.517 回答
3

请参阅我的相关问题中的答案:

如果其他一切都失败了,请在您的 catch 块中进行“最后的记录”。将异常记录到文本文件中的一个极不可能失败的位置。如果最后的日志记录因抛出另一个异常而失败,您可以吞下该异常,或终止您的应用程序并将错误显示为消息框。

在这种特定(异常)情况下,吞下异常是不终止应用程序的唯一方法。

于 2009-04-01T18:23:57.263 回答
0

我写了一个日志文件,并将一封电子邮件发送到一个永远不会消失的公共地址。两者都不是防弹的,但我认为如果我们的邮件系统出现故障或电子邮件服务器发生变化,我们会知道这一点。我确实有一些应用程序可以同时写入数据库和平面文件并发送电子邮件。因此,这 3 个中的一个将起作用。我发现我的一个应用程序正在为日志写入数据库,并且在捕获中它正在写入同一个数据库,我发现它的唯一方法是应用程序由于数据库连接中的一些变化而失败。我确保修改那个 catch 语句做电子邮件而不是数据库。平面文件的唯一问题是文件系统存储,我们有很多为日志编写平面文件的应用程序,所以我们不断地备份它们并保存它们,或者只是简单地删除它们。

于 2009-04-01T18:34:26.893 回答