繁体   English   中英

如何使用SLF4JBridgeHandler以编程方式设置slf4j logger

[英]How to programmatically setup slf4j logger with SLF4JBridgeHandler

我正在尝试设置slf4j来拦截所有日志记录语句,然后根据特定条件以编程方式添加处理程序。 我的代码是:

private void init()
{
    SLF4JBridgeHandler.removeHandlersForRootLogger();
    SLF4JBridgeHandler.install();

    if(condition1)
        appendHandler(console, Level.DEBUG);
    if(condition2)
        appendHandler(logfile1, Level.INFO);
    ...
}

如何编写appendHandler方法的代码? 我花了几个小时试图阅读文档,但找不到解决方案。 有很多关于如何在配置文件中执行但不在代码中的参考。

我也是正确的,因为这段代码拦截了所有不同日志框架的所有日志记录语句?

我也是正确的,因为这段代码拦截了所有不同日志框架的所有日志记录语句?

SLF4JBridgeHandler是一个java.util.logging (JUL)日志记录桥,它将“拦截”JUL日志记录语句并将它们路由到SLF4J。

其他可用的桥接器是jcl-over-slf4j (Jakarta Commons Logging => SL4J)和log4j-over-slf4j (Log4J => SL4J)(以及它们的SLF4J => X对应物)。

根据您的代码中使用的日志框架(直接或间接),您可能希望包含部分或全部日志框架,以捕获所有日志记录语句 ,如此处所述

SL4J传统桥梁

如何编写appendHandler方法的代码?

使用SLF4J(例如Logback)作为主要日志记录框架

设置网桥后,可以按常规方式配置SLF4J实施。

下面是如何为Logback执行此操作的示例

//Install the JUL Bridge
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();

//Obtain an instance of LoggerContext
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();

//Create a new FileAppender
FileAppender<ILoggingEvent> file = new FileAppender<ILoggingEvent>();
file.setName("FileLogger");
file.setFile("error.log");
file.setContext(context);
file.setAppend(true);

//Filter out anything < WARN
ThresholdFilter warningFilter = new ThresholdFilter();
warningFilter.setLevel("WARN");
warningFilter.setContext(context);
warningFilter.start();
file.addFilter(warningFilter);

//Message Encoder
PatternLayoutEncoder ple = new PatternLayoutEncoder();
ple.setContext(context);
ple.setPattern("%date %level [%thread] %logger{10} %msg%n");
ple.start();
file.setEncoder(ple);

file.start();

//Get ROOT logger, and add appender to it
Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.DEBUG);
root.addAppender(file);

使用JUL作为主要日志记录框架

如果你想要的是使用JUL (java.util.logging)作为主要的日志框架,你根本不需要注册SLF4JBridgeHandler

只需像往常一样配置JUL处理程序,并将slf4j-jdk14 (即SLF4J => JUL)桥接器添加到依赖项列表中。

//Create a new Handler
Handler fh = new FileHandler("error.log");
fh.setLevel(Level.WARNING);

//Register it with the ROOT logger
Logger.getLogger("").addHandler(fh);

//Log some messages
Logger.getLogger("scratchpad").info("Info !");
Logger.getLogger("scratchpad").warning("Warning !");
Logger.getLogger("scratchpad").severe("Severe !");

//Log some messages via SL4J 
LoggerFactory.getLogger("scratchpad").error("sl4j message");

这样,任何SL4J日志语句都将被重定向到适当的JUL处理程序(您可能还希望在混合中添加jcl-over-slf4jlog4j-over-sl4j )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM