2012-09-03 45 views
0

我记录了我的应用程序错误。但如果日志记录过程由于某些原因失败(数据库错误,硬盘中没有空间等)。我怎么知道?如何记录失败的日志。如果“记录过程”失败,我该怎么办?

例如:

try{ 

    this_will_throw_exception(); 

}catch(Exception e){ 

    result = Log.error(e.getMessage()); 
    if(result == false) 
     { 
     // what should I do ? 
     } 
} 

回答

2

你应该让你的应用程序代码的简单,即不用担心记录失败,委托记录故障记录器本身。

因此您的应用程序代码应该是这样的:

try{ 
    this_will_throw_exception(); 
} catch(Exception e){ 
    Log.error(e.getMessage()); 
} 

现在我们来看看如何在记录处理失败。

首先,有很多提供appender故障转移的日志框架。例如,我们在log4j中有一个FailoverAppender,如果主节点失败,它将记录到辅助appender。 http://logging.apache.org/log4j/2.x/manual/appenders.html

如果您选择构建出于某种原因你自己的日志层,你可能会发现自己构建故障记录仪有用的装饰图案。

public interface Logger { 
    boolean error(String message); 
} 

public DataBaseLogger implements Logger { 
    ... 
} 

public FileLogger implements Logger { 
    ... 
} 

public FailoverLogger implements Logger { 
    private Logger primary; 
    private Logger secondary; 

    public boolean error(String message) { 
    boolean succeed = primary.error(message); 
    if (! succeed) { 
     secondary.error("Primary logger failed"); 
     secondary.error(message); 
     // Try to restart the primary logger, however it might be difficult. 
    } 
    } 
} 
+0

+1保持客户端代码简单。 – casablanca

1

东西来我的脑海:

  • 重新创建日志/更改配置(文件,存储等)。

  • 发送日志到一个偏远的地方。

  • 向用户显示对话框(如果适用)以便通过电子邮件或类似方式报告此错误。

1
try{ 

    this_will_throw_exception(); 

}catch(Exception e){ 

    result = Log.error(e.getMessage()); 
    if(result == false) 
     LoggingFallback.Invoke(e); 

    //important, don't hide exceptions 
    throw; 
} 

public class LoggingFallback 
{ 
    public static void Invoke(Exception exception) 
    { 
     // send an email or whatever 

     // if that fails: throw (include original exception as inner) 
     throw new LoggingFailedException("Failed to log exception", exception); 
    } 
} 

动机:

如果日志记录是非常重要的,确保它总是成功或使应用程序失败,如果它不能。否则,你最终会得到一个没有存储日志的应用程序。

也不要没有重新抛出如果不能妥善处理捕获的异常:http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

相关问题