我的问题是我正在尝试设置 log4j 以从我的 jar 登录到文件。此 jar 由已使用 log4j 的应用程序使用。我的 jar 是作为 log4j 附带的 maven 包制作的。我正在尝试从属性文件初始化 log4j,如下所示:
“log4j.properties”
log4j.appender.FileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.FileAppender.File=${user.home}/.myproject/myproject.log
log4j.appender.FileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.FileAppender.layout.ConversionPattern=%d{yy-MM-dd HH:MM:ss,SSS} [%t] %-5p %c %x - %m%n
log4j.appender.FileAppender.MaxFileSize=5MB
#myproject is full package name
log4j.logger.myproject=,FileAppender
我已将此属性文件包含在我的 jar 资源中。我正在用代码加载它:
try {
InputStream inputStream = this.getClass().getClassLoader()
.getResourceAsStream("log4j.properties");
Properties properties = new Properties();
properties.load(inputStream);
inputStream.close();
PropertyConfigurator.configure(properties);
} catch (NullPointerException e) {
BasicConfigurator.configure();
throw new MyprojectException("log4j.properties not found", e);
} catch (IOException e) {
throw new MyprojectException("log4j.properties could not be loaded", e);
}
当使用 log4j 的应用程序不使用我的 jar 时,此代码可以完美运行。但它是,我得到一个空的日志文件,或者在某些应用程序的某些情况下,根本没有创建日志文件。
我尝试手动添加附加程序,而不是像这样使用 propertyconfigurator:
static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(Myproject.class);
SimpleLayout layout = new SimpleLayout();
FileAppender appender = new FileAppender(layout,"C:/out.log",true);
logger.addAppender(appender);
logger.setLevel(Level.DEBUG);
这似乎工作正常,但我真的想从属性文件配置 log4j。
我已经阅读了很多关于 log4j 如何处理多个实例的线程。我发现一旦由一个应用程序完成,我就无法更改属性加载的 log4j 配置。有些人建议我将发布我自己的 log4j jar 和配置并使用 propertyconfigurator 进行配置,这就是我尝试过的,你可以看到它没有用。我很好奇为什么我的第二个例子有效而第一个无效。我怎么解决这个问题?
注意:
我不想更改使用我的 jar 文件的应用程序的 log4jconfigs。我还发现可以使用 -Dlog4j.configuration 系统属性,但是我的 jar 不是可执行的 jar 文件,它由 Class.forName 加载
任何帮助表示赞赏,
提前致谢