Dynamisch benennen log4j-log-Datei - Funktioniert, aber nicht ohne Ausnahme aus setFile()
Ich habe ein Programm, dass ausgeführt wird, für den einzelnen Kunden. Jeder Kunde hat ein Konto code (nennen wir es einen start-code). Der Konto-code wird übermittelt, um das Programm über Kommandozeilen-parameter. Ich bin immer folgende exception geworfen auf mich zurück, die durch die Art und Weise, nicht zum Absturz führen, es geht fröhlich auf seinem Weg. Ich will trennen Sie die Protokollierung von Kunden-Konto, das scheint zu funktionieren. Meine log-Datei wird erstellt, um "Balancer_990004.log" und log-Meldungen, die sicherlich zu bauen bis zu dem Punkt, der Balancer_990004.log.7 erstellt, ABER nicht ohne diese Ausnahme. Kratzen meinen Kopf auf diese. Ich habe log4j.Eigenschaften bits und bits von code.
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: (A file or directory in the path name does not exist.)
at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:203)
at java.io.FileOutputStream.<init>(FileOutputStream.java:127)
at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:207)
at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:809)
at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:735)
at org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.java:639)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:504)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:547)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483)
at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
at org.apache.log4j.Logger.getLogger(Logger.java:117)
at Balancer.<init>(Balancer.java:292)
at Balancer.main(Balancer.java:2370)
*** Sample bit from log4j.properties. The name of the Java program in question is "Balancer" ***
log4j.rootLogger=debug, devnull
log4j.logger.Balancer=info, BalancerLog
log4j.appender.BalancerLog=org.apache.log4j.RollingFileAppender
log4j.appender.BalancerLog.File=${balancer.log}
log4j.appender.BalancerLog.MaxFileSize=10000KB
log4j.appender.BalancerLog.MaxBackupIndex=10
log4j.appender.BalancerLog.layout=org.apache.log4j.PatternLayout
log4j.appender.BalancerLog.layout.ConversionPattern=%5p %d [%t] (%F:%L) - %m%n
*** How I'm building my log filename and initializing the Logger ***
public class Balancer {
static Logger log = null;
....
//In constructor...
StringBuilder logName = new StringBuilder("Balancer_");
logName.append(startCode.toString());
logName.append(".log");
//Hopefully in log4j.properties our appender section contains this line:
//log4j.appender.BalancerLog.File=${balancer.log}. This ${} bit means to get a system property to set the log file
//name. We set that system property here, then initialize the Logger object.
System.setProperty("balancer.log", logName.toString());
//This is line 292 in the exception trace.
log = Logger.getLogger(Balancer.class);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wechseln können, logback, schlage ich vor, Sie SiftingAppender statt. Diese Art von tweaking mit log4j ist unnatürlich.
Ich fand heraus warum ich war immer die Ausnahme von setFile(). Das ist vielleicht nicht unterstützt .Eigenschaften log4j-Konfiguration und ich habe die Verwendung der XML-Methode, aber wenn ich einen ".Datei" - Eigenschaft mit der empfohlenen syntax für die Verwendung einer system-Eigenschaft, bekomme ich die Fehlermeldung (obwohl es voran geht und funktioniert trotzdem). Zum Beispiel:
Gibt mir die Fehlermeldung. Gehen Sie zurück zu der standard:
und "alle ist klar herr kommissar". Also, ich bin mit diesem code-block für den moment, bis ich erarbeite eine bessere Lösung. Für den moment wird die Konfiguration verlassen Sie sich auf die appender name für dieses Programm "BalancerLog".
Fühlen Sie sich frei zu wählen, diese auseinander und machen Vorschläge. BTW, mit log4j 1.2 hier.
roll.activateOptions()
Tipp!Es sieht aus wie Sie versuchen, auf das Protokoll zuzugreifen, bevor die Umgebungsvariable gesetzt ist.
Dieser code wird nicht ohne einen einzigen log-Aufruf:
Also:
Die grundlegende Idee ist, nichts zu tun an alle mit dem logging-system, bevor Sie die Umgebungsvariablen richtig gesetzt sind.