Java 动态命名log4j日志文件-工作正常,但setFile()中也有例外

Java 动态命名log4j日志文件-工作正常,但setFile()中也有例外,java,logging,log4j,Java,Logging,Log4j,我有一个为个人客户运行的程序。每个客户都有一个帐户代码(我们称之为起始代码)。帐户代码通过命令行参数与程序通信。我得到了下面的异常,对了,它不会导致程序崩溃,它会很顺利地运行。我想按客户帐户分离日志记录,这似乎是可行的。我的日志文件将被创建为“Balancer_990004.log”,日志消息肯定会累积到创建Balancer_990004.log.7的点,但并非没有此异常。这件事让我抓狂。我已经包括了log4j.properties位和代码位 log4j:ERROR setFile(null,t

我有一个为个人客户运行的程序。每个客户都有一个帐户代码(我们称之为起始代码)。帐户代码通过命令行参数与程序通信。我得到了下面的异常,对了,它不会导致程序崩溃,它会很顺利地运行。我想按客户帐户分离日志记录,这似乎是可行的。我的日志文件将被创建为“Balancer_990004.log”,日志消息肯定会累积到创建Balancer_990004.log.7的点,但并非没有此异常。这件事让我抓狂。我已经包括了log4j.properties位和代码位

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);
log4j:错误setFile(null,true)调用失败。
java.io.FileNotFoundException:(路径名中的文件或目录不存在。)
位于java.io.FileOutputStream.openAppend(本机方法)
位于java.io.FileOutputStream。(FileOutputStream.java:203)
位于java.io.FileOutputStream。(FileOutputStream.java:127)
位于org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
位于org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:207)
位于org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
位于org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
位于org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
位于org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
位于org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:809)
位于org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:735)
位于org.apache.log4j.PropertyConfigurator.parsecatsandrenders(PropertyConfigurator.java:639)
位于org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:504)
位于org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:547)
在org.apache.log4j.helpers.OptionConverter.selectAndConfigure上(OptionConverter.java:483)
登录org.apache.log4j.LogManager(LogManager.java:127)
位于java.lang.J9VMInternals.initializeImpl(本机方法)
在java.lang.J9VMInternals.initialize(J9VMInternals.java:200)中
位于org.apache.log4j.Logger.getLogger(Logger.java:117)
在均衡器上。(Balancer.java:292)
位于Balancer.main(Balancer.java:2370)
***log4j.properties中的示例位。所讨论的Java程序的名称是“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.patternalyout
log4j.appender.BalancerLog.layout.ConversionPattern=%5p%d[%t](%F:%L)-(m%n
***如何生成日志文件名并初始化记录器***
公共类平衡器{
静态记录器日志=null;
....
//在构造函数中。。。
StringBuilder logName=新StringBuilder(“平衡器”);
append(startCode.toString());
logName.append(“.log”);
//希望在log4j.properties中,我们的appender部分包含以下内容:
//log4j.appender.BalancerLog.File=${balancer.log}。此${}位表示获取系统属性以设置日志文件
//我们在这里设置该系统属性,然后初始化Logger对象。
setProperty(“balancer.log”,logName.toString());
//这是异常跟踪中的第292行。
log=Logger.getLogger(Balancer.class);

如果您可以切换到logback,我建议您改为使用。这种对log4j的调整是不自然的。

我发现了为什么我从setFile()中获得异常。可能这在.properties log4j配置中不受支持,我必须使用XML方法,但是如果我设置了“.File”属性与使用系统属性的推荐语法一起,我得到了错误(即使它仍然可以继续工作)。例如:

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
告诉我错误。返回标准:

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
和“alle ist klar herr kommissar”。因此,我暂时使用此代码块,直到我找到更好的解决方案。目前,配置将依赖于此程序的appender名称“BalancerLog”


请随意对此进行分析并提出建议。顺便说一句,在这里使用log4j 1.2。

看起来您正在尝试在设置环境变量之前访问日志

此代码将在不进行单个日志调用的情况下失败:

class Whatever {
    private static Logger log = Logger.getLogger(Whatever.class)
    public Whatever() {
        System.setProperty("balancer.log","C:\\log.txt")
    }
}
这样做:

class Whatever {
    private static Logger log = null
    public Whatever() {
        System.setProperty("balancer.log","C:\\log.txt")
        log = Logger.getLogger(Whatever.class)
    }
}

基本思想是在正确设置环境变量之前,不要对日志系统执行任何操作。

感谢您提供的
roll.activateOptions()
提示!
class Whatever {
    private static Logger log = null
    public Whatever() {
        System.setProperty("balancer.log","C:\\log.txt")
        log = Logger.getLogger(Whatever.class)
    }
}