目录
前言
此篇文章基于xml文件形式进行整合,后续会另推出以boot/cloud为微服务架构下基于log4j2整合
说到log4j2肯定会有log4j,log4j2就是log4j的替代者,log4j目前已经停止更新,微服务架构下日志首选为ELK,然而ELK略耗资源,由此很多企业都采用logBack或者log4j2+slf4j,
核心依赖添加
SpringBoot默认携带自身的log日志功能,需要去调默认配置方能生效
<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>
<dependency> <!-- 引入log4j2依赖 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
log4j2核心配置(基于xml形式)
log4j2-spring.xml核心配置标签概述以及描述都有写
<?xml version="1.0" encoding="UTF-8" ?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--变量配置-->
<Properties>
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符
%date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} %l - %msg%n
-->
<property name="LOG_PATTERN" value="%date{YYYY:MM:dd HH:mm:ss.SSS} [%thread] %-5level %l -%M - %msg%n"/>
<!-- 定义日志存储的路径 -->
<property name="FILE_PATH" value="D:\logs"/>
</Properties>
<appenders>
<!--控制台日志输出-->
<console name="Console" target="SYSTEM_OUT">
<!--运行日志输入文件-->
<!--<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>-->
<!--日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<!--控制台输出日志格式-->
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>-->
</console>
<AsyncRoot level="info" includeLocation="true">
<AppenderRef ref="Console"/>
<appender-ref ref="infoJournal"/>
<appender-ref ref="debugJournal"/>
</AsyncRoot>
<!--
debug 运行时异常日志信息
-->
<RollingFile name="debugJournal" fileName="${FILE_PATH}/堆栈日志.log"
filePattern="D://logs/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
<!--文件只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日志消息输出格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--日志拆分规则-->
<Policies>
<!--在系统启动时,生成一个新的日志文件-->
<OnStartupTriggeringPolicy/>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="0.001"/>
<SizeBasedTriggeringPolicy size="10 Kb"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下10个文件开始覆盖-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<RollingFile name="infoJournal" fileName="${FILE_PATH}/运行日志.log"
filePattern="D://logs/$${date:yyyy-MM-dd}/run-%d{yyyy-MM-dd}-%i.log">
<!--文件只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="fatal" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日志消息输出格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--日志拆分规则-->
<Policies>
<!--在系统启动时,生成一个新的日志文件-->
<OnStartupTriggeringPolicy/>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="0.001"/>
<SizeBasedTriggeringPolicy size="10 KB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下10个文件开始覆盖-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</appenders>
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的信息-->
<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="info">
<appender-ref ref="Console"/>
<appender-ref ref="infoJournal"/>
<appender-ref ref="debugJournal"/>
</root>
</loggers>
</configuration>
引用log4j2日志规则文件
SpringBoot下有yml简化写法和properties全名写法
我用的是yml,由此是下面这种格式,你们用时直接修改配置文件为application.yml为后缀即可
logging:
config: classpath:log4j2-spring.xml
controller层引用log4j2
这里简单描述一下当前测试场景,根据我的配置文件loh4j2-spring.xml日志规则,我这里只记录两种级别,一个为运行日志(包含错误信息,程序运行过程),一个为访问日志(只记录运行信息)
package com.itxwl.run.controller;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auther: 薛
* @Date: 2020/4/30 15:37
* @Description:
*/
@RestController
@RequestMapping("t")
public class DemoController {
private Logger logger= LogManager.getLogger(DemoController.class);
@GetMapping("/s/{data}")
public Integer s(@PathVariable("data") Integer data){
logger.fatal("访问运算接口~");
Integer dd=5;
Integer ix=0;
if (!StringUtils.isEmpty(data)){
try {
ix = dd / data;
} catch (Exception e) {
logger.error("运算失败,可能被除数为零");
}
}
return ix;
}
}
服务运行后场景概况
根据以上log4j2配置文件规则会在系统D盘/logs文件下生成日志文件
- 首次系统运行即生成两个文件
- 日志测试环境限定配置为满10KB即滚动当前日志文件,异常及堆栈信息移动其它文件
- 日志文件满足10KB时会自动新增,根据xml文件配置如果满30个文件,会回滚为最后一条为最新数据
服务结构图(基于idea)
日志记录文件图示
-
运行日志如图
-
访问日志如图
结束语(博主联系方式)
当然只是基础引用log4j2记录日志,后续会持续推出日志相关文章,进而整合到微服务架构下日志记录。
QQ:2509647976
微信:x331191249