本文将介绍spring boot 项目如何由默认的logback日志转为log4j2的日志格式,日志配置文件将采用yaml格式,其中包括一些yaml踩过的坑介绍。

优化 说明
执行速度 Log4j 2.x 相对于 Log4j 1.x 和 Logback来说,具有更快的执行速度。一方面由于 重写了内部的实现,在某些特定的场景上面,甚至可以比之前的速度快上10倍。比如内部的消息队列采用了ArrayBlockingQueue,相对于原始的ArrayList和锁操作来说,管程类的消息队列拥有更好地性能。同时所需的内存更加少。这是因为Log4j 2.x 采用占位符的形式打印日志(类似于Slf4j门面日志的形式),会先判断一下日志的等级,然后再拼接要打印的内容。另一方面由于Log4j 2.x 充分利用Java 5的并发特性(主要是使用了一些concurrent包下锁),使得性能得到一定的改善,而Log4j 1.x和Logback很多地方还是用的重锁。
异步性能 Asynchronous Loggers是Log4j2新增的日志器,异步日志器在其内部实现采用了LMAX Disruptor(一个无锁的线程间通信库)技术,Disruptor主要通过环形数组结构、元素位置定位和精巧的无锁设计(CAS)实现了在高并发情形下的高性能。而且Log4j 2.x中Asynchronous Appenders作为Asynchronous Loggers工作的一部分,效果进行了增强。每次写入磁盘时,都会进行flush操作,效果和配置“immediateFlush=true”一样。该异步Appender内部采用ArrayBlockingQueue的方式。RandomAccessFileAppender采用ByteBuffer+RandomAccessFile替代了BufferedOutputStream,官方给出的测试数据是它将速度提升了20-200%。
自动加载配置文件 Log4j 2.x 和Logback都新增了自动加载日志配置文件的功能,又与Logback不同,配置发生改变时不会丢失任何日志事件。当Log4j 2.x中配置发生改变时,如果还有日志事件尚未处理,Log4j 2会继续处理,当处理完成后,Logger会重新指向新配置的LoggerConfig对象,并且删除无用的对象。
死锁问题的解决 在Log4j 1.x中同步写日志的时候,在高并发情况下出现死锁导致cpu使用率异常飙升。其中的原因是当一个进程写日志的时候需要获取到Logger和Appender。org.apache.log4j.Logger类继承于org.apache.log4j.Category、Appender继承于org.apache.log4j.AppenderSkeleton。通过Log4j 1.x中Category源码和Appender源码可以知道,当多线程并发时,可能会因为相互持有Logger和Appender发生死锁。 而在log4j 2.x中充分利用Java5的并发支持,并且以最低级别执行锁定。

日志由logback替换为log4j2
去除自带的jar

<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>

添加log4j2的jar包

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- 加上这个才能辨认到log4j2.yml文件 -->
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

在所有项目中引用到logback的包都去除

<exclusions><exclusion><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></exclusion>
</exclusions>

spring boot 默认配置文件参数设置
设置日志的位置,默认是放在resource根目录下面的

logging.config=classpath:log4j2.yml

log4j2.yml

 # 共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
Configuration:status: warnmonitorInterval: 30Properties: # 定义全局变量Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:#测试:-Dlog.level.console=warn -Dlog.level.xjj=trace#生产:-Dlog.level.console=warn -Dlog.level.xjj=info- name: log.level.consolevalue: info- name: log.pathvalue: log- name: project.namevalue: endeavour- name: log.patternvalue: "%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%15.15t] %-30.30C{1.} : %m%n"Appenders:Console:  #输出到控制台name: CONSOLEtarget: SYSTEM_OUTPatternLayout:pattern: ${log.pattern}#   启动日志RollingFile:- name: ROLLING_FILEfileName: ${log.path}/${project.name}.logfilePattern: "${log.path}/historyRunLog/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"PatternLayout:pattern: ${log.pattern}Filters:#        一定要先去除不接受的日志级别,然后获取需要接受的日志级别ThresholdFilter:- level: erroronMatch: DENYonMismatch: NEUTRAL- level: infoonMatch: ACCEPTonMismatch: DENYPolicies:TimeBasedTriggeringPolicy:  # 按天分类modulate: trueinterval: 1DefaultRolloverStrategy:     # 文件最多100个max: 100#   平台日志- name: PLATFORM_ROLLING_FILEignoreExceptions: falsefileName: ${log.path}/platform/${project.name}_platform.logfilePattern: "${log.path}/platform/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"PatternLayout:pattern: ${log.pattern}Policies:TimeBasedTriggeringPolicy:  # 按天分类modulate: trueinterval: 1DefaultRolloverStrategy:     # 文件最多100个max: 100#   业务日志- name: BUSSINESS_ROLLING_FILEignoreExceptions: falsefileName: ${log.path}/bussiness/${project.name}_bussiness.logfilePattern: "${log.path}/bussiness/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"PatternLayout:pattern: ${log.pattern}Policies:TimeBasedTriggeringPolicy:  # 按天分类modulate: trueinterval: 1DefaultRolloverStrategy:     # 文件最多100个max: 100#   错误日志- name: EXCEPTION_ROLLING_FILEignoreExceptions: falsefileName: ${log.path}/exception/${project.name}_exception.logfilePattern: "${log.path}/exception/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"ThresholdFilter:level: erroronMatch: ACCEPTonMismatch: DENYPatternLayout:pattern: ${log.pattern}Policies:TimeBasedTriggeringPolicy:  # 按天分类modulate: trueinterval: 1DefaultRolloverStrategy:     # 文件最多100个max: 100#   DB 日志- name: DB_ROLLING_FILEignoreExceptions: falsefileName: ${log.path}/db/${project.name}_db.logfilePattern: "${log.path}/db/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"PatternLayout:pattern: ${log.pattern}Policies:TimeBasedTriggeringPolicy:  # 按天分类modulate: trueinterval: 1DefaultRolloverStrategy:     # 文件最多100个max: 100​
Loggers:Root:level: infoAppenderRef:- ref: CONSOLE- ref: ROLLING_FILE- ref: EXCEPTION_ROLLING_FILELogger:- name: platformlevel: infoadditivity: falseAppenderRef:- ref: CONSOLE- ref: PLATFORM_ROLLING_FILE- name: bussinesslevel: infoadditivity: falseAppenderRef:- ref: BUSSINESS_ROLLING_FILE- name: exceptionlevel: debugadditivity: trueAppenderRef:- ref: EXCEPTION_ROLLING_FILE- name: dblevel: infoadditivity: falseAppenderRef:- ref: DB_ROLLING_FILE​#    监听具体包下面的日志#    Logger: # 为com.xjj包配置特殊的Log级别,方便调试#      - name: com.xjj#        additivity: false#        level: ${sys:log.level.xjj}#        AppenderRef:#          - ref: CONSOLE#          - ref: ROLLING_FILE​

日志获取工具类

package com.lck.demo.endeavour.util;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 本地日志参考类** @author ckli01* @date 2018/5/8*/
public class LogUtils {/*** 获取业务日志logger** @return*/public static Logger getBussinessLogger() {return LoggerFactory.getLogger(LogEnum.BUSSINESS.getCategory());}/*** 获取平台日志logger** @return*/public static Logger getPlatformLogger() {return LoggerFactory.getLogger(LogEnum.PLATFORM.getCategory());}/*** 获取数据库日志logger** @return*/public static Logger getDBLogger() {return LoggerFactory.getLogger(LogEnum.DB.getCategory());}/*** 获取异常日志logger** @return*/public static Logger getExceptionLogger() {return LoggerFactory.getLogger(LogEnum.EXCEPTION.getCategory());}
}

枚举类:

package com.lck.demo.endeavour.util;/*** 本地日志枚举** @author ckli01* @date 2018/5/8*/public enum  LogEnum {BUSSINESS("bussiness"),PLATFORM("platform"),DB("db"),EXCEPTION("exception"),;private String category;
​    LogEnum(String category) {this.category = category;}public String getCategory() {return category;}public void setCategory(String category) {this.category = category;}}

转载地址:https://blog.csdn.net/xulele_csdn/article/details/85072338

Spring boot 日志分档基于log4j2.yml 配置文件相关推荐

  1. ELK 处理 Spring Boot 日志,妙!

    以下文章来源方志朋的博客,回复"666"获面试宝典 在排查线上异常的过程中,查询日志总是必不可缺的一部分.现今大多采用的微服务架构,日志被分散在不同的机器上,使得日志的查询变得异常 ...

  2. ELK 处理 Spring Boot 日志,有点强悍!

    在排查线上异常的过程中,查询日志总是必不可缺的一部分.现今大多采用的微服务架构,日志被分散在不同的机器上,使得日志的查询变得异常困难.工欲善其事,必先利其器.如果此时有一个统一的实时日志分析平台,那可 ...

  3. 54. spring boot日志升级篇—logback【从零开始学Spring Boot】

    在<44. Spring Boot日志记录SLF4J>章节中有关相关的介绍,这里我们在深入的了解下logback框架. 为什么要使用logback ? --在开发中不建议使用System. ...

  4. 让你的spring-boot应用日志随心所欲--spring boot日志深入分析

    1.spring boot日志概述 spring boot使用Commons Logging作为内部的日志系统,并且给Java Util Logging,Log4J2以及Logback都提供了默认的配 ...

  5. Spring Boot 日志(八)

    一.日志框架的选择 市面上常见的日志框架有很多,它们可以被分为两类:日志门面(日志抽象层)和日志实现,如下表: 通常情况下,日志由一个日志门面与一个日志实现组合搭建而成,Spring Boot 选用 ...

  6. Spring Boot日志集成

    Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用 ...

  7. Spring Boot 日志管理

    在代码有问题的时候,很多人应该都是通过 debug 的方式去排查,往往忽略了日志的重要性. 好的日志管理可以快速定位问题出现的位置,也可以提高代码的阅读性.这篇博文主要介绍一下 Spring Boot ...

  8. springboot日志写入mysql_44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】

    学院中有Spring Boot相关的课程!点击「阅读原文」进行查看! SpringSecurity5.0视频:http://t.cn/A6ZadMBe Sharding-JDBC分库分表实战: 在开发 ...

  9. Java Spring Boot VS .NetCore (七) 配置文件

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

最新文章

  1. 柯南君:看大数据时代下的IT架构(4)消息队列之RabbitMQ--案例(Helloword起航)...
  2. .Net Core 3.0依赖注入替换 Autofac
  3. 软件系统架构~软件架构概念
  4. [HTML/CSS]浮动的那点事儿
  5. C++继承:公有,私有,保护
  6. insmod: can‘t insert ‘xx.ko‘: File exists 问题解决
  7. 微信小程序原生自定义弹窗
  8. iptables工作原理及iptables命令行使用介绍
  9. 史上最全的开源库整理
  10. Flutter Animation 3D仿真书本翻页动画效果
  11. java随机生成数字和字母_使用java如何生成随机的字母数字字符串?
  12. Unity项目进阶之保卫萝卜
  13. uniapp 视频video 播放 白屏 android
  14. 【mysql-日志】清理二进制日志文件
  15. 与【孤尽】老师交流总结
  16. c语言输入1个数字正数负数零的个数,输入n个整数,求输入正数之和,负数之和,并统计相应正数和负数的个数,以输入0表示输入结束....
  17. 六-体系结构 Architecture
  18. 计算机导论二进制小数乘法,二进制计算
  19. java mapper找不到resources下的mapper
  20. 信息学奥赛一本通 1244:和为给定数 通过

热门文章

  1. 大学计算机网络配置实验报告,北京理工大学-计算机网络实践-IP路由配置与路由协议分析实验报告.docx...
  2. Js push整个数组
  3. 电脑版微信怎么双开、多开 超级简单
  4. 苏州 计算机 在职研究生,苏州地区,可以报考哪些在职研究生院校!
  5. 中国为什么要买美国国债
  6. layui 集成手写签名
  7. AQI(空气质量指数)分析与预测(四)
  8. 一个有用的Win32消息处理宏HANDLE_MSG
  9. [AV1] AV1 Video Codec
  10. FastDFS合并存储策略