当前位置: 首页 > 知识库问答 >
问题:

slf4j添加自定义方法

吕嘉赐
2023-03-14

我必须将自定义方法方法添加到我的日志系统中。假设我有几行代码,例如:私有静态Logger LOGGER=LoggerFactory.getLogger(MyJavaClass.class);

日志记录由slf4j处理。如何通过添加新(!)扩展我的记录器方法,如public void error(SomeTypeObject obj){/implementation/}

目标是不更改现有代码。如何强制LoggerFactory返回使用上述方法扩展的自己的记录器实现?

我跟踪了这个问题的答案:stackoverflow.com/questions/2653855/implement-custom-logger-with-slf4j

所以,我做了我的LoggerFactory,StaticLoggerBinder和MyLoggerAdapter。

静态日志

public class StaticLoggerBinder implements LoggerFactoryBinder {

    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();

    public static final StaticLoggerBinder getSingleton() {
        return SINGLETON;
    }

    public static String REQUESTED_API_VERSION = "1.6.99";

    private static final String loggerFactoryClassStr = MyLoggerFactory.class.getName();

    private final ILoggerFactory loggerFactory;

    private StaticLoggerBinder() {
        loggerFactory = new MyLoggerFactory();
    }

    public ILoggerFactory getLoggerFactory() {
        return loggerFactory;
    }

    public String getLoggerFactoryClassStr() {
        return loggerFactoryClassStr;
    }
}

记录器html" target="_blank">工厂

public class MyLoggerFactory implements ILoggerFactory {

    ConcurrentMap<String, Logger> loggerMap;

    public MyLoggerFactory() {
        loggerMap = new ConcurrentHashMap<String, Logger>();
    }

    public Logger getLogger(String name) {
        Logger simpleLogger = loggerMap.get(name);
        if (simpleLogger != null) {
            return simpleLogger;
        } else {
            Logger newInstance = new MyLoggerAdapter(name);
            Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
            return oldInstance == null ? newInstance : oldInstance;
        }
    }

    void reset() {
        loggerMap.clear();
    }
}

迈洛格

public class MyLoggerAdapter implements Logger {
//methods from Logger interface
//and my additional method

    public void error(Exception ex) {
        //do smthng;
    }
}

现在,在MyJavaClass中,我有一个字段private static Logger Logger=LoggerFactory。getLogger(MyJavaClass.class)

问题是,当我尝试LOGGER. error(myExceptionObject)时,该方法不可见。我错过了一些东西。我将非常感谢帮助。


共有2个答案

屠华辉
2023-03-14

在此示例中,记录器可以获得:

private static MyLoggerAdapter log = (MyLoggerAdapter) StaticLoggerBinder.getSingleton().getLoggerFactory.getLogger(MyController.class.getName());
佴德曜
2023-03-14

在MyJavaClass中,应该使用MyLoggerFactory:

private static MyLoggerAdapter LOGGER = MyLoggerFactory.getLogger();

而不是

private static Logger LOGGER = LoggerFactory.getLogger(MyJavaClass.class);
 类似资料:
  • 虽然Blockly定义了许多标准块,但大多数应用程序需要定义和实现至少一些域相关块。 块由三个部分组成: 块定义对象:定义块的外观和行为,包括文本,颜色,字段和连接。 工具箱参考:工具箱XML中对块类型的引用,因此用户可以将其添加到工作区。 生成器函数:生成此块的代码字符串。它是用JavaScript编写的,即使目标语言不是JavaScript,甚至是用于Android端的Blockly。 块定义

  • 考虑logdj、slf4j等日志库。它们有类似于<代码>日志的方法。信息(“”)。假设我想在这个库的顶部添加我自己的自定义方法,这样我就可以像这样使用它 log.audit ('') 向现有库中添加此类自定义方法的最佳方法是什么?

  • 问题内容: 我正在研究Spring Data JPA。考虑下面的示例,默认情况下我将使所有crud和finder功能正常工作,如果我想自定义finder,那么也可以在界面本身中轻松完成。 我想知道如何为上述AccountRepository的实现添加完整的自定义方法?由于它是一个接口,所以我不能在那里实现该方法。 问题答案: 你需要为自定义方法创建一个单独的接口: 并提供该接口的实现类:

  • 如果想要给为所有的repository接口增加一个方法,那么之前的方法是不可行的。为了给所有的repository添加自定义的方法,开发者首先需要定义一个中间过渡的接口。 Example 20. An interface declaring custom shared behavior(定义中间接口声明) @NoRepositoryBean public interface MyRepositor

  • 为了通过自定义方法来丰富repository,首先要定义一个接口和一个接口的实现类。 Example 15. Interface for custom repository functionality(自定义接口) interface UserRepositoryCustom { public void someCustomMethod(User user); } Example 16. I

  • 问题内容: 在Ruby中,您可以使用自定义方法覆盖任何内置对象类,如下所示: 我如何在python中做到这一点?有正常的方法还是黑客? 问题答案: 您不能这样做,因为内建类型是用C编码的。您可以对类型进行子类化: 测试: 您还可以使用来覆盖str-type ,但这并不意味着您可以使用文字,因为它链接到内建的。