Log4J Verzeichnis der Log-Datei konfigurieren

grindelaner

Bekanntes Mitglied
Hallo,

in der Log4J.xml stellt man ein, wo die log-datei hingeschrieben werden soll....
[XML]
...
<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="logVerzeichnis/log.log"/>
...
</appender>
...
[/XML]

Kann man diese Einstellung, also wo die Log-Datei hingeschrieben werden soll, auch woanders definieren?
Ich möchte gerne diese Einstellung in einer properties-Datei hinterlegen.

ist das Möglich?
 
Ja. Du kannst in deinem Programm über
Code:
PropertyConfigurator.configure()
(oder
Code:
configureAndWatch()
) Properties angeben die den (log4j-)Logger für dieses Programm konfigurieren. Die Properties sind dann auch ähnlich konfigurierbar wie die XML-Datei, haben aber natürlich ein anderes Format. Einfach mal nach dem Stichwort googlen.
 
Kann man diese Einstellung, also wo die Log-Datei hingeschrieben werden soll, auch woanders definieren?
Ich möchte gerne diese Einstellung in einer properties-Datei hinterlegen.

ist das Möglich?

Möglich aber unpraktisch. Am sinnvollsten ist es, die Logdateien werden relativ sinnvoll abgelegt, somit ganz ohne zusätzliche Konfiguration.
Wenn es nicht relativ sein soll, dann würde ich z.B. über symbolische Links arbeiten.
Auf jeden Fall ist es nervig, wenn man sich erst mal die Logdateien suchen muss, weil nicht einfach ersichtlich ist, wo diese liegen. Außerdem kann es viel leichter zu Problemen mit Berechtigungen kommen.
 
Vielen Dank für die Hilfe mit PropertyConfigurator!

Ich habe das nun so gelöst, dass bevor Log4J initialisiert wird in die System.properties() eine neue Property hineingeschrieben wird. Diese kann ich dann in der log4j.xml verwenden :applaus:
 
Vielen Dank für die Hilfe mit PropertyConfigurator!

Ich habe das nun so gelöst, dass bevor Log4J initialisiert wird in die System.properties() eine neue Property hineingeschrieben wird. Diese kann ich dann in der log4j.xml verwenden :applaus:

Setzt du das Property im Programmcode? Dann hast du u.U. bald mit Zitronen gehandelt. Wenn ein Logger static in einer Klasse definiert ist wird log4j genau in dem Moment initialisiert, in dem dieser Logger instanziiert wird, also wenn die Klasse geladen wird. Das kann sein, bevor das Property programmatisch gesetzt ist.
 
Was meinst du damit?

Ist es nicht so, dass bevor ich das erste Mal den Logger aufrufe ich genügend Zeit habe die System.Properies zu setzen?

...Wenn ein Logger static in einer Klasse definiert ist wird log4j genau in dem Moment initialisiert, in dem dieser Logger instanziiert wird, also wenn die Klasse geladen wird...

Du meinst also Log4J kann eventuell schon beim Hochfahren der Java-VM initialisiert werden, weil der Logger static ist...? Ich dachte die Klasse wird erst initialisiert, sobald sie das erste Mal angesprochen wird...

Das bedeutet also, dass das nun auf meinem Rechner funktioniert ist Glück und es könnte sein, dass es auf einem anderen Rechner nicht funktioniert?
 
Nein, ganz so ist es nicht.

Es kann sein, dass dieser Trick irgendwann in der Zukunft nicht mehr funktioniert. Man muss also in Zukunft bei der Weiterentwicklung bzw. Wartung immer daran denken, dass dies wichtig ist.
Je nachdem ob z.B. eine Fremdlibrary auch log4j verwendet und u.U. vor dir das erste mal einen Logger verwendet.
Relativ sicher könnte es sein, wenn du möglichst früh (z.B. statischer Initializer der Main-Klasse) explizit die Initialisierung vornimmst und das Property setzt.
 
Dank dir. Das muss ich mir dann noch einmal genauer anschauen.

Als Alternative gäbe es statt log4j.xml eine log4j.properties zu verwenden... oder kann man auch eine Mischung von beiden verwenden, wobei die Datei log4j.properties nicht zwingend so heißen muss?
 
Weder die XML Datei, noch die Properties-Datei muss so heißen. Den Namen und den Ort kann über ein Sytemproperty setzen. Die Propertiesdatei ist der "legacy" Modus, die alter Variante, wie man log4j konfigurieren konnte.
 

Neue Themen


Zurück
Oben