Log4J-Frage

tklein22000

Grünschnabel
Hallo,

ich habe eine Anwendung, die Log4J für das Logging benutzen soll. Diese Anwendungbenutzt auch Hibernate als Persistenzframework, welches praktischerweise auch Log4J für das Logging benutzt.
Ich würde gerne zwei getrennte Log-Dateien haben - eine Loddatei für die applikationsspezifischen Logs und eine Datei für das Hibernate-Logging. Nur wie muss ich hierzu die log4j.propoerties konfigurieren?
Momentan habe ich es so, aber es werden damit nicht zwei Logdateien angelegt:
PHP:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/hibernate.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.rootLogger=info, stdout

### Log4J configuration for logging to file
log4j.appender.MeinDaRoFiAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.MeinDaRoFiAppender.datePattern='.'yyyy-MM-dd
log4j.appender.MeinDaRoFiAppender.file=c:/ApplLog.log
log4j.appender.MeinDaRoFiAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.MeinDaRoFiAppender.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c: %m%n


### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout, MeinDaRoFiAppender

log4j.logger.org.hibernate=info
log4j.logger.org.hibernate=debug
Mit dieser Konfiguration wird aber alles in die Datei c:/ApplLog.log geschrieben und die Datei c:/hibernate.log wird gar nicht angelegt...

Danke für Eure Hilfe
TMK
 
Erstmal solltest du vielleicht den rootLogger nicht zweimal in deiner Konfigurationsdatei angeben.

Wenn du nun die hibernate Sachen mit dem bereits von dir angelegten Appender Loggen willst, so kannst du das mit
PHP:
log4j.logger.org.hibernate=info, file
machen.

Wenn du das selbe ConversionPattern zweimal benutzen möchtest, kannst du dies auch als Variable anlegen um es nur einmal ändern zu müssen:
PHP:
pattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
....
log4j.appender.stdout.layout.ConversionPattern=${pattern}
 ...
log4j.appender.file.layout.ConversionPattern=${pattern}
 
Danke für deine Antwort!

PHP:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/hibernate.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n


### Log4J configuration for logging to file
log4j.appender.MeinDaRoFiAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.MeinDaRoFiAppender.datePattern='.'yyyy-MM-dd
log4j.appender.MeinDaRoFiAppender.file=c:/ApplLog.log 
log4j.appender.MeinDaRoFiAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.MeinDaRoFiAppender.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c: %m%n


### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=ALL, MeinDaRoFiAppender

log4j.logger.org.hibernate=info, debug, file

Ich habe meine log4J.properties jetzt wie oben beschrieben. Die Hibernate-Logs werden jetzt zwar in die datei c:\hibernate.log geschrieben, jedoch auch weiterhin in meine andere Logdatei.
Mein zweites Problem ist, dass ich anscheinend keine Logs in die Datei schreiben kann, deren level DEBUG ist. An was liegt das?

(Das mit dem ConversionPattern erledige ich noch...)
 
Du hast dort unten info, debug, file stehen.

Du musst dich schon zwischen info oder debug entscheiden, dann klappt das auch wie gewünscht.

Also für debug:
PHP:
log4j.logger.org.hibernate=debug, file

Wie du es schaffst dass du die Hibernate-Ausgaben nur in das eine Log bekommst weiss ich jedoch nicht.
 
Nein, da die Level hierarchisch angeordnet sind und man nur einen Schwellwert angeben kann ab dem geloggt werden soll.

Ich weiss nicht ob es geht den hibernate logger auf warn zu stellen und nur im Appender den Threshold auf debug o.ä. zu stellen:

PHP:
log4j.logger.org.hibernate=warn, file

log4j.appender.file.Threshold=debug

Hab gerade nicht so viel Zeit dass selbst zu testen.
 
Hallo,

Ist es möglich, für jeden Log-Level eine eingene Log-Datei zu nehmen?
Ich hab noch nicht soviel mit Log4J gemacht, aber ich hab mal gelesen, dass das funktioniert. Ich schau mal ob ich es wieder finde, dann sag ich bescheid.

MFG

zEriX
 
Ja ich hab nicht an die Filter gedacht. Es gibt tatsächlich einen LevelMatchFilter mit welchem es möglich ist nur bestimmte Level zuzulassen. Soviel ich weiss kann man diese aber nur in XML und nicht im Properties Format konfigurieren.

Ja ein Beispiel hat zerix ja nun schon gefunden. Vielleicht gab es dort den LevelMatchFilter noch nicht:

Code:
<filter class="org.apache.log4j.varia.LevelMatchFilter">
<param name="LevelToMatch" value="info" />
<param name="AcceptOnMatch" value="true" />
</filter>
 
Zuletzt bearbeitet:
Danke, ich habe es jetzt mit der Filter-Möglichkeit in der XML-Konfigurationsvariante gelöst.
So kann ich wenigstens die Unmengen an Debug-Meldungen vom Tomcat von meinen eigenen Log-Meldungen trennen.
Es wäre zwar auch schön wenn man den Tomcat dazu bewegen könnte, keine Debug-Meldungen mehr zu produzieren, auf der anderen Seite aber sind sie später vielleicht auch ganz nützlich wenn das System mal länger am laufen ist und evtl. Probleme mit dem Tomcat auftauchen.
 
Zurück