同事配置了个鬼配置文件,用都用不了,配的也不对,一气之下把它改了,现在做个笔记,
方便后期用上时直接Ctrl+C\Ctrl+V
主要有一个功用:
1、控制台输出
2、日志保存到文件(按文件大小)
3、日志按级别输出到文件中
1、控制台输出
pom.xml主要配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion><!-- 去掉默认的,不然没效果 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency><!-- 引用log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
在resources目录下添加log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!--每30秒后重新加载配置文件,因为可能配置文件改了,所以会动态加载,不错-->
<Configuration status="WARN" monitorInterval="30">
<!--相当于变量-->
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss} %l - %msg%n
</Property>
</Properties>
<Appenders>
<!--控制台输入日志-->
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<!--指定TTest日志级别只能是info已上,additivity=false,禁止重复添加日志,因为下面有个Root是全局的,会重复-->
<Logger name="com.example.t_log4j2.TTest" level="info" additivity="false">
<AppenderRef ref="ConsoleAppender" />
</Logger>
<!--其他所有日志的级别是debug-->
<Root level="debug">
<AppenderRef ref="ConsoleAppender" />
</Root>
</Loggers>
</Configuration>
Java文件:
package com.example.t_log4j2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class TTest {
private static final Logger logger = LogManager.getLogger(TTest.class);
public static void main(String[] args) {
logger.fatal(">>>{}", "fatal");
logger.error(">>>{}", "error");
logger.warn(">>>{}", "warn");
logger.info(">>>{}", "info");
logger.debug(">>>{}", "debug");
logger.trace(">>>{}" ,"trace");
print();
}
public static void print(){
logger.info(">>>print{}", "info");
}
}
控制台输出:
2018-09-25 11:43:59 com.example.t_log4j2.TTest.main(TTest.java:11) - >>>fatal
2018-09-25 11:43:59 com.example.t_log4j2.TTest.main(TTest.java:12) - >>>error
2018-09-25 11:43:59 com.example.t_log4j2.TTest.main(TTest.java:13) - >>>warn
2018-09-25 11:43:59 com.example.t_log4j2.TTest.main(TTest.java:14) - >>>info
2018-09-25 11:43:59 com.example.t_log4j2.TTest.print(TTest.java:21) - >>>printinfo
PatternLayout中的pattern配置参数参考:
https://logging.apache.org/log4j/2.x/manual/layouts.htmlOK,,,记录完毕!
2、日志保存到文件
加入配置:
<!--fileName:当前日志名
filePattern:压缩后的文件名
SizeBasedTriggeringPolicy:每当日志大小超过1K自动压缩
DefaultRolloverStrategy:最大保存日志文件个数,是int级别-->
<RollingFile name="RollingFile" fileName="C:/logs/t/app.log"
filePattern="C:/logs/t/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="1KB"/>
</Policies>
<DefaultRolloverStrategy max="88888888"/>
</RollingFile>
完整如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--每30秒后重新加载配置文件,因为可能配置文件改了,所以会动态加载,不错-->
<Configuration status="WARN" monitorInterval="30">
<!--相当于变量-->
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss} %l - %msg%n
</Property>
</Properties>
<Appenders>
<!--控制台输入日志-->
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!--fileName:当前日志名
filePattern:压缩后的文件名
SizeBasedTriggeringPolicy:每当日志大小超过1K自动压缩
DefaultRolloverStrategy:最大保存日志文件个数,是int级别-->
<RollingFile name="RollingFile" fileName="C:/logs/t/app.log"
filePattern="C:/logs/t/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--当日志超过1KB就自动压缩成旧的日志,并创建新的日志文件,可以设置成MB-->
<SizeBasedTriggeringPolicy size="1KB"/>
</Policies>
<!--最多保存日志个数-->
<DefaultRolloverStrategy max="88888888"/>
</RollingFile>
</Appenders>
<Loggers>
<!--指定TTest日志级别只能是info已上,additivity=false,禁止重复添加日志,因为下面有个Root是全局的,会重复-->
<Logger name="com.example.t_log4j2.TTest" level="info" additivity="false">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="RollingFile"/>
</Logger>
<!--其他所有日志的级别是debug-->
<Root level="debug">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
3、日志按级别输出到文件中
Log4j2的日志级别有:trace < debug < info < warn < error < fatal
当<Root >设置level为info时,只能看到info及以上的级别日志,也就是info\warn\error\fatal
现在想把日志文件分别按debug ,info,warn...等分开保存,也就是会得到debug.log,info.log,warn.log,那么就得用上配置:<ThresholdFilter>,ThresholdFilter有三个参数:level\onMatch\onMismatch
level:日志级别
onMatch:匹配上
onMismatch:不匹配得上
其中onMatch可选值 :ACCEPT : 接受\DENY : 拒绝\NEUTRAL : 中性\默认:NEUTRAL
其中onMismatch可选值 :ACCEPT : 接受\DENY : 拒绝\NEUTRAL : 中性\默认:DENY
假设现在想把info的信息记录在info.log文件中,那么配置如下:
<!--fileName:当前日志名
filePattern:压缩后的文件名
SizeBasedTriggeringPolicy:每当日志大小超过1K自动压缩
DefaultRolloverStrategy:最大保存日志文件个数,是int级别-->
<RollingFile name="RollingFile" fileName="C:/logs/t/info.log"
filePattern="C:/logs/t/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}-%i.info.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<!--只记录info的,下面第一行的配置意思是只记录info级别书上的,否则不理.
第二行的意思是warn级别上的不作记录,其他的不理,
所以合起来的意思是: info <= 记录的日志级别 < warn,所以只能记录info的-->
<Filters>
<ThresholdFilter level="INFO"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
</Filters>
<Policies>
<!--当日志超过1KB就自动压缩成旧的日志,并创建新的日志文件,可以设置成MB-->
<SizeBasedTriggeringPolicy size="1KB"/>
</Policies>
<!--最多保存日志个数-->
<DefaultRolloverStrategy max="88888888"/>
</RollingFile>
完整的:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss} %l - %msg%n
</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<RollingFile name="InfoRollingFile" fileName="C:/logs/t/info.log"
filePattern="C:/logs/t/%d{yyyy-MM-dd}/info/%d{yyyy-MM-dd}-%i.info.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="INFO"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<Policies>
<SizeBasedTriggeringPolicy size="1KB"/>
</Policies>
<DefaultRolloverStrategy max="88888888"/>
</RollingFile>
<RollingFile name="DebugRollingFile" fileName="C:/logs/t/debug.log"
filePattern="C:/logs/t/%d{yyyy-MM-dd}/debug/%d{yyyy-MM-dd}-%i.debug.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="DEBUG"/>
<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<Policies>
<SizeBasedTriggeringPolicy size="1KB"/>
</Policies>
<DefaultRolloverStrategy max="88888888"/>
</RollingFile>
<RollingFile name="WarnRollingFile" fileName="C:/logs/t/warn.log"
filePattern="C:/logs/t/%d{yyyy-MM-dd}/warn/%d{yyyy-MM-dd}-%i.warn.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="WARN"/>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<Policies>
<SizeBasedTriggeringPolicy size="1KB"/>
</Policies>
<DefaultRolloverStrategy max="88888888"/>
</RollingFile>
<RollingFile name="ErrorRollingFile" fileName="C:/logs/t/error.log"
filePattern="C:/logs/t/%d{yyyy-MM-dd}/error/%d{yyyy-MM-dd}-%i.error.log.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Filters>
<ThresholdFilter level="ERROR"/>
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>
<Policies>
<SizeBasedTriggeringPolicy size="1KB"/>
</Policies>
<DefaultRolloverStrategy max="88888888"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.example.t_log4j2.TTest" level="debug" additivity="false">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="InfoRollingFile"/>
<AppenderRef ref="DebugRollingFile"/>
<AppenderRef ref="WarnRollingFile"/>
<AppenderRef ref="ErrorRollingFile"/>
</Logger>
<Root level="debug">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="InfoRollingFile"/>
<AppenderRef ref="DebugRollingFile"/>
<AppenderRef ref="WarnRollingFile"/>
<AppenderRef ref="ErrorRollingFile"/>
</Root>
</Loggers>
</Configuration>
要想把日志写在tomcat目录下,可修改log4j2.xml文件中的fileName和filePattern,加入${sys:catalina.home},如:
fileName="${sys:catalina.home}/logs/info/infoabc.log"
filePattern="${sys:catalina.home}/logs/info/%d{yyyy-MM-dd}/info/%d{yyyy-MM-dd}-%i.info.log.gz"这里日志的位置(自己的tomcat啦):D:\apache-tomcat-8.0.53\logs
OK,记录完毕。