Log4J - Подобная SiftingAppender функциональность

Я работаю в проекте, который использует Log4J. Одно из требования должно создать отдельный файл журнала для каждого потока; это само было нечетной проблемой, несколько отсортированной путем создания нового FileAppender на лету и присоединения его к экземпляру Регистратора.

Logger logger = Logger.getLogger();
FileAppender appender = new FileAppender();
appender.setFile(fileName);
appender.setLayout(new PatternLayout(lp.getPattern()));
appender.setName();
appender.setThreshold(Level.DEBUG);
appender.activateOptions();
logger.addAppender(appender);

Все пошло прекрасное, пока мы не поняли, что другая библиотека, которой мы пользуемся - Платформа Spring v3.0.0 (которые используют Вход палаты общин) - не сотрудничает с техникой выше – данные регистрации Spring “замечены” только Appenders, инициализированным из log4.configuration файла, но не временем выполнения создал Appenders. Так, назад к квадратному.

После некоторого расследования я узнал, что новый и улучшенный LogBack имеет appender - SiftingAppender – который делает точно, что мы нуждаемся т.е. распараллеливаем уровень, входящий в систему независимые файлы.

В данный момент перемещение в LogBack не является опцией, таким образом, застревая с Log4J, как я могу достигнуть подобной SiftingAppender функциональности и угодить Spring также?

Примечание: Spring только используется для функциональности JdbcTemplate, никакого IOC; для “сцепления” палаты общин Spring, Регистрирующейся с Log4J, я добавил эту строку в log4j.properties файле:

log4j.logger.org.springframework=DEBUG

как проинструктировано здесь.

10
задан Adrian 19 December 2009 в 00:26
поделиться

3 ответа

Доступ к LogBack осуществляется через slf4j api . Существует библиотека адаптера под названием jcl-over-sjf4j , которая предоставляет общий интерфейс ведения журналов, но делает все журналы в API slf4j, который идет непосредственно в реализацию - LogBack. Если вы используете maven, вот зависимости:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.5.8</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.5.8</version>
</dependency> 
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>0.9.18</version>
</dependency>

(и добавьте общий журнал в список исключений, см. здесь )

3
ответ дан 4 December 2019 в 02:50
поделиться

Мне нравится включать все slf4j фасады/re-ro- routers/weveryoucallthem. Также обратите внимание на "предоставленный" хак, который удерживает зависимости от занесения в протокол общин; ранее я использовал фальшивую библиотеку записи пустых общин под названием version-99.0-does-not-exist.

Также см. http://blog.springsource.com/2009/12/04/logging-dependencies-in-spring/

<dependencies>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>

        <!-- use provided scope on real JCL instead -->
        <!-- <version>99.0-does-not-exist</version> -->

        <version>1.1.1</version>

        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging-api</artifactId>

        <!-- use provided scope on real JCL instead -->
        <!-- <version>99.0-does-not-exist</version> -->

        <version>1.1</version>

        <scope>provided</scope>
    </dependency>

    <!-- the slf4j commons-logging replacement -->
    <!-- if any package is using jakarta commons logging this will -->
    <!-- re-route it through slf4j. -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>

        <version>${version.slf4j}</version>
    </dependency>

    <!-- the slf4j log4j replacement. -->
    <!-- if any package is using log4j this will re-route -->
    <!-- it through slf4j. -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j-over-slf4j</artifactId>

        <version>${version.slf4j}</version>
    </dependency>

    <!-- the slf4j java.util.logging replacement. -->
    <!-- if any package is using java.util.logging this will re-route -->
    <!-- it through slf4j. -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
        <version>${version.slf4j}</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>

        <version>${version.slf4j}</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>

        <version>${version.logback}</version>
    </dependency>
</dependencies>

<properties>
    <version.logback>0.9.15</version.logback>
    <version.slf4j>1.5.8</version.slf4j>
</properties>
0
ответ дан 4 December 2019 в 02:50
поделиться

вы просмотрели log4j.NDC и MDC? Это, по крайней мере, позволяет вам помечать в журнале данные, относящиеся к конкретному потоку. Не совсем то, о чем вы спрашиваете, но может быть полезно. Здесь .

0
ответ дан 4 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: