SpringBoot2.0+ 使用Log4j2日志输出 据说Log4j2相比log4j效率有很大提升。
1.pom.xml导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉springboot默认配置 -->
<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>
2.新建默认配置文件log4j2-spring.xml 内容如下
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j2 自动检测修改配置文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--变量配置-->
<Properties>
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定义日志存储的路径,不要配置相对路径 -->
<property name="FILE_PATH" value="E:/logs" />
<property name="FILE_NAME" value="boot-log4j2" />
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
<File name="Filelog" fileName="${FILE_PATH}/log4j2.log" append="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy同一文件夹下15个文件开始覆盖 不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy同一文件夹下15个文件开始覆盖 不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy同一文件夹下15个文件开始覆盖 不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--监控系统信息-->
<!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!--日志级别-->
<root level="debug">
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
如果配置文件使用其它名字需在yml文件中进行配置
logging:
config: xxxx.xml
3.使用
protected static Logger logger = LoggerFactory.getLogger(PCDynaDaoTemplateImpl.class);
logger .trace("trace level");
logger .debug("debug level");
logger .info("info level");
logger .warn("warn level");
logger .error("error level");
如使用了lombok可用注解@Slf4j 代替 protected static Logger logger = LoggerFactory.getLogger(PCDynaDaoTemplateImpl.class);
4.使用prop’erties文件进行配置
status = error
dest = err
name = PropertiesConfig
#公共变量
#文件路径
property.filePath=e://logs
property.filePattern=e://logs/%d{yyyy}/%d{MM}
#输出格式
property.layoutPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %p ] [ %c ] %m%n
# 级别过滤(过滤日志记录)
#filters = threshold
filter.threshold.type = ThresholdFilter
# 只记录debug级别以上的日志,大小写无关:(ALL<)TRACE<DEBUG<INFO<WARN<ERROR<FATAL(<OFF)
filter.threshold.level = debug
# 根记录器,所有记录器的父辈
rootLogger.level = debug
appender.console.type = Console
appender.console.name = STDOUT
appender.console.target = SYSTEM_OUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = ${layoutPattern}
rootLogger.appenderRef.stdout.ref = STDOUT
appender.D.type = RollingFile
appender.D.name = DebugRollingFile
appender.D.fileName = ${filePath}/opdata-debug.log
appender.D.filePattern = ${filePattern}/opdata_debug.log
appender.D.layout.type = PatternLayout
appender.D.layout.pattern = ${layoutPattern}
appender.D.policies.type = Policies
appender.D.policies.time.type = TimeBasedTriggeringPolicy
appender.D.policies.time.interval = 1
appender.D.policies.time.modulate = true
appender.D.policies.size.type = SizeBasedTriggeringPolicy
appender.D.policies.size.size=20M
appender.D.strategy.type = DefaultRolloverStrategy
appender.D.strategy.max = 100
#过滤debug以上信息
appender.D.filter.threshold.type = ThresholdFilter
appender.D.filter.threshold.level = INFO
appender.D.filter.threshold.onMatch = DENY
appender.D.filter.threshold.onMisMatch=NEUTRAL
rootLogger.appenderRef.D.ref=DebugRollingFile
rootLogger.appenderRef.D.level=debug
appender.I.type = RollingFile
appender.I.name = InfoRollingFile
appender.I.fileName = ${filePath}/opdata-info.log
appender.I.filePattern = ${filePattern}/opdata_info.log
appender.I.layout.type = PatternLayout
appender.I.layout.pattern = ${layoutPattern}
appender.I.policies.type = Policies
appender.I.policies.time.type = TimeBasedTriggeringPolicy
appender.I.policies.time.interval = 1
appender.I.policies.time.modulate = true
appender.I.policies.size.type = SizeBasedTriggeringPolicy
appender.I.policies.size.size=20M
appender.I.strategy.type = DefaultRolloverStrategy
appender.I.strategy.max = 100
#过滤INFO以上信息
appender.I.filter.threshold.type = ThresholdFilter
appender.I.filter.threshold.level = WARN
appender.I.filter.threshold.onMatch = DENY
appender.I.filter.threshold.onMisMatch=NEUTRAL
rootLogger.appenderRef.I.ref = InfoRollingFile
rootLogger.appenderRef.I.level=INFO
appender.W.type = RollingFile
appender.W.name = WarnRollingFile
appender.W.fileName = ${filePath}/opdata-warn.log
appender.W.filePattern = ${filePattern}/opdata_warn.log
appender.W.layout.type = PatternLayout
appender.W.layout.pattern = ${layoutPattern}
appender.W.policies.type = Policies
appender.W.policies.time.type = TimeBasedTriggeringPolicy
appender.W.policies.time.interval = 1
appender.W.policies.time.modulate = true
appender.W.policies.size.type = SizeBasedTriggeringPolicy
appender.W.policies.size.size=20M
appender.W.strategy.type = DefaultRolloverStrategy
appender.W.strategy.max = 100
#过滤warn以上信息
appender.W.filter.threshold.type = ThresholdFilter
appender.W.filter.threshold.level = ERROR
appender.W.filter.threshold.onMatch = DENY
appender.W.filter.threshold.onMisMatch=NEUTRAL
rootLogger.appenderRef.W.ref = WarnRollingFile
rootLogger.appenderRef.W.level=WARN
appender.E.type = RollingFile
appender.E.name = ErrorRollingFile
appender.E.fileName = ${filePath}/opdata-error.log
appender.E.filePattern = ${filePattern}/opdata_error.log
appender.E.layout.type = PatternLayout
appender.E.layout.pattern = ${layoutPattern}
appender.E.policies.type = Policies
appender.E.policies.time.type = TimeBasedTriggeringPolicy
appender.E.policies.time.interval = 1
appender.E.policies.time.modulate = true
appender.E.policies.size.type = SizeBasedTriggeringPolicy
appender.E.policies.size.size=20M
appender.E.strategy.type = DefaultRolloverStrategy
appender.E.strategy.max = 100
#过滤ERROR以上信息
appender.E.filter.threshold.type = ThresholdFilter
appender.E.filter.threshold.level = FATAL
appender.E.filter.threshold.onMatch = DENY
appender.E.filter.threshold.onMisMatch=NEUTRAL
rootLogger.appenderRef.E.ref = ErrorRollingFile
rootLogger.appenderRef.E.level=ERROR
appender.F.type = RollingFile
appender.F.name = FatalRollingFile
appender.F.fileName = ${filePath}/opdata-fatal.log
appender.F.filePattern = ${filePattern}/opdata_fatal.log
appender.F.layout.type = PatternLayout
appender.F.layout.pattern = ${layoutPattern}
appender.F.policies.type = Policies
appender.F.policies.time.type = TimeBasedTriggeringPolicy
appender.F.policies.time.interval = 1
appender.F.policies.time.modulate = true
appender.F.policies.size.type = SizeBasedTriggeringPolicy
appender.F.policies.size.size=20M
appender.F.strategy.type = DefaultRolloverStrategy
appender.F.strategy.max = 100
rootLogger.appenderRef.F.ref = FatalRollingFile
rootLogger.appenderRef.F.level=FATAL
#appender.S.type = Socket
#appender.S.name= SocketTCP
#appender.S.host = 10.10.1.169
#appender.S.port=4560
#appender.S.protocol = TCP
#appender.S.layout.type = JsonLayout
#appender.S.layout.compact = true
#appender.S.layout.eventEol = true
#appender.S.connectTimeoutMillis = 2000
#rootLogger.appenderRef.S.ref=SocketTCP
#rootLogger.appenderRef.S.level=socket
#配置第三方包的日志
logger.jpath.name=com.jayway.jsonpath
logger.jpath.level=error
logger.mongodb.name=org.mongodb.driver
logger.mongodb.level=error