Apache常用日志记录

时间:2012-03-16 08:39:52

标签: java apache-commons-logging

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

实施

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);替换为public static Log log = LogFactory.getLog(A.class);对应用程序的日志没有影响。

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

2 个答案:

答案 0 :(得分:0)

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

第二:我认为你应该总是使用slf4j,这样你就可以将你使用的所有第三方库的所有日志框架桥接到首选的日志框架。

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

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

import static com.cc.A.logger;

然后在B中使用它:

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

答案 1 :(得分: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更改为init logger,请执行以下操作:

    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.