使用log4j2,控制台可以正常输出日志,但是log4j2日志文件为空?

Log4j-2-does-not-write-to-file.md

问题: 使用log4j2, 控制台可以正常输出日志,但是log4j2日志文件为空?

配置文件log4j2.xml配置如下:

<!-- log4j2.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>  
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyTestLog" fileName="MyTestLog.txt" immediateFlush="false" append="true">
            <PatternLayout pattern="%d{yy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <Logger name="org.apache.log4j.xml" level="debug">
            <AppenderRef ref="MyTestLog"/>
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console" level="error"/>
        </Root>
    </Loggers>
</Configuration>

Java文件名为Log4jDemo.java, 代码如下:

// Log4jDemo.java
import org.apache.logging.log4j.*;

public class Log4jDemo {
    static Logger logger = LogManager.getLogger(Log4jDemo.class.getName());
    public static void main(String[] args) {
        System.out.println("=> Hello Log4jDemo...");
        logger.trace("trace level");
        logger.debug("debug level");
        logger.info("info level");
        logger.warn("warn level");
        logger.error("error level");
        logger.fatal("fatal level");
    }
}

网上搜了好多资料都没能看明白,只看看到这段文字:

It is not writing to your file because the Logger you are using to log is named log4j2Demo.LogDemo but the logger you have configured is named “a.demo.of.log4j2”.
Since the names don’t match it will use the root logger, which you have configured to log to the console.

解决办法1:

重新修改配置文件,将Loggers中Logger的name改成”Log4jDemo”, 与java类文件同名:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>  
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyTestLog" fileName="MyTestLog.txt" immediateFlush="false" append="true">
            <PatternLayout pattern="%d{yy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <Logger name="Log4jDemo" level="debug">
            <AppenderRef ref="MyTestLog"/>
        </Logger>
        <Root level="all">
            <AppenderRef ref="Console" level="error"/>
        </Root>
    </Loggers>
</Configuration>

解决办法2:

Loggers里Root下配置两个AppenderRef,一个指向Console,一个指向MyTestLog:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>  
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyTestLog" fileName="MyTestLog.txt" immediateFlush="false" append="true">
            <PatternLayout pattern="%d{yy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <Root level="all">
            <AppenderRef ref="Console" level="error"/>
            <AppenderRef ref="MyTestLog" level="info" />
        </Root>
    </Loggers>
</Configuration>

控制台输出:

=> Hello Log4jDemo...
18-01-24 15:57:09.547 [main] ERROR Log4jDemo - error level
18-01-24 15:57:09.547 [main] FATAL Log4jDemo - fatal level

查看日志文件,已经有内容了:

$ tail MyTestLog.txt
18-01-24 15:57:09.544 [main] INFO  Log4jDemo - info level
18-01-24 15:57:09.547 [main] WARN  Log4jDemo - warn level
18-01-24 15:57:09.547 [main] ERROR Log4jDemo - error level
18-01-24 15:57:09.547 [main] FATAL Log4jDemo - fatal level

注意到,控制台和日志文件中的内容并不一样,这是因为我们配置的日志级别不同,Console配置的是error, MyTestLog配置的是info

解决办法3: AsyncAppender with Console and File

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>  
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyTestLog" fileName="MyTestLog.txt" immediateFlush="false" append="true">
            <PatternLayout pattern="%d{yy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
        <Async name="ASYNC">
            <AppenderRef ref="MyTestLog"/>
            <AppenderRef ref="Console"/>
            </Async>
    </Appenders>
    <Loggers>
        <Root level="all">
            <AppenderRef ref="ASYNC"/>
        </Root>
    </Loggers>
</Configuration>

参考链接

https://logging.apache.org/log4j/2.x/manual/migration.html
https://codedump.io/share/UwYEUh9AtRfg/1/log4j2-output-not-written-to-log-file
https://stackoverflow.com/questions/25118993/log4j-2-doesnt-write-to-file

[END]

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,我可以为您提供一些关于Spring Boot整合Log4j2的指导。 首先,您需要在Spring Boot项目的pom.xml文件中添加Log4j2相关依赖。以下是一个示例: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies> ``` 接下来,您需要在项目中创建log4j2.xml文件。以下是一个示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="console"/> </Root> </Loggers> </Configuration> ``` 在这个示例中,我们定义了一个名为“console”的Appender,用于将日志输出控制台。我们还定义了一个名为“Root”的Logger,用于将所有日志消息发送到“console”Appender,并将日志级别设置为“info”。 最后,在项目中使用Log4j2日志记录。您可以使用Spring的内置日志记录注解@Log4j2来注释您的类。以下是一个示例: ```java import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller @Log4j2 public class HomeController { @GetMapping("/") public String home() { log.info("Home page accessed"); return "home"; } } ``` 这个示例中,我们使用了Lombok提供的@Log4j2注解来注释HomeController类。然后,我们在home()方法中使用log.info()方法来记录日志消息。 希望这些指导对您有所帮助!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web后端技术

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值