0

让我们从两个类之间的默认日志代码开始:

执行:

A类:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.cc.B;

public class A {

    public static Log logger = LogFactory.getLog(A.class);

    public static void main(String[] args) {

        logger.info("Entering application.");
        B b = new B();
        b.doIt();
        logger.info("Exiting application.");
    }
}

B类:

package com.cc;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class B {
    public static Log log = LogFactory.getLog(B.class);

       public void doIt() {
         log.debug("Did it");
       }
}

执行:

16 mars 2012 09:31:35 com.cc.A main
INFO: Entering application.
16 mars 2012 09:31:35 com.cc.B doIt
INFO: Did it
16 mars 2012 09:31:35 com.cc.A main
INFO: Exiting application.

在 B 类中,替换public static Log log = LogFactory.getLog(B.class);topublic static Log log = LogFactory.getLog(A.class);对应用程序的日志没有影响。

我怎样才能只登录到 A 类记录器?

4

2 回答 2

0

首先:我同意 quaylar 的观点,即您确实想知道日志消息的来源,所以我会说这在任何代码审查中都是不好的做法。

第二:我认为您应该始终使用 slf4j,这样您就可以将您使用的所有 3rd 方库的所有日志框架连接到您首选的日志框架。

话虽如此:如果您确保 B 实例化与 A 相同的记录器,则可以使用 log4j 来实现您想要实现的目标。

一个更简单的解决方案是仅使用 A 中定义的记录器的静态导入到 B 中:

import static com.cc.A.logger;

然后在B中使用它:

public void doIt() {
    logger.debug("Did it");
}
于 2012-03-16T11:42:36.123 回答
0

我得到这个输出:

2012-03-17 18:13:37,859 INFO  main cc.A Entering application.
2012-03-17 18:13:37,861 DEBUG main cc.A Did it
2012-03-17 18:13:37,861 INFO  main cc.A Exiting application.

使用 A 的此代码:

package com.cc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cc.B;

public class A {
    static final Logger logger = LoggerFactory.getLogger(A.class);
    public static void main(String[] args) {
        logger.info("Entering application.");
        B b = new B();
        b.doIt();
        logger.info("Exiting application.");
    }
}

而这个B的代码:

package com.cc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class B {
    private static final Logger logger = LoggerFactory.getLogger(A.class);
    public void doIt() {
        logger.debug("Did it");
    }
}

log4j的这个配置:

log4j.rootCategory      =   DEBUG, A1
log4j.appender.A1       =   org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout                    = org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern  = %d %-5p %t %c{2} %m%n

但是我不禁想知道您是否真的在每个日志行中都有识别应用程序的东西?在这种情况下,只需将应用程序名称添加到日志模式中:

log4j.appender.A1.layout.ConversionPattern  = %d %-5p %t %c{2} MyApplicationName %m%n

如果您随后将 B 更改回初始化记录器,如下所示:

    private static final Logger logger = LoggerFactory.getLogger(B.class);

你会得到这个输出:

2012-03-17 18:13:37,859 INFO  main cc.A MyApplicationName Entering application.
2012-03-17 18:13:37,861 DEBUG main cc.B MyApplicationName Did it
2012-03-17 18:13:37,861 INFO  main cc.A MyApplicationName Exiting application.
于 2012-03-17T17:19:24.320 回答