log4j 2 - 配置问题

Lee*_*Lee 12 java log4j2

我正在尝试配置log4j 2.0来报告日志.

我的配置保存为log4j2.xml,这是它的内容:

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration name="PRODUCTION" status="OFF">

    <appenders>
        <RollingFile name="MyFileAppender" 
            fileName="../Logs/app.log" 
            filePattern="../Logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    </appenders>

    <loggers>
        <root level="trace">
            <appender-ref ref="MyFileAppender"/>
        </root>
    </loggers>

 </configuration>
Run Code Online (Sandbox Code Playgroud)

它存在于项目的类路径中,我尝试将其放在许多其他目录中.

我在代码中创建了一个记录器,如下所示:

    Logger          logger = LogManager.getLogger(MyClass.class.getName());
    logger.info("test");
Run Code Online (Sandbox Code Playgroud)

没有写任何内容,也没有创建文件.当我调试代码时,我看到记录器是默认的记录器(控制台).

Man*_* SK 11

实际上这是一个直接的过程.Log4j 2的两个主要类如下所示,您需要像这样导入:

    import org.apache.logging.log4j.LogManager
    import org.apache.logging.log4j.Logger
Run Code Online (Sandbox Code Playgroud)

现在Logger使用此代码获取实例.

    private static final Logger logger = LogManager.getLogger();
Run Code Online (Sandbox Code Playgroud)

注意我没有将getLogger()方法的类名指定为参数.Log4j 2自动识别出来.

现在您可以使用该类中的任何info(), trace(), debug(), warn(), error(), fatal()方法Logger.但要获得所有这些方法的输出,您需要一个XML配置文件.默认情况下,Log4j 2仅生成error() and fatal()方法的输出.

配置文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <File name="MyCustomLogFile" fileName="/home/me/mylogfile.log">
                <PatternLayout>
                    <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
                </PatternLayout>
            </File>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Root level="all">
                <AppenderRef ref="MyCustomLogFile"/>
                <!--<AppenderRef ref="Console"/>-->
            </Root>
        </Loggers>
    </Configuration>
Run Code Online (Sandbox Code Playgroud)

在任何地方保存此文件的任何名称.我使用Log4j2.xml作为名称.现在,您需要将此文件放在类路径中,您可以通过在运行程序时传递系统属性来执行此操作,如下所示:

    java -Dlog4j.configurationFile=/path/to/xml/configuration/file/Log4j2.xml MyMainClass
Run Code Online (Sandbox Code Playgroud)

而你已经做到了.记录将立即在您的控制台上.

特别说明:

  • 在XML文件中,我提供了2个a​​ppender:一个文件和一个控制台.您可以看到,您只需要取消注释已注释的AppenderRef标记,以便在文件而不是控制台中输出.

  • 您还可以提供环境变量作为系统属性.Log4j 2将首先从环境变量读取配置文件,然后在-D参数中读取环境变量.

享受日志记录.:-)


小智 8

放置log4j2.xml文件src/main/resources.有用


Lee*_*Lee -2

好的,我解决了问题。我必须在 xml 中指定 package="myPackage"

  • 您的意思是“packages”作为“configuration”根元素的属性吗?像这样`&lt;?xml version="1.0"encoding="UTF-8"?&gt; &lt;configuration name="myproject"packages="my.package"monitorInterval="30"&gt;&lt;!-- ... --&gt; &lt;/配置&gt;` (2认同)