【问题标题】:Commons-logging with log4j2使用 log4j2 进行公共日志记录
【发布时间】:2017-05-18 15:32:11
【问题描述】:

我正在使用带有 commons-logging 的 log4j 1.2。现在我正在尝试将其升级到 log4j2。 但是如何使用 log4j2 和 commons-logging 来初始化 log4j2。

我尝试通过以下方式初始化公共日志记录。它工作正常

**Statement1**: static Log log = new Log4JLogger(Logger.getLogger(Example.class));
**Statement2**:log.debug("debug statement");

这里我使用 org.apache.commons.logging.Log 类型的对象,该对象使用 org.apache.log4j.Logger 的对象初始化。(org.apache.log4j.Logger 是 log4j 1.2 中的类,其中从 log4j2 更改为 org.apache.logging.log4j.Logger

现在升级到 log4j2 后,Statement1 将无法正常工作,因为 Log4JLogger() 构造函数需要 org.apache.log4j.Logger 类型的参数。

那么,如何在 Log4j2 中使用公共日志记录?

【问题讨论】:

    标签: log4j2 apache-commons-logging


    【解决方案1】:

    您需要将 log4j-jcl-2.7 依赖项添加到您的类路径中。

    见“which jars" question in the FAQ

    在您的代码中,使用

    import org.apache.commons.logging.Log; 
    import org.apache.commons.logging.LogFactory; 
    
    public class MyClass {
        private Log log = LogFactory.getLog(MyClass.class);
        ...
    

    您不应明确使用Log4JLogger

    另外,请注意 Log4j2 与 Log4j 1 的不同之处在于它在其 API 和实现之间提供了清晰的分离。所以现在使用包装库的好处比 10 年前使用 Log4j 1 时要少得多。

    考虑直接使用 Log4j2 API:它在 API 和实现之间提供了相同的分离,并且比 commons logging 或 slf4j 功能更丰富。

    请注意,直接使用 Log4j2 API 几乎没有风险:log4j-to-slf4j-2.x 模块始终存在,以防您改变主意并决定将 Logback(或其他 slf4j 实现)与直接使用 Log4j2 API 的应用程序一起使用.

    【讨论】:

    • 你能解释一下小风险部分吗?我打算在库中坚持使用 apache commons logging 或 log4j2。根据您的回答,我假设只需在父项目中添加 log4j-to-slf4j-2.x 依赖项或 jar,就不会出现任何问题,对吧?最近遇到了一个噩梦,将现有项目迁移到使用 log4j2,删除所有 slf4j 相关的依赖项以使项目正常运行。
    • 当然,请在此处查看该问题的详细答案:stackoverflow.com/a/41500347/1446916
    猜你喜欢
    • 2017-12-20
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多