使用log4j2,控制台可以正常输出日志,但是log4j2日志文件为空?
2018-02-09 14:50
441 查看
Log4j-2-does-not-write-to-file.md
问题: 使用log4j2, 控制台可以正常输出日志,但是log4j2日志文件为空?
配置文件log4j2.xml配置如下:
Java文件名为
网上搜了好多资料都没能看明白,只看看到这段文字:
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.
控制台输出:
查看日志文件,已经有内容了:
注意到,控制台和日志文件中的内容并不一样,这是因为我们配置的日志级别不同,Console配置的是
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]
问题: 使用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.htmlhttps://codedump.io/share/UwYEUh9AtRfg/1/log4j2-output-not-written-to-log-file
https://stackoverflow.com/questions/25118993/log4j-2-doesnt-write-to-file
[END]
相关文章推荐
- Log4j2的日志配置文件,log4j2.xml文件的配置(实现控制台输出,各级别分别文件输出,自动压缩等)
- Java 如何获取控制台日志输出的信息? WriterAppender 可以实现? 配置文件如何配置
- Log4j2的日志配置文件,log4j2.xml文件的配置(实现控制台输出,各级别分别文件输出,自动压缩等)
- Log4j2的日志配置文件,log4j2.xml文件的配置(实现控制台输出,各级别分别文件输出,自动压缩等)
- struts异常不捕获也可以在控制台和日志文件输出
- Extjs 使用form上传文件,在IE8出现乱码,但是其他浏览器可以正常解读
- WP7开发学习(3):在WP7中使用WCF+log4net 打印并输出日志文件(附源码)
- 在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。但是在代码中,如何处理呢?很多控件的方法中都只提供了
- log4j配置详解 输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能
- .LOG4J的配置(输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能)
- log4cplus中自定义的使用配置文件输出日志的类
- log4j.property中配置输出中文编码,文件输出正常,控制台输出乱码,解决成功
- @ResponseBody 返回json数据 在IE浏览器提示保存文件,但是在firefox中却可以正常的实现功能。
- 安装mysql之后,以前的mssql表不能正常打开,但是可以使用T-sql语言。
- cocos2d-x 使用CCLOG控制台输出日志
- linux 程序运行到后台,控制台输出到文件,并能日志切割的方法
- LOG4J的配置..实现了输出到控制台、文件、回滚文件、发送日志邮件
- 在项目中配置LOG4j,可以将LOG输出到文件中和控制台
- 如何将tomcat控制台输出的内容直播用日志文件保存起来
- 【Python】同时向控制台和文件输出日志logging