Apache Common Logging - PullRequest
       10

Apache Common Logging

0 голосов
/ 16 марта 2012

давайте начнем с кода регистрации по умолчанию между двумя классами:

Реализация:

Класс 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 голосов
/ 17 марта 2012

Я получаю этот вывод:

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.
0 голосов
/ 16 марта 2012

Во-первых: я согласен с Quaylar, что вы хотите знать, откуда исходит ваше лог-сообщение, поэтому я бы сказал, что это плохая практика в любом обзоре кода.

Во-вторых: я думаю, что вы всегда должны использовать slf4jтак что вы можете связать все каркасы логирования всех сторонних библиотек, которые вы используете, с вашей предпочтительной каркасом логирования.

Сказав, что: Вы можете достичь того, чего хотите достичь, если вместо этого используете log4j, если убедитесь, что B создает тот же логгер, что и A.

Более простым решением было бы просто использоватьстатический импорт регистратора, определенного в A, в B:

import static com.cc.A.logger;

, а затем использовать его в B:

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