Java 对多个类使用log4j2

Java 对多个类使用log4j2,java,log4j,Java,Log4j,我发现了许多帮助我构建记录器的链接。有些在SO中,有些在其他页面中 这里的答案是:这是我找到的最好的答案。 这已经是多年前的想法了,现在有些事情已经不同了 我的目标是在所有java类中共享一个记录器,这些java类将消息打印到日志中,包括控制台和文件。 我正在使用LOG4J2: main(): import org.apache.logging.log4j.Logger; public class App { private static final Logger LOGGER = L

我发现了许多帮助我构建记录器的链接。有些在SO中,有些在其他页面中

这里的答案是:这是我找到的最好的答案。 这已经是多年前的想法了,现在有些事情已经不同了

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

我正在使用LOG4J2:

main()

import org.apache.logging.log4j.Logger;

public class App {
    private static final Logger LOGGER = Logger.getLogger("GLOBAL");
    public static void main(){
        ...calling other classes
  }
}
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");
  }
}
<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>
任何其他类别

import org.apache.logging.log4j.Logger;

public class App {
    private static final Logger LOGGER = Logger.getLogger("GLOBAL");
    public static void main(){
        ...calling other classes
  }
}
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");
  }
}
<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>
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>
或者,在main()中,可能如下所示:

private static Logger LOGGER = null;

@BeforeClass
public static void setLogger() {
    System.setProperty("log4j.configurationFile","log4j.xml");
    LOGGER = LogManager.getLogger();
}
因为,我相信,使用LogManager,我可以将日志指向xml文件进行设置。 但当我构建并运行它时,CLI会在第一个日志中退出,并在myapp.modules.Database.(Database.java:67)的线程“main”java.lang.NullPointerException中报告:
Exception

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

我使用的其他网站


您在几个级别上都错了:您将JDK的记录器与Log4j2的记录器混用,您没有登录到多个appender,等等

以下是您应该做的:

/pom.xml

4.0.0
com.example
. 对于您的测试,创建一个文件
/src/test/resources/log4j2 test.xml
  • 您只需要一个记录器,所以只使用一个:根记录器。您创建了几个,但不需要它们
  • 将附加器添加到记录器(根附加器)
  • 输出 安慰
    /var/log/myApp.log

    当使用Log4j2时,大多数日志导入应该引用这个包中的类
    org.apache.logging.log4j
    。我想问题就在那里。@neomega抱歉我忘了复制它,我已经在使用它了。Netbeans会在我错过某些东西时警告我。我正在使用
    import java.util.logging.Logger和POM被编辑为使用log4j api和log4j core->2.10。0@neomega我现在明白你的意思了!我在检查我的错误是否在这里。谢谢在你写之前,我已经把你说的一切都做了!由于我问题下面的评论,我意识到了我的错误。感谢您抽出时间回复!这太好了,我非常感激!您帮助我将log4j.xml重命名为log4j2.xml,因为我完全忘了这么做,这个应用程序之前有log4j 1,2,我正在转换它。无论如何,10分钟后我被困在这里:
    ERROR StatusLogger找不到log4j2配置文件。使用默认配置:仅将错误记录到控制台。'log4j2.debug'显示log4j2内部初始化日志。
    @Nihvel我的项目中没有这个问题。试着从基础开始:将
    log4j2.xml
    文件放在
    src/main/resources
    文件夹中。将其复制为
    src/test/resources
    文件夹中的
    log4j2 test.xml
    ,并为要执行的测试编辑该文件。它找不到配置文件。但是文件被重命名,POM也被重命名:
    src/main/resources${project.build.directory}log4j2.xml
    ,所以一切都应该很好!我刚打开你的答案。是的,我就是这么做的!好的,我会试着更好地阅读代码!再次感谢!我知道我所拥有的是正确的,但它仍然找不到文件。StackOverflow充满了关于这个主题的问题,他们说的都一样:放入src/main/resources;这就是我所做的。但还是没什么。。。我接受你的回答,因为我问的问题是按照这些指令解决的,但我仍在努力查看属性文件!发现了“问题”。我的POM包含用于使用外部lib/classes/等构建tiny jar文件的指令。。和脂肪罐(一体式,重量约16MB)。第一个是能够读取属性文件并成功写入日志。第二个不是。我必须找到一种让胖jar读取外部属性文件的方法,如下所示:但只是尝试了一下,没有效果。。)该死。
    [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
    
    [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