log4j2配置ThresholdFilter,让info文件记录error日志
<properties> <log4j.version>2.5</log4j.version> </properties> <dependencies> <!--引入log4j2必要的依赖(log4j-api、log4j-core)--> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j.version}</version> </dependency> </dependencies>
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Appenders> <!-- 控制台打印 --> <Console name="CONSOLE" target="SYSTEM_OUT"> <PatternLayout pattern="%d %-5p [%t] (%F:%L) - %m%n"/> <Filters> ~~~ </Filters> </Console> <!-- 按天每天备份一个日志 --> <RollingFile name="ManageWebInfo" fileName="d:\logs\log4j2study_info.log" filePattern="d:\logs\log4j2study_info_%d{yyyy-MM-dd}_%i.log.gz"> 。。。 </RollingFile> <RollingFile name="ManageWebError" fileName="d:\logs\log4j2study_error.log" filePattern="d:\logs\log4j2study_error_%d{yyyy-MM-dd}_%i.log.gz"> 。。。 </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="ManageWebInfo"/> <AppenderRef ref="ManageWebError"/> </Root> <Logger name="study" level="WARN"> <AppenderRef ref="CONSOLE"/> </Logger> </Loggers> </Configuration>
test class
package study; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4j2Test { public static void main(String[] args) throws Exception { // Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); Logger logger = LogManager.getLogger(/*"study"*/); logger.trace("trace level"); logger.debug("debug level"); logger.info("info level"); logger.warn("warn level"); logger.error("error level"); logger.fatal("fatal level"); // Thread.sleep(10); throw new Exception("test"); } }
测试
以控制台输出为例来进行测试,在上面“CONSOLE”的<Filters>节点定义不同的ThresholdFilter来测试输出。
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
2018-12-28 16:07:44,477 INFO [main] (MyLogTest.java:11) - info level
2018-12-28 16:07:44,479 WARN [main] (MyLogTest.java:12) - warn level
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
2018-12-28 16:09:43,849 INFO [main] (MyLogTest.java:11) - info level
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
高于INFO的都不打印,因为root日志级别是info,所以就不会打印任何日志了。
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
只打印INFO和ERROR
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
只打印ERROR及以上(即ERROR和FATAL)(error.log文件的标配)
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="ACCEPT"/>
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>(Filters节点里只有这一个Filter时)
打印INFO、WARN、ERROR(常见的info.log文件的标配)
总结
a)ThresholdFilter属性:onMatch表示匹配设定的日志级别后是DENY还是ACCEPT,onMismatch表示不匹配设定的日志级别是DENY还是ACCEPT还是NEUTRAL
b)上面说的match/misMatch指的是高于或等于设定的日志级别。所以,要先定义日志级别高的Filter。
onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL
介绍一下这两个配置项的三个属性值:
- onMatch="ACCEPT" 表示匹配该级别及以上
- onMatch="DENY" 表示不匹配该级别及以上
- onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
- onMismatch="ACCEPT" 表示匹配该级别以下
- onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
- onMismatch="DENY" 表示不匹配该级别以下的
————————————————————————————
main方法在打印日志的语句后面throw了一个异常。 运行main方法看控制台的输出,会出现异常信息先于log日志输出的情况,可见log4j2是异步记日志的。
————————————————————————————
需要注意的是,未捕获的异常是不会记日志文件的。————好像是废话~~—————所以,程序一定要捕获异常并且打印出来,否则只能看catalina.out(tomcat容器下的应用)了
————————————————————————————
Loggers节点里的Root定义了基本的日志级别与appender的配置关系。如果要自定义关系,可配置Logger节点,设定name属性名(取值通常是class/interface的name),然后在定义Logger对象的实例时,指定这个name即可。
相关文章
- pycharm run/debug configurations配置_linux中run文件怎么安装
- 文件上传linux文件名乱码_java导出文件名中文乱码
- java文件上传服务器路径,java文件上传服务器路径地址「建议收藏」
- 怎么新建pytest的ini文件_pytest.ini配置
- EasyCVR导出设备文件提示报错“配置数据未找到”,该如何解决?
- vue文件上传速度慢,有可能是nginx配置的问题
- vscode一键配置C/C++多个C及CPP文件编译与tasks.json和launch.json原理
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )
- 【C 语言】文件操作 ( 配置文件读写 | 写出或更新配置文件 | 函数形参设置 | 确保打开文件成功 | 统计文件大小 )
- Spartacus 项目中 .env-cmdrc 文件的作用是什么?
- 【Linux】基础IO_文件操作
- VSCode连接实验室服务器Xshell,Xftp向服务器传输文件的方法(win10)
- springboot 文件上传大小配置详解编程语言
- 在html文件中引入js代码的几种方法详解编程语言
- 利用python计算windows全盘文件md5值的脚本详解编程语言
- 文件配置MySQL服务器的.cnf文件(mysql.cnf)
- 文件卸载Linux中bin文件的方法(linux卸载bin)
- 探索Linux文件的不同类型(linux文件的类型)
- 深入了解Linux文件颜色配置方法(linux文件颜色)
- f配置MySQL配置文件快速入门:cnf文件解析(mysqlcn)
- Linux Sock 文件:解锁网络通信的钥匙(linuxsock文件)
- 如何打开并显示Linux系统中的隐藏文件?(显示linux隐藏文件)
- SQLSERVER2005中使用sql语句对xml文件和其数据的进行操作(很全面)
- inotify-tools+rsync实时同步文件的配置方法
- apache正常访问mht类型文件的配置方法
- Mongodb批量删除gridfs文件实例
- VisualStudio中根据系统区分引用64位、32位DLL动态库文件的配置方法