【问题标题】:How to send java.util.logging to log4j2?如何将 java.util.logging 发送到 log4j2?
【发布时间】:2014-03-13 21:54:00
【问题描述】:

我正在开发一个使用 NetBeans 平台的项目。在底层,NetBeans 使用java.util.logging 框架。

我想通过将java.util.logging 绑定到log4j2 来拦截这些日志调用。这可能吗?

之前有人提出过类似的问题,但只针对log4j 而不是log4j2

【问题讨论】:

    标签: java logging log4j log4j2


    【解决方案1】:

    2014/9/12 更新:从 2.1 版开始,Log4j 2 包含不需要 SLF4J 的 JUL bridge

    不需要自定义代码。两件事:

    1. 将以下 jar 放入类路径中: log4j-api-2.x、log4j-core-2.x 和 log4j-jul-2.x。

    2. 在对 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

    【讨论】:

    • 我从不想使用 SLF4J。我有一个用作外观的 Log4j2 的自定义包装器。我找到了解决方案并将其发布。
    • “在对 LogManager 或 Logger 进行任何调用之前”。这是最大的缺点(尽管这是由于 java.util.logging 很难提供替代实现)。当您的项目是其他项目的依赖项时,您不能轻易保证在启动时设置 System 属性。另一种方法是去 java.util.logging → SLF4J → Log4j 2;这即使在启动后也有效,但可能效率不高。它还存在 SLF4J JUL 桥接帽的问题,因为它只是一个 JUL 处理程序,而不是一个 LogManager。
    • Log4j 2 实际上有一个类似于 SLF4J 的 Log4jBridgeHandler 类,但它还没有被向后移植到 2.x,请参阅 backport pull request
    【解决方案2】:

    我找到了解决办法:

    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);
    

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2017-05-26
      • 2020-04-23
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      相关资源
      最近更新 更多