您应该保持您的应用程序代码简单,即不要担心日志记录失败并将日志记录失败委托给记录器本身。
因此,您的应用程序代码应如下所示:
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.
}
}
}