log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="error" monitorInterval="60">
<!--Properties:变量定义的地方,配置文件内可以通过${}取值-->
<Properties>
<!--日志输出级别-->
<Property name="level">info</Property>
<!-- 产生的压缩文件的后缀-->
<Property name="fileName">$${date:yyyy-MM}/%d{MM-dd-yyyy}/%d{MM-dd-yyyy}-%i.log.gz</Property>
<!-- 日志输出格式-->
<Property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level - %logger{36}.%M[%L] - %msg%xEx%n</Property>
<!--每个日志文件的大小 kb M -->
<Property name="fileSize">100 M</Property>
<!--每天的日志文件最大数量-->
<Property name="fileNumber">20</Property>
<!--日志过期时间 s m h d-->
<Property name="expirationTime">7d</Property>
</Properties>
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<!--灵活切换日志输出格式 默认时pattern-->
<MarkerPatternSelector defaultPattern="${pattern}">
<!-- 当marker为spark时输出格式为 %m%n-->
<PatternMatch key="spark" pattern="%m%n"/>
</MarkerPatternSelector>
</PatternLayout>
</Console>
<!--操作日志 根据maker过滤 onMatch:匹配的执行 onMismatch:不匹配的执行 值有三种:NEUTRAL:匹配的由下一个filter处理 DENY:抛弃 ACCEPT:执行-->
<RollingRandomAccessFile name="OperationLog" fileName="logs/OperationLog.log"
filePattern="logs/operation-log/${fileName}">
<PatternLayout pattern="${pattern}"/>
<MarkerFilter marker="OPERATION_LOG" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY"/>=
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<DefaultRolloverStrategy max="${fileNumber}"/>
</RollingRandomAccessFile>
<!--会话日志 根据maker过滤-->
<RollingRandomAccessFile name="ConversationLog" fileName="logs/ConversationLog.log"
filePattern="logs/conversation-log/${fileName}">
<PatternLayout pattern="${pattern}"/>
<MarkerFilter marker="CONVERSATION_LOG" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY"/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
<DefaultRolloverStrategy max="${fileNumber}"/>
</RollingRandomAccessFile>
<!--业务日志 根据maker过滤-->
<RollingRandomAccessFile name="BusinessLog" fileName="logs/BusinessLog.log"
filePattern="logs/business-log/${fileName}">
<PatternLayout pattern="${pattern}"/>
<MarkerFilter marker="BUSINESS_LOG" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY"/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
<DefaultRolloverStrategy max="${fileNumber}"/>
</RollingRandomAccessFile>
<!--运行日志 记录所有的日志 配置日志过期删除-->
<RollingRandomAccessFile name="RuntimeLog" fileName="logs/RuntimeLog.log"
filePattern="logs/runtime-log/${fileName}">
<PatternLayout pattern="${pattern}"/>
<ThresholdFilter level="${level}" onMatch="ACCEPT" onMismatch="DENY"/>
<SizeBasedTriggeringPolicy size="${fileSize}"/>
<DefaultRolloverStrategy max="${fileNumber}">
<!--maxDepth最大深度 日志文件的路径深度 -->
<Delete basePath="logs/" maxDepth="4">
<IfFileName glob="**/**/**/*.log.gz"/>
<IfLastModified age="${expirationTime}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</appenders>
<loggers>
<!-- 过滤掉spring和mybatis的一些信息,输出到配置的一个或多个AppenderRef中-->
<logger name="org.springframework" level="INFO" additivity="false">
<AppenderRef ref="log"/>
</logger>
<root level="${level}">
<appender-ref ref="Console"/>
<appender-ref ref="RuntimeLog"/>
<appender-ref ref="BusinessLog"/>
<appender-ref ref="ConversationLog"/>
<appender-ref ref="OperationLog"/>
</root>
</loggers>
</configuration>
faq:
-
1.日志级别
低 --> 高 trace:追踪,就是程序推进一下,可以写个trace输出 debug:调试,一般作为最低级别,trace基本不用。 info:输出重要的信息,使用较多 warn:警告,有些信息不是错误信息,但也要给程序员一些提示。 error:错误信息。用的也很多。 fatal:致命错误。
-
2 输出源
CONSOLE(输出到控制台) FILE(输出到文件)
-
3 格式
SimpleLayout:以简单的形式显示 HTMLLayout:以HTML表格显示 PatternLayout:自定义形式显示
-
4.PatternLayout自定义日志布局
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间 %-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0 %c : logger的名称(%logger) %t : 输出当前线程名称 %p : 日志输出格式 %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名(%F) %L : 行号 %M : 方法名 %l : 输出语句所在的行数, 包括类名、方法名、文件名、行数 hostName : 本地机器名 hostAddress : 本地ip地址
-
5 marker的使用
Marker BUSINESS_LOG = MarkerFactory.getMarker("BUSINESS_LOG"); log.info(BUSINESS_LOG ,"使用marker来标识日志类型")
-
6log的使用
第一种通过lombok插件
使用注解@Slf4j
然后就可以在类中使用log
例:
@Slf4j
public class LogExampleOther {
public static void main(String... args) {
log.error("Something else is wrong here");
}
}
第二种 使用原生的log
例:
public class LogExampleOther {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);
public static void main(String... args) {
log.error("Something else is wrong here");
}
}