如何使用 SLF4JBridgeHandler 以编程方式设置 slf4j 记录器
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
方法的代码?我刚刚花了几个小时试图通读文档,但找不到解决方案。在配置文件中有很多关于如何做到这一点的参考,但在代码中没有。
此外,这段代码拦截了所有不同日志框架的所有日志语句,我是否正确?
Also am I correct in that this code intercepts all logging statements for all the different logging frameworks?
SLF4JBridgeHandler 是一个 java.util.logging
(JUL) 日志桥,它将 "intercept" JUL 日志语句并将它们路由到 SLF4J。
其他可用的桥是 jcl-over-slf4j
(Jakarta Commons Logging => SL4J)和 log4j-over-slf4j
(Log4J => SL4J)(以及它们的 SLF4J => X 对应物)。
根据您的代码中使用的日志记录框架(直接或间接),您可能希望包含其中的部分或全部,
捕获所有日志记录语句,详见here。
How do I write the code for appendHandler method?
使用 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-slf4j
和 log4j-over-sl4j
也在混合中)。
我正在尝试设置 slf4j 以拦截所有日志记录语句,然后根据特定条件以编程方式添加处理程序。我的代码是:
private void init()
{
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
if(condition1)
appendHandler(console, Level.DEBUG);
if(condition2)
appendHandler(logfile1, Level.INFO);
...
}
如何编写 appendHandler
方法的代码?我刚刚花了几个小时试图通读文档,但找不到解决方案。在配置文件中有很多关于如何做到这一点的参考,但在代码中没有。
此外,这段代码拦截了所有不同日志框架的所有日志语句,我是否正确?
Also am I correct in that this code intercepts all logging statements for all the different logging frameworks?
SLF4JBridgeHandler 是一个 java.util.logging
(JUL) 日志桥,它将 "intercept" JUL 日志语句并将它们路由到 SLF4J。
其他可用的桥是 jcl-over-slf4j
(Jakarta Commons Logging => SL4J)和 log4j-over-slf4j
(Log4J => SL4J)(以及它们的 SLF4J => X 对应物)。
根据您的代码中使用的日志记录框架(直接或间接),您可能希望包含其中的部分或全部, 捕获所有日志记录语句,详见here。
How do I write the code for appendHandler method?
使用 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-slf4j
和 log4j-over-sl4j
也在混合中)。