2013-05-15 8 views
11

Ich habe die folgenden zwei Pakete:Verwenden von Log4J 1. *, wie kann ich zwei Pakete in zwei separate Dateien schreiben?

com.mycorp.project.first
com.mycorp.project.second

I Log4J (SLF4J) möchte konfigurieren, dass die Protokolle von einem Paket zu schreiben zu einer Datei und von dem anderen Paket zu einer zweiten Datei. Ich möchte nicht, dass sie zusammen gemischt werden.

Um klar zu sein, ist dies ein Projekt/ein Prozess läuft.

Ich habe versucht zu filtern und mit Loggern, aber sie scheinen von log4j ignoriert werden. Beide Dateien sind immer identisch.

Edit: Vielen Dank für die Antworten bis jetzt, das ist, was ich habe und es funktioniert nicht. Beide Ausgabedateien sind identisch.

<configuration debug="true"> 
<contextName>dev</contextName> 

<appender name="FIRST_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>A:/dev/LogTesting/logs/first.log</file> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>INFO</level> 
    </filter> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>A:/dev/LogTesting/logs/first.%d{yyyyMMdd}%d{_HHmmss,aux}.log.gz</fileNamePattern> 
    </rollingPolicy> 
    <encoder> 
     <pattern>%d{MMM dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
</appender> 

<appender name="SECOND_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>A:/dev/LogTesting/logs/second.log</file> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>INFO</level> 
    </filter> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>A:/dev/LogTesting/logs/second.%d{yyyyMMdd}%d{_HHmmss,aux}.log.gz</fileNamePattern> 
    </rollingPolicy> 
    <encoder> 
     <Pattern>%d{MMM dd HH:mm:ss.SSS} %property{HOSTNAME} [%thread] %level %logger{36} %msg%n</Pattern> 
    </encoder> 
</appender> 

<!-- =============================================================== --> 
<logger name="com.test.apples" additivity="false"> 
    <level value="DEBUG" /> 
    <appender-ref ref="FIRST_FILE" /> 
</logger> 

<logger name="com.test.oranges" additivity="false"> 
    <level value="DEBUG" /> 
    <appender-ref ref="SECOND_FILE" /> 
</logger> 
<!-- =============================================================== --> 

<category name="com.test.apples" additivity="false"> 
    <priority value="DEBUG"/> 
    <appender-ref ref="FIRST_FILE"/> 
</category> 

<category name="com.test.oranges" additivity="false"> 
    <priority value="DEBUG"/> 
    <appender-ref ref="SECOND_FILE"/> 
</category> 

<!-- =============================================================== --> 

<!-- default --> 
<root level="WARN"> 
    <appender-ref ref="FIRST_FILE" /> 
    <appender-ref ref="SECOND_FILE" /> 
</root> 

Antwort

21

Versuchen Sie dies das Beispiel von Eigenschaften ist file:

log4j.rootLogger=DEBUG, CONSOLE 
# Each package has different appender name  
log4j.logger.com.mycorp.project.first=DEBUG, FIRST 
log4j.logger.com.mycorp.project.second=DEBUG, SECOND 

log4j.appender.FIRST=org.apache.log4j.RollingFileAppender 
log4j.appender.FIRST.File=./first.log 
log4j.appender.FIRST.layout=org.apache.log4j.PatternLayout 

log4j.appender.SECOND=org.apache.log4j.RollingFileAppender 
log4j.appender.SECOND.File=./second.log 
log4j.appender.SECOND.layout=org.apache.log4j.PatternLayout 

oder dieser für XML (nur wichtigen Teil markieren):

<!-- FIRST appender definition --> 
<appender name="FIRST" class="org.apache.log4j.FileAppender"> 
    ... 
</appender> 

<!-- SECOND appender definition --> 
<appender name="SECOND" class="org.apache.log4j.FileAppender"> 
    ... 
</appender> 

<!-- logger package com.mycorp.project.first --> 
<logger name="com.mycorp.project.first"> 
    <level value="DEBUG" /> 
    <appender-ref ref="FIRST"/> 
</logger> 

<!-- logger for package com.mycorp.project.second --> 
<logger name="com.mycorp.project.second"> 
    <level value="DEBUG" /> 
    <appender-ref ref="SECOND"/> 
</logger> 
+0

Sorry, ich vergaß zu erwähnen, ich eine XML-Konfigurationsdatei haben. Was ist das Äquivalent in XML? log4j.logger.com.mycorp.project.first = DEBUG, FIRST – Csaba

+0

Siehe meine aktualisierte Antwort. Möge es für dich nützlich sein! –

+0

Ich habe zwei Fragen dazu: 1. Wenn der Unterschied zwischen Appendern nur der Dateiname ist, gibt es eine Möglichkeit, die gemeinsamen Eigenschaften einmal (XML) zu definieren, um Redundanz zu vermeiden? 2. Ist es möglich, einen Logger mehreren Paketen zuzuordnen? – clicky

1

dynamiclly Pfad .in log4j.properties Datei setzen

log4j.appender.FILE.File=${file.name} 

Und in Java Set Dateipfad System.setProperty("file.name", FILEPATH);

+0

+1 für dynamisch den Pfad zu aktualisieren .. Danke – LMSingh

2

Erstellen Sie zwei Appen LOG1 und LOG2, eine für jede Protokolldatei . Danach definieren Sie zwei Kategorien (eine für jedes Paket) mit Bezug auf diese Appender in der Log4j-Konfigurationsdatei.

<category name="com.mycorp.project.first" additivity="true"> 
    <priority value="TRACE"/> 
    <appender-ref ref="LOG1"/> 
</category> 

Appender2

<category name="com.mycorp.project.second" additivity="true"> 
    <priority value="TRACE"/> 
    <appender-ref ref="LOG2"/> 
</category> 


0

Sie geben nur 2 Appender an, geben aber für beide den gleichen Namen der Ausgabedatei.

#same appender for both packages 
log4j.logger.package1=INFO,MyCommonLogger  
log4j.logger.package2=INFO,MyCommonLogger 

log4j.appender.MyCommonLogger=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.MyCommonLogger.layout=org.apache.log4j.PatternLayout 
log4j.appender.MyCommonLogger.layout.ConversionPattern=%t %d{MM/dd/yy HH:mm:ss} %x %-5p %c %M - %m%n 

#single log file for logs from both packages 
log4j.appender.MyCommonLogger.File=/somewhereonserver/log/mysinglelogfile.log 
Verwandte Themen