将log4j2用于多个类

时间:2017-12-05 14:44:05

标签: java log4j

我找到了许多帮助我构建记录器的链接。一些在SO中,另一些在其他页面中。

这里的答案是:https://stackoverflow.com/questions/7624895/how-to-use-log4j-with-multiple-classes#=是我找到的最好的答案。 它已经有几年的历史了,现在有些东西是不同的。

我的目标是让所有java类共享一个记录器,将消息打印到日志,包括控制台和文件。

我正在使用LOG4J2:http://logging.apache.org/log4j/2.x/manual/configuration.html

主要()

import org.apache.logging.log4j.Logger;

public class App {
    private static final Logger LOGGER = Logger.getLogger("GLOBAL");
    public static void main(){
        ...calling other classes
  }
}

anyOtherClass

import org.apache.logging.log4j.Logger;
public class secondClass {
    private final Logger LOGGER = Logger.getLogger("GLOBAL");
    public void writeLog(){
      LOGGER.log(Level.INFO, "A simple string");
  }
}

的log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Properties>
        <Property name="basePath">/var/log</Property>
    </Properties>

    <Appenders>
        <RollingFile name="fileLogger" fileName="${basePath}/myApp.log" filePattern="${basePath}/myApp-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

       <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="java.util.logging.Logger" level="ALL" additivity="true">
            <appender-ref ref="fileLogger" level="ALL" />
        </Logger>
        <Root level="ALL" additivity="false">
            <appender-ref ref="console" />
        </Root>
    </Loggers>
</Configuration>

我(或多或少)知道我应该使用LogManager,事实是我应该把它称为:

private static final Logger logger = LogManager.getLogger(MyApp.class);

或者,在 main()中,可能是这样的:

private static Logger LOGGER = null;

@BeforeClass
public static void setLogger() {
    System.setProperty("log4j.configurationFile","log4j.xml");
    LOGGER = LogManager.getLogger();
}

因为,我相信,使用 LogManager 我可以将Log指向xml文件以获取其设置。 但是当我构建并运行它时,CLI rage退出了第一个LOG,报告:Exception in thread "main" java.lang.NullPointerException at myapp.modules.Database.<init>(Database.java:67)

预期结果: 我想要做的就是能够记录我的所有类,并将其写入文件。 我不能让这个工作。当我不使用LogManager时,我只在控制台上看到日志,但没有创建文件。 我正在使用Windows和Linux(这就是/ var / log /的原因,但我也将其更改为C:\)。

我用过的其他网站https://howtodoinjava.com/log4j2/configure-log4j2-for-junit/

Log4J loggers for different classes&lt; - 没有帮助我

..许多其他搜索结果已超过6年。

的pom.xml

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.10.0</version>
</dependency>

1 个答案:

答案 0 :(得分:2)

您在几个层面上出错了:您正在将JDK的记录器与Log4j2的记录器混合,您没有记录到几个appender等。

这是你应该做的:

/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>log4j2test</artifactId>
    <version>0.1</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.10.0</version>
        </dependency>
    </dependencies>
</project>

这基本上是唯一没有错误的地方。

/src/main/java/so47656300/App.java

package so47656300;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class App {

  private static final Logger logger = LogManager.getLogger(App.class);

  public static void main(String[] args) {
    logger.info("App.main - starting");
    new SecondClass();
    logger.info("App.main - ending");
  }
}

此处,您的错误是使用java.util.logger.Logger代替org.apache.logging.log4j.Logger

/src/main/java/so47656300/SecondClass.java

package so47656300;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SecondClass {

  private static final Logger logger = LogManager.getLogger(SecondClass.class);

  public SecondClass() {
    logger.info("SecondClass - starting");
    logger.info("SecondClass - ending");
  }
}

在这里,您的错误也是使用了错误的Logger类。仅使用org.apache.logging.log4j.*中的类。

/src/main/resources/log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="basePath">/var/log</Property>
    </Properties>
    <Appenders>
        <RollingFile name="fileLogger" fileName="${basePath}/myApp.log" filePattern="${basePath}/myApp-%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="console"/>
            <AppenderRef ref="fileLogger"/>
        </Root>
    </Loggers>
</Configuration>

此处,您的错误如下:

  1. 错误的文件名:Log4J 2 requires a name log4j2.xml。对于测试,请创建文件/src/test/resources/log4j2-test.xml
  2. 您只需要一个记录器,因此只使用一个:根目录。你创造了几个,但你不需要它们。
  3. 将追加者添加到记录器(Root-one)
  4. 输出

    控制台

    [INFO ] 2017-12-05 16:52:32.218 [main] App - App.main - starting
    [INFO ] 2017-12-05 16:52:32.221 [main] SecondClass - SecondClass - starting
    [INFO ] 2017-12-05 16:52:32.222 [main] SecondClass - SecondClass - ending
    [INFO ] 2017-12-05 16:52:32.222 [main] App - App.main - ending
    

    /var/log/myApp.log

    [INFO ] 2017-12-05 16:52:32.218 [main] App - App.main - starting
    [INFO ] 2017-12-05 16:52:32.221 [main] SecondClass - SecondClass - starting
    [INFO ] 2017-12-05 16:52:32.222 [main] SecondClass - SecondClass - ending
    [INFO ] 2017-12-05 16:52:32.222 [main] App - App.main - ending