很少写博客;看了很多网上的教程,自己也试过了很多,有些问题也记录下来了希望能帮到其他朋友。
SpringBoot整合log4j2很简单,两步:
1、导入依赖。
2、配置log4j2-spring.xml。
1、我配置成功的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions><!-- 去掉默认配置(为log4j2准备) -->
<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>
网上很多都有说是 排除 spring-boot-starter-web 下的logging,然而我没有成功,不论怎么做都是报下面的错误;最后是需要在spring-boot-starter 下面排除,可能只是我的是这样子。。。
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/programData/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/programData/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.10.0/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
2、log4j2-spring.xml 配置文件;参考着网上写的然后改的;打印输出的日志很详细,有sql语句,数据库信息等等。
该文件放置位置是 :\src\main\resources\log4j2-spring.xml,名字相对固定,这些操作后就可以了,然后运行时就可以自动读取这个文件了。
<?xml version="1.0" encoding="UTF-8"?>
<!--
status : 这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出
monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身, 设置间隔秒数。
注:本配置文件的目标是将不同级别的日志输出到不同文件,最大2MB一个文件,
文件数据达到最大值时,旧数据会被压缩并放进指定文件夹
-->
<Configuration status="WARN" monitorInterval="600">
<Properties>
<!-- (*必须,各应用需要修改) 部署应用的名称,命名规则 :全部小写字母、中短横线、数字,与微服务命名,disconf中命名一致 -->
<property name="APPNAME">HurdPlatform</property>
<!-- (各应用需要修改)部署应用的端口号,用于一台服务器部署多台应用的情况,如果不需要,保持默认 -->
<property name="PORT">${sys:crtServerPort:-8080}</property>
<!-- 日志文件的编码 -->
<property name="log_charset">UTF-8</property>
<!-- 日志文件最小切割单位 值不做强制要求,建议300MB -->
<property name="every_file_size">300MB</property>
<!-- 配置日志文件输出目录,此配置将日志输出到tomcat根目录下的指定文件夹 -->
<Property name="LOG_HOME">Logs</Property>
<!-- *必须并强制遵守 日志格式说明: |日志时间|线程id|端口号|应用名称|类名|方法名|日志级别|traceId |输入参数|输出参数|耗时|任意多个扩展字段|具体打印的msg内容然后换行 -->
<property name="log_pattern">
<!--%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n-->
<!--标准格式-->
<!--|%d{yyyy-MM-dd HH:mm:ss.SSS}|%t|${PORT}|${APPNAME}|%logger|%M|%p|%X{MDCCRT_GUID_TRACEID}|###+%X{MDCCRT_EXTENTS}-###|##+%X{MDCCRT_INPUT_PARAM}-##|##+%X{MDCCRT_OUTPUT_PARAM}-##|%X{MDCCRT_COST_TIME}|%m%n-->
|%d{yyyy-MM-dd HH:mm:ss.SSS}|%t|${PORT}|${APPNAME}|%logger|%M|%p|%m%n
</property>
</Properties>
<Appenders>
<!--这个输出控制台的配置,这里输出除了warn和error级别的信息到System.out-->
<Console name="console_out_appender" target="SYSTEM_OUT">
<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式 -->
<!--<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/>-->
<PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
</Console>
<!--这个输出控制台的配置,这里输出warn和error级别的信息到System.err,在eclipse控制台上看到的是红色文字-->
<!-- <Console name="console_err_appender" target="SYSTEM_ERR">
<!– 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) –>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<!– 输出日志的格式 –>
<PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n"/>
</Console>
-->
<!-- TRACE级别日志 -->
<!-- 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,
日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出trace级别的数据到trace.log -->
<RollingRandomAccessFile name="trace_appender"
immediateFlush="true" fileName="${LOG_HOME}/trace.log"
filePattern="${LOG_HOME}/trace/trace - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
<Policies><!-- 两个配置任选其一 -->
<!-- 每个日志文件最大2MB -->
<SizeBaseDTriggeringPolicy size="${every_file_size}" />
</Policies>
<Filters>
<!-- 此Filter意思是,只输出debug级别的数据 -->
<!-- DENY,日志将立即被抛弃不再经过其他过滤器;
NEUTRAL,有序列表里的下个过滤器过接着处理日志;
ACCEPT,日志会被立即处理,不再经过剩余过滤器。 -->
<ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- DEBUG级别日志 -->
<!-- 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,
日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出debug级别的数据到debug.log -->
<RollingRandomAccessFile name="debug_appender"
immediateFlush="true" fileName="${LOG_HOME}/debug.log"
filePattern="${LOG_HOME}/debug/debug - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
<Policies><!-- 两个配置任选其一 -->
<!-- 每个日志文件最大2MB -->
<SizeBaseDTriggeringPolicy size="${every_file_size}" />
<!-- 如果启用此配置,则日志会按文件名生成新压缩文件,
即如果filePattern配置的日期格式为 %d{yyyy-MM-dd HH} ,则每小时生成一个压缩文件,
如果filePattern配置的日期格式为 %d{yyyy-MM-dd} ,则天生成一个压缩文件 -->
<!-- <TimeBasedTriggeringPolicy interval="1" modulate="true" /> -->
</Policies>
<Filters>
<!-- 此Filter意思是,只输出debug级别的数据 -->
<!-- DENY,日志将立即被抛弃不再经过其他过滤器;
NEUTRAL,有序列表里的下个过滤器过接着处理日志;
ACCEPT,日志会被立即处理,不再经过剩余过滤器。 -->
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- INFO级别日志 -->
<RollingRandomAccessFile name="info_appender"
immediateFlush="true" fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/info/info - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
<Policies>
<SizeBaseDTriggeringPolicy size="${every_file_size}" />
</Policies>
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- WARN级别日志 -->
<RollingRandomAccessFile name="warn_appender"
immediateFlush="true" fileName="${LOG_HOME}/warn.log"
filePattern="${LOG_HOME}/warn/warn - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
<Policies>
<SizeBaseDTriggeringPolicy size="${every_file_size}" />
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- ERROR级别日志 -->
<RollingRandomAccessFile name="error_appender"
immediateFlush="true" fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/error/error - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
<PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
<Policies>
<SizeBaseDTriggeringPolicy size="${every_file_size}" />
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!--过滤掉无用的DEBUG信息-->
<logger name="org.springframework" level="info"></logger>
<logger name="org.mybatis" level="info"></logger>
<logger name="org.thymeleaf" level="info"></logger>
<!-- 第三方日志系统 -->
<logger name="org.springframework.core" level="info"/>
<logger name="org.springframework.beans" level="info"/>
<logger name="org.springframework.context" level="info"/>
<logger name="org.springframework.web" level="info"/>
<logger name="org.apache.http" level="warn"/>
<!--控制台显示的内容 -->
<root level="all">
<appender-ref ref="console_out_appender"/>
<appender-ref ref="info_appender"/>
<appender-ref ref="warn_appender"/>
<appender-ref ref="error_appender"/>
</root>
</Loggers>
</Configuration>