2

我正在使用 slf4j 和 logback 为几个项目构建一个记录器,除了记录器附带的功能之外,我还想向记录器添加一些方法:log.debug(String key, String[] params, Throwable throwable )(对于信息、警告和错误也是如此)。密钥将从资源文件中获取一个字符串,并用来自 String[] 的参数填充它并记录它。
我希望用户使用干净的 slf4j,如果可能的话,不要绑定到 logback。我正在考虑使用我的功能扩展 logback,并将 slf4j 绑定到我扩展的新 logback。
这是正确的方法吗?如果是这样,我该如何扩展 logback?
通过查看其他绑定,我了解到它们没有实现标记。有没有绑定到某事的例子?所以我可以将它用作“logback 扩展”绑定的骨架?

4

2 回答 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 回答