首页 文章

扩展logback并允许客户端使用干净的slf4j

提问于
浏览
2

我正在使用slf4j和logback为几个项目构建一个 Logger ,并且在 Logger 附带的功能之上我想向Logger添加更多方法:log.debug(String key,String [] params,Throwable throwable )(和信息,警告和错误相同) . 密钥将从资源文件中获取一个字符串,并使用String []中的参数填充它并记录它 .
我希望用户使用干净的slf4j,如果可能的话,不要被绑定到logback . 我正在考虑使用我的功能扩展logback并将slf4j的绑定写入扩展的新logback .
这是正确的方法吗?如果是这样,我如何扩展回溯?
通过查看其他绑定,我了解到他们没有实现标记 . 是否有一个绑定到某些东西的例子?所以我可以用它作为"logback extended"绑定的骨架?

2 回答

  • 1

    最后用新接口扩展了org.slf4j.Logger,然后实现了该接口 . 使用我的 Logger 的项目不需要更改他们的代码,以防从logback切换 . 除了添加的方法之外,实现当然只是路由到slf4j实现 .

  • 1

    我同意SLF4J缺乏报告异常的all-args-in-one方法,但我认为不需要其他类型(info,warn ......) .

    您可以创建一个具有这些方法的实用程序类 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);
            }
        }
    }
    

相关问题