log4j: протоколировать выход определенного класса для определенного приложения

161

Я использую log4j и хотел бы направить вывод определенных регистраторов в определенные файлы.

У меня уже есть несколько приложений. Теперь, чтобы упростить отладку, я хочу сказать log4j, что выходные данные, сгенерированные определенным классом (например, foo.bar.Baz), должны быть записаны в определенный файл журнала.

Можно ли это сделать?

gubrutz
источник

Ответы:

203

Пример:

log4j.rootLogger=ERROR, logfile

log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.datePattern='-'dd'.log'
log4j.appender.logfile.File=log/radius-prod.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%-6r %d{ISO8601} %-5p %40.40c %x - %m\n

log4j.logger.foo.bar.Baz=DEBUG, myappender
log4j.additivity.foo.bar.Baz=false

log4j.appender.myappender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.myappender.datePattern='-'dd'.log'
log4j.appender.myappender.File=log/access-ext-dmz-prod.log
log4j.appender.myappender.layout=org.apache.log4j.PatternLayout
log4j.appender.myappender.layout.ConversionPattern=%-6r %d{ISO8601} %-5p %40.40c %x - %m\n
Морис Перри
источник
21
ааа - это так просто! Спасибо! Приводит ли параметр log4j.additivity.foo.bar.Baz = false в исполнение, что вывод Baz не будет отображаться в приложении rootLogger?
gubrutz
3
для какой версии log4J это? Я пытаюсь найти конфигурацию xml, чтобы сделать то же самое для log4j версии 1.2.17
AC
1
@RodrigoGurgel да, ничего необычного там нет
Морис Перри
4
@dwjohnston Установка аддитивности в false предотвратит регистрацию в журнале приложений своих предшественников (по умолчанию это правда). В этом случае, если аддитивность оставлена ​​равной true, вход в приложение Baz привел бы к записи в оба файла.
Морис Перри
1
какие-нибудь мысли о конфиге xml?
Игорь Донин
21

Вот ответ относительно конфигурации XML, обратите внимание, что если вы не дадите файлу appender, ConversionPatternон создаст 0-байтовый файл и ничего не напишет:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
        </layout>
    </appender>

    <appender name="bdfile" class="org.apache.log4j.RollingFileAppender">
        <param name="append" value="false"/>
        <param name="maxFileSize" value="1GB"/>
        <param name="maxBackupIndex" value="2"/>
        <param name="file" value="/tmp/bd.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
        </layout>
    </appender>

    <logger name="com.example.mypackage" additivity="false">
        <level value="debug"/>
        <appender-ref ref="bdfile"/>
    </logger>

    <root>
        <priority value="info"/>
        <appender-ref ref="bdfile"/>
        <appender-ref ref="console"/>
    </root>

</log4j:configuration>
mikeb
источник
2
Крайне важно удалить <appender-ref ref="bdfile"/>из <root>этого файла - иначе вы также увидите весь журнал, скопированный в этот файл.
Саб
Как настроить это для pacakge по умолчанию или для конкретного класса без пакета?
Прасад Джадхав
Это <logger>...элемент. Укажите класс или пакет в качестве имени, а приложение - в качестве файла приложения.
mikeb