我正在使用 slf4j 和 logback 为几个项目构建一个记录器,除了记录器附带的功能之外,我还想向记录器添加一些方法:log.debug(String key, String[] params, Throwable throwable )(对于信息、警告和错误也是如此)。密钥将从资源文件中获取一个字符串,并用来自 String[] 的参数填充它并记录它。
我希望用户使用干净的 slf4j,如果可能的话,不要绑定到 logback。我正在考虑使用我的功能扩展 logback,并将 slf4j 绑定到我扩展的新 logback。
这是正确的方法吗?如果是这样,我该如何扩展 logback?
通过查看其他绑定,我了解到它们没有实现标记。有没有绑定到某事的例子?所以我可以将它用作“logback 扩展”绑定的骨架?
问问题
1623 次
2 回答
1
我同意 SLF4J 缺少用于报告异常的所有参数合一的方法,但我认为其他类型(信息、警告......)不需要它。
您可以创建一个LoggerWrapper
具有这些方法的实用程序类:
class LoggerWrapper extends Logger {
private Logger logger;
private ResourceBundle bundle;
public LoggerWrapper(Logger logger, ResourceBundle bundle) {
this.logger = logger;
this.bundle = bundle;
}
public void error(final String key, Object[] params, Throwable cause) {
logger.error(String.format(bundle.getString(key), params), cause);
}
...
}
示例用法:
class Something {
private static LoggerWrapper logger = new LoggerWrapper(
Logger.getLog(Something.class),
ResourceBundle.getBundle("ErrorMessages"));
...
private void doSomething(Object params...) {
try {
// Do something that could fail.
}
catch (SomeException e) {
logger.error("error.something.failed", params, e);
}
}
}
于 2013-07-30T13:03:32.407 回答
1
最终使用新接口扩展了 org.slf4j.Logger,然后实现了该接口。使用我的记录器的项目不需要更改他们的代码,以防万一从 logback 切换。除了添加的方法之外,实现当然只是简单地路由到 slf4j 实现。
于 2013-08-04T13:37:25.823 回答