【发布时间】:2014-03-13 21:54:00
【问题描述】:
我正在开发一个使用 NetBeans 平台的项目。在底层,NetBeans 使用java.util.logging 框架。
我想通过将java.util.logging 绑定到log4j2 来拦截这些日志调用。这可能吗?
之前有人提出过类似的问题,但只针对log4j 而不是log4j2!
【问题讨论】:
我正在开发一个使用 NetBeans 平台的项目。在底层,NetBeans 使用java.util.logging 框架。
我想通过将java.util.logging 绑定到log4j2 来拦截这些日志调用。这可能吗?
之前有人提出过类似的问题,但只针对log4j 而不是log4j2!
【问题讨论】:
2014/9/12 更新:从 2.1 版开始,Log4j 2 包含不需要 SLF4J 的 JUL bridge。
不需要自定义代码。两件事:
将以下 jar 放入类路径中: log4j-api-2.x、log4j-core-2.x 和 log4j-jul-2.x。
在对 LogManager 或 Logger 进行任何调用之前,将系统属性 java.util.logging.manager 设置为 org.apache.logging.log4j.jul.LogManager
Log4J2 FAQ 页面直观地显示了依赖关系: http://logging.apache.org/log4j/2.x/faq.html#which_jars
【讨论】:
Log4jBridgeHandler 类,但它还没有被向后移植到 2.x,请参阅 backport pull request。
我找到了解决办法:
org.netbeans.* 命名空间之后的 NetBeans 平台名称记录器。为了路由 NetBeans 日志调用,我简单地创建了一个 Handler 并将其注册到 org.netbeans 记录器:
public class CustomHandler extends Handler
{
@Override
public void publish(LogRecord record)
{
// Re-direct log calls here (e.g. send record to Log4j2 logger).
}
@Override
public void flush()
{
}
@Override
public void close() throws SecurityException
{
}
}
请务必注册新的Handler 并在必要时禁用父记录器:
Logger logger = Logger.getLogger("org.netbeans");
logger.addHandler(new CustomerHandler());
logger.setUseParentHandlers(false);
【讨论】: