Springboot 集成log4j2配置
作者:互联网
1. 引入log4j2依赖:
注意点:
(1). springboot默认是logback日志框架, 需要先排除spring-boot-starter-logging包, 否则会引起jar包冲突
(2). 如果要配置log4j2异步日志, 需要添加disruptor依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!--springboot默认是logback日志框架, 需先排除此依赖, 否则会和log4j2产生jar包冲突--> <!--但是这种排除方式不一定有效,因为可能别的依赖包里也集成了默认的日志,这样的话项目启动依旧会报冲突--> <!--<exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions>--> </dependency> <!-- 全局排除spring-boot-starter-logging相关所有依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入log4j2依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- 使用log4j2的Async配置需要引入disruptor包 --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> </dependency>
2. applicaton.yml配置:
指定log4j2.xml配置文件位置, 这里通过指定不同文件来区分不同的环境(开发,测试,生产)
logging: config: classpath:log4j2.xml
3. log4j2.xml详细配置:
以下为同步日志配置:
<?xml version="1.0" encoding="UTF-8" ?> <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--> <!--monitorInterval:Log4j能够自动检测修改配置文件和重新配置本身(无需重启,热更新),设置间隔秒数--> <Configuration status="WARN" monitorInterval="1800"> <!--日志级别以及优先级排序: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF --> <!--变量配置--> <Properties> <!--应用名称--> <property name="APP_NAME">sky-hello</property> <!--日志存放路径--> <property name="LOG_PATH">./logs/${APP_NAME}</property> <!--日志备份路径--> <property name="LOG_BACKUP_PATH">${LOG_PATH}/backup</property> <!--日志输出格式-控制台--> <property name="PATTERN_CONSOLE">%d{yyyy-MM-dd HH:mm:ss.SSS} | %blue{%traceId} | %highlight{%-5p} | %magenta{${sys:PID}} | %yellow{%t} | %cyan{%l} : %msg%n</property> <!--日志输出格式-文件--> <property name="PATTERN_FILE">%d{yyyy-MM-dd HH:mm:ss.SSS} | %traceId | %-5p | ${sys:PID} | %t | %l : %msg%n</property> </Properties> <!--定义日志输出目的地,内容和格式等--> <Appenders> <!--控制台--> <Console name="Console" target="SYSTEM_OUT"> <!--输出日志的格式: 1.不设置默认为: %m%n 2.disableAnsi="false" noConsoleNoAnsi="false" 配置开启支持%highlight彩色日志 --> <PatternLayout pattern="${PATTERN_CONSOLE}" disableAnsi="false" noConsoleNoAnsi="false"/> <!--只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> </Console> <!--可归档文件 1. fileName: 日志存储路径 2. filePattern: 历史日志封存路径。其中%d{yyyy-MM-dd}表示了日志的时间单位是天,log4j2自动识别zip等后缀,表示历史日志需要压缩 --> <RollingFile name="RollingFile" fileName="${LOG_PATH}/${APP_NAME}.log" filePattern="${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-%d{yyyy-MM-dd}_%i.log.zip"> <!--输出日志的格式, 不设置默认为:%m%n--> <PatternLayout pattern="${PATTERN_FILE}"/> <!--只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <!--归档设置--> <Policies> <!--按时间间隔归档: 1. interval=时间间隔, 单位由filePattern的%d日期格式指定, 此处配置代表每一天归档一次 2. modulate="true" 是否对interval取模,决定了下一次触发的时间点 --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> <!-- 按照日志文件的大小: size表示当前日志文件的最大size,支持单位:KB/MB/GB--> <SizeBasedTriggeringPolicy size="50MB"/> </Policies> <!-- 历史日志配置: 该属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--> <DefaultRolloverStrategy max="30"/> </RollingFile> <!--错误信息单独归档--> <RollingFile name="RollingFileError" fileName="${LOG_PATH}/${APP_NAME}-error.log" filePattern="${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-error-%d{yyyy-MM-dd}_%i.log.zip"> <PatternLayout pattern="${PATTERN_FILE}"/> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="50MB"/> </Policies> </RollingFile> </Appenders> <!--Loggers配置--> <Loggers> <!-- 注意点: 1. logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等: (1). name: 用来指定该logger所适用的类或者类所在的包全路径,继承自Root节点. (2). AppenderRef:关联的Appender, 只有定义了logger并引入的appender,appender才会生效 (3). additivity: logEvent的传递性。true LogEvent处理后传递给父Logger打印。false LogEvent处理后不再向上传递给父Logger(解决日志重复输出问题) (4). logger配置的level必须高于或等于Appenders中ThresholdFilter配置的过滤level, 否则会造成信息丢失 2. root配置日志的根节点 --> <!-- 同步日志配置--> <logger name="com.sky.hello.mapper" level="debug" additivity="false"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> <AppenderRef ref="RollingFileError"/> </logger> <root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> <AppenderRef ref="RollingFileError"/> </root> </Loggers> </Configuration>
4. log4j2异步配置
小伙伴看到这里可能要问: 作为log4j2最炸裂的卖点(号称性能翻倍)的异步日志呢? 咋配置呢?
哈哈,不要急,这里楼主整理了2种配置方式:
(1). 全局配置异步
①. 修改参数:
JVM参数方式:
JVM启动参数(boot.ini)加上“-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector”
System参数方式
@SpringBootApplication public class SkyHelloApplication { public static void main(String[] args) { /** * log4j2异步日志全局配置,减小输出日志对性能的影响: * 此配置会导致log日志不输出logger相关信息, 故在这里不做全局配置 */ System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); SpringApplication.run(SkyHelloApplication.class, args); } }
上述两种修改参数方式, 任选一种即可
②. 修改log4j2.xml配置中的Loggers节点如下:
增加 includeLocation="true" 属性, 否则日志不会输出%l相关详细信息
<Loggers> <logger name="com.sky.hello.mapper" level="debug" additivity="false" includeLocation="true"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> <AppenderRef ref="RollingFileError"/> </logger> <root level="info" includeLocation="true"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> <AppenderRef ref="RollingFileError"/> </root> </Loggers>
(2). 指定局部Logger节点配置异步
log4j2.xml配置文件中使用AsyncRoot/AsyncLogger替代Root/Logger
<Loggers> <!-- 异步日志配置: includeLocation: true表示输出logger相关行号信息 --> <AsyncLogger name="com.sky.hello.mapper" level="debug" additivity="false" includeLocation="true"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile"/> <AppenderRef ref="RollingFileError"/> </AsyncLogger> <AsyncRoot level="info" includeLocation="true"> <AppenderRef ref="Console"/> <AppenderRef ref="RollingFile" /> <AppenderRef ref="RollingFileError"/> </AsyncRoot> </Loggers>
上述2种方式任选其一即可,不要同时采用
如果异步日志配置成功, 程序启动后, 可在idea中查看到log4j2生成的异步日志输出线程:
5. 代码测试:
这里模拟一个启动类做一些日志输出
@Component public class StartHandler implements ApplicationRunner { private static final Logger LOG = LoggerFactory.getLogger(StartHandler.class); @Resource private HelloMapper helloMapper; @Override public void run(ApplicationArguments args) throws Exception { helloMapper.selectList(null); LOG.debug("我是 debug..."); LOG.info("我是 info..."); LOG.warn("我是 warn..."); LOG.error("我是 error..."); } }
控制台输出:
标签:集成,异步,Springboot,配置,boot,org,日志,log4j2 来源: https://www.cnblogs.com/Baker-Street/p/16170155.html