Вход из базовых и расширенных классов с log4j? - PullRequest
1 голос
/ 09 августа 2011

Я использую slf4j с log4j, и у меня следующая ситуация:

package x.y.z.base;
public class FTPOperationsBase {

    private final Logger log = LoggerFactory.getLogger(FTPOperationsBase.class);
    protected FTPClient ftp;
    // some more fields

    public void connect() {
        ...
        // log all connect exceptions
    }
    public void disconnect() {
        ...
        // log all disconnect exceptions
    };
}

Как видно, пакет x.y.z.base . Теперь у меня есть несколько классов, которые расширяют этот базовый класс (эти классы в настоящее время находятся в пакетах x.y.z.classA, x.y.z.clasB, ... и т. Д.).

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

public class FTPExtendedClass1 
extends FTPOperationsBase {
    public void doSomething() {...}
}

и сделайте следующую кодовую последовательность:

FTPExtendedClass1 obj1 = new FTPExtendedClass1();
obj1.connect();
obj1.doSomething();
obj1.disconnect();

Я бы хотел, чтобы файл журнала для этого случая был следующим:

  • возможная информация / предупреждения / ошибки от connect ()
  • возможная информация / предупреждения / ошибки от doSomething ()
  • возможная информация / предупреждения / ошибки от отсоединения ()

Это должно иметь место для всех расширенных классов, где doSomething () - это метод, специфичный для класса. Любой способ организовать пакеты / настроить log4j для этого поведения?

Спасибо.

1 Ответ

2 голосов
/ 10 августа 2011

Вы должны создать другого Appender в вашем log4j.xml.

Один на каждый отдельный класс.

<logger name="yourBaseClassName" additivity="false">
    <level value="INFO" />
    <appender-ref ref="BasefileAppender" />
</logger>

<appender name="BasefileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/path/yourfile.log"/>

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{dd MM yyyy HH:mm:ss,SSS} %m%n"/>
    </layout>
</appender>

<logger name="yourExtendedClassName" additivity="false">
    <level value="INFO" />
    <appender-ref ref="ExtendOnefileAppender" />
</logger>

<appender name="ExtendOnefileAppender" class="org.apache.log4j.FileAppender">
<param name="File" value="/path/ExtendOnefileAppender.log"/>

    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{dd MM yyyy HH:mm:ss,SSS} %m%n"/>
    </layout>
</appender>

тогда в каждом вашем классе (базовом и расширенном) вы делаете:

Logger mylogger = Logger.getLogger(MyClass.class.getName())

Я не думаю, что это покрывает ваше второе требование (но я также хочу как-то поместить журнал из базового класса в эти отдельные журналы, в зависимости от того, какой класс используется)

но это начало ... ;-) с этим вы сможете войти в другой файл в зависимости от имени класса.

Надеюсь, это поможет

...