Java log4j xml 配置错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19733116/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 19:47:33  来源:igfitidea点击:

log4j xml configuration error

javaxmlconfigurationlog4j

提问by Luke SpringWalker

Every time I compile with maven I get the following exception.

每次我用 maven 编译时,都会出现以下异常。

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /logs/jump_page.log (No such file or directory)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:136)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:223)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:295)
    at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:176)
    at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:191)
    at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:523)
    at org.apache.log4j.xml.DOMConfigurator.parseRoot(DOMConfigurator.java:492)
    at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:1006)
    at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:872)
    at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:778)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.apache.log4j.Logger.getLogger(Logger.java:104)
    at org.apache.commons.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:289)
    at org.apache.commons.logging.impl.Log4JLogger.<init>(Log4JLogger.java:109)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.apache.commons.logging.impl.LogFactoryImpl.createLogFromClass(LogFactoryImpl.java:1116)
    at org.apache.commons.logging.impl.LogFactoryImpl.discoverLogImplementation(LogFactoryImpl.java:914)
    at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:604)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:336)
    at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:310)
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<clinit>(SpringJUnit4ClassRunner.java:91)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.<init>(JUnit4TestSet.java:45)
    at org.apache.maven.surefire.junit4.JUnit4DirectoryTestSuite.createTestSet(JUnit4DirectoryTestSuite.java:56)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.locateTestSets(AbstractDirectoryTestSuite.java:96)
    at org.apache.maven.surefire.Surefire.createSuiteFromDefinition(Surefire.java:209)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:156)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997)
log4j:ERROR Either File or DatePattern options are not set for appender [FILE].

I have this configuration in my log4j.xml

我的 log4j.xml 中有这个配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- TOMCAT SERVER FILE -->
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
    debug="false">

    <!-- ============================== -->
    <!-- APPENDERS                      -->
    <!-- ============================== -->

    <appender name="FILE"
        class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="${catalina.base}/logs/jump_page.log" />
        <param name="Append" value="true" />
        <param name="Threshold" value="DEBUG" />
        <param name="DatePattern" value="'.'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <!-- The default pattern: Date Priority [Category] Message\n -->
            <param name="ConversionPattern"
                value="%d %-5p [%c{1}] [%t] [%x] %m%n" />
        </layout>
    </appender>

    <!-- ================================ -->
    <!-- CATEGORIES - APPLICATION LOGGING -->
    <!-- ================================ -->

    <!-- Limit the org.apache.commons category to INFO as its DEBUG is verbose -->
    <category name="net">
        <priority value="WARN" />
    </category>

    <category name="org.apache.commons">
        <priority value="WARN" />
    </category>

    <category name="org.springframework">
        <priority value="WARN" />
    </category>

    <!-- Setup the Travelocity categories -->
    <category name="com.travelocity">
        <priority value="INFO" />
    </category>





    <!-- ============================== -->
    <!-- ROOT CATEGORY                  -->
    <!-- ============================== -->
    <root>
        <priority value="INFO" />
        <appender-ref ref="FILE" />
    </root>

</log4j:configuration>

After searching a lot I always find the same answer about permissions, but it is no use in this situation.

经过大量搜索后,我总是找到关于权限的相同答案,但在这种情况下没有用。

It works when I use the absolute path.

当我使用绝对路径时它有效。

Plase, help!

普拉斯,帮助!

Thanks!

谢谢!

EDIT:

编辑:

I'm using tomcat 6.0

我正在使用 tomcat 6.0

-bash-3.00$ /opt/tomcat/instances/tomcat-8080/bin/startupDev.sh version
Using CATALINA_BASE:   /opt/tomcat/instances/tomcat-8080
Using CATALINA_HOME:   /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/instances/tomcat-8080/temp
Using JRE_HOME:       /usr/java

采纳答案by hthserhs

${catalina.base}is resolving to an empty string. Try using another environment variable or absolute path here:

${catalina.base}正在解析为空字符串。尝试在此处使用另一个环境变量或绝对路径:

<param name="File" value="${catalina.base}/logs/jump_page.log" />

回答by jlr

Please try out the following to diagnose this issue further and report it back in your question. Telling us on which platform you are would help also.

请尝试以下方法以进一步诊断此问题并在您的问题中报告。告诉我们您在哪个平台上也会有所帮助。

Enable debug output

启用调试输出

In your catalina.propertiesfile (located in the conffolder of your Tomcat installation, or /etc/tomcat?for Linux), please append this property to enable log4j debugging output.

在您的catalina.properties文件中(位于confTomcat 安装文件夹中,或/etc/tomcat?用于 Linux),请附加此属性以启用 log4j 调试输出。

log4j.debug=true

This should give you more hints on what's going wrong.

这应该会给你更多关于出了什么问题的提示。

Test the file path with static and complete path configuration

使用静态和完整路径配置测试文件路径

Also, while the catalina.basesystem property should be set in a Tomcat's environment, is this possible that log4j actually tries to access the /logsfolder from the filesystem root? As in, the catalina.basesystem property would not be set or considered? What happens if you put a complete and static path in your configuration?

此外,虽然catalina.base系统属性应该在 Tomcat 的环境中设置,但 log4j 实际上是否可能尝试/logs从文件系统根目录访问该文件夹?如在,catalina.base系统属性不会被设置或考虑?如果在配置中放置完整的静态路径会发生什么?