1

我的问题是我正在尝试设置 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 加载

任何帮助表示赞赏,

提前致谢

4

0 回答 0