【问题标题】:Java Apache Log4j log4j.xml config multiple errorJava Apache Log4j log4j.xml 配置多个错误
【发布时间】:2019-10-19 11:03:40
【问题描述】:

我想以前可能有人问过。但它有一些关于如何使用该属性的额外问题。这是我的 log4j.xml。 :-

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
   <Properties>
      <Property name="myinfo">INFO</Property>
      <Property name="mywarn" value="WARN"/>
  </Properties>

<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <param name="threshold" value="info" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level Line: %L  - %msg%n" />
    </layout>
</appender>


<appender name="LOGFILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="c:/temp/logfile.log" />
    <param name="Append" value="true" />
    <param name="MaxFileSize" value="2MB" />
    <param name="MaxBackupIndex" value="2" />
    <priority value="WARN" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level Line: %L  - %msg%n" />
    </layout>
</appender>


<appender name="UNMAPFILE" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="c:/temp/unmapped.log" />
    <param name="Append" value="true" />
    <param name="MaxFileSize" value="2MB" />
    <param name="MaxBackupIndex" value="2" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern"
               value="%d [%t] %-5p %c - %m%n" />
    </layout>
</appender>


<category name="com.ma.dev" additivity="false">
    <priority value="INFO" />  <!-- <priority value="${myinfo}" /> --> 
    <appender-ref ref="STDOUT" />
    <appender-ref ref="LOGFILE" />
</category>


<root>
    <priority value="WARN" />
    <appender-ref ref="UNMAPFILE" />
</root>

  </Configuration>

这是我的 Java 代码:-

包 com.ma.dev;

import org.apache.log4j.Logger;

public class App 
{
    public static Logger logger = Logger.getLogger(App.class.getName());
    public static void main( String[] args )
    {
        logger.info("test");
        System.out.println( "Hello World!" );
        logger.warn("Dummy warning");
    }
}

我收到以下错误/警告:-

log4j:WARN Continuable parsing error 2 and column 16
log4j:WARN Document root element "Configuration", must match DOCTYPE root "null".
log4j:WARN Continuable parsing error 2 and column 16
log4j:WARN Document is invalid: no grammar found.
log4j:ERROR DOM element is - not a <log4j:configuration> element.
log4j:WARN No appenders could be found for logger (com.ma.dev.App).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hello World!

Process finished with exit code 0

在 log4j.xml 文件中我有这个属性:-

<Properties>
     <Property name="myinfo">INFO</Property>
     <Property name="mywarn" value="WARN"/>
</Properties>

我想使用此属性将优先级更改为:-

 <priority value="${myinfo}" />

有可能吗?

【问题讨论】:

    标签: java configuration log4j


    【解决方案1】:

    您似乎尝试混合使用 Log4j 1.x 和 2.x 配置。

    如果你想使用 Log4j 2.x,你应该在你的类路径中创建 log4j2.xml。 简单的例子:

        <?xml version="1.0" encoding="UTF-8"?>
        <Configuration status="WARN">
           <Properties>
             <Property name="priorityLevel">warn</Property>
           </Properties>
           <Appenders>
              <Console name="myConsole" target="SYSTEM_OUT">
                 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
              </Console>
           </Appenders>
           <Loggers>
              <Root level="${priorityLevel}">
                 <AppenderRef ref="myConsole"/>
              </Root>
           </Loggers>
        </Configuration> 
    

    此外,您的类路径中应该有 log4j-api-2.12.1.jar 和 log4j-core-2.12.1.jar,然后您就可以使用它了。

    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class App
    {
       private static final Logger logger = LogManager.getLogger(App.class.getName());
    
       public static void main(String[] args)
       {
          logger.info("test");
          System.out.println( "Hello World!" );
          logger.warn("Dummy warning");
       }
    }
    
    

    更多详情您可以找到here

    【讨论】:

    • 感谢您的回答。但我得到了这个错误: - 错误 StatusLogger 没有找到 Log4j 2 配置文件。使用默认配置(仅将错误记录到控制台)或用户以编程方式提供的配置。设置系统属性“log4j2.debug”以显示 Log4j 2 内部初始化日志记录。好像缺少配置文件。但它是 maven 项目,我将此文件添加到资源文件夹中。为了确保,我做了一个包并检查了 jar 的内容。我可以在 jar 中看到 log4j。那我误用了什么?
    • 正如我所说,log4j2.xml 应该在您的类路径中。可以看简单的例子here
    【解决方案2】:

    您收到这些错误是因为您没有在 DOCTYPE 元素中包含 log4j 命名空间。您的文件顶部应如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        ...
    

    至于你的第二个问题,我不太确定这是否可能。

    【讨论】:

    • 只是……?请给出全名什么是命名空间?
    • 对不起,由于某种原因,它的格式很奇怪,我刚刚编辑了帖子
    • 这是什么log4j.dtd
    • log4j 的文档类型定义文件。 DTD 定义了 XML 文档 (w3schools.com/xml/xml_dtd.asp) 的结构、合法元素和属性。
    • 谢谢,它成功了。所以我猜这个 log4j.dtd 来自系统含义 log4j 库。是这样吗?也许,我必须为这个属性提出另一个问题,或者等待一段时间,如果有人可以回答这个属性问题。
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 2015-12-05
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    相关资源
    最近更新 更多