SpringCloud整合log4j2总结

末蓝、 2021-11-10 07:34 448阅读 0赞

SpringCloud整合log4j2

  • 常用日志框架
  • 日志门面slf4j
  • 为什么要选用log4j2
  • 整合步骤

常用日志框架

  • java.util.logging:是JDK在1.4版本中引入的Java原生日志框架
  • Log4j:Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件等,可以控制每一条日志的输出格式,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。虽然已经停止维护了,但目前绝大部分企业都是用的log4j。
  • LogBack:是Log4j的一个改良版本
  • Log4j2:Log4j2已经不仅仅是Log4j的一个升级版本了,它从头到尾都被重写了

日志门面slf4j

上述介绍的是一些日志框架的实现,这里我们需要用日志门面来解决系统与日志实现框架的耦合性。SLF4J,即简单日志门面(Simple Logging Facade for Java),它不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志实现。

在这里插入图片描述
前面介绍的几种日志框架一样,每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性。

使用了slf4j后,对于应用程序来说,无论底层的日志框架如何变,应用程序不需要修改任意一行代码,就可以直接上线了。

为什么要选用log4j2

相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高于logback等10倍以上;利用jdk1.5并发的特性,减少了死锁的发生;

贴上几张网上的日志框架性能测评图:
在这里插入图片描述

  • 可以看到在同步日志模式下, Logback的性能是最糟糕的.
  • log4j2的性能无论在同步日志模式还是异步日志模式下都是最佳的.
    在这里插入图片描述
    log4j2优越的性能其原因在于log4j2使用了LMAX,一个无锁的线程间通信库代替了,logback和log4j之前的队列. 并发性能大大提升。

整合步骤

  1. 引入jar包

springboot默认是用logback的日志框架的,所以需要排除logback,不然会出现jar依赖冲突的报错。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions> <!-- 去除springboot默认的logback配置-->
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <!-- 加入log4j2配置 -->
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-log4j2</artifactId>
  15. </dependency>
  16. <!-- 如果引入一下依赖,也需要去除logback配置 -->
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter</artifactId>
  20. <exclusions>
  21. <exclusion>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-logging</artifactId>
  24. </exclusion>
  25. </exclusions>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-actuator</artifactId>
  30. <exclusions>
  31. <exclusion>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-logging</artifactId>
  34. </exclusion>
  35. </exclusions>
  36. </dependency>
  1. 配置文件
    如果自定义了文件名,需要在application.yml中配置
    默认名log4j2-spring.xml,就省下了在application.yml中配置

    logging.config = classpath:log4j2-dev.xml

  2. 配置文件模板

log4j是通过一个.properties的文件作为主配置文件的,而现在的log4j2则已经弃用了这种方式,采用的是.xml,.json或者.jsn这种方式来做,可能这也是技术发展的一个必然性,因为properties文件的可阅读性真的是有点差。这里给出一个模版,供大家参考。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
  3. <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
  4. <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
  5. <configuration status="INFO" monitorInterval="30">
  6. <!--<contextName>log4j2</contextName>-->
  7. <properties>
  8. <!--${sys:catalina.home}表示linux中环境变量中的tomcat根目录 用户主目录-->
  9. <!--原来用logback时候在统一配置中心也配置一个logging.path=/opt/tomcat-log/${spring.application.name} LOG_PATH是内置变量-->
  10. <!--${sys:user.home} 用户主目录-->
  11. <Property name="log_path">${sys:user.home}/logs</Property>
  12. <!-- 保留日志天数 D H M S 分别对应天 小时 分钟 秒 -->
  13. <property name="KEEP_LOG_DAY">60D</property>
  14. <!-- 日志切割的最小单位 -->
  15. <property name="EVERY_FILE_SIZE">5M</property>
  16. </properties>
  17. <!--先定义所有的appender -->
  18. <appenders>
  19. <console name="Console" target="SYSTEM_OUT">
  20. <!--输出日志的格式 -->
  21. <PatternLayout charset="UTF-8" pattern="[%d][%t][%p][%c:%L] %m%n"/>
  22. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
  23. </console>
  24. <!--这个输出控制台的配置 -->
  25. <!--<console name="Console" target="SYSTEM_OUT" follow="false">-->
  26. <!--<!–输出日志的格式 –>-->
  27. <!--<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />-->
  28. <!--</console>-->
  29. <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
  30. <RollingFile name="RollingFileInfo" fileName="${log_path}/info-latest.log" filePattern="${log_path}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log">
  31. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
  32. <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
  33. <!--<Filters>-->
  34. <!--<ThresholdFilter level="INFO"/>-->
  35. <!--<ThresholdFilter level="WARN" onMatch="DENY"-->
  36. <!--onMismatch="NEUTRAL"/>-->
  37. <!--</Filters>-->
  38. <PatternLayout charset="UTF-8" pattern="[%d][%t][%p][%c:%L] %m%n"/>
  39. <Policies>
  40. <!-- 归档每天的文件 -->
  41. <!--<TimeBasedTriggeringPolicy interval="1" modulate="true"/>-->
  42. <TimeBasedTriggeringPolicy />
  43. <!-- 限制单个文件大小 -->
  44. <SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
  45. </Policies>
  46. <!-- 限制每天文件个数 --> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了100 -->
  47. <DefaultRolloverStrategy max="256">
  48. <Delete basePath="${log_path}/" maxDepth="3">
  49. <IfFileName glob="*/*info*.log"/>
  50. <IfLastModified age="${KEEP_LOG_DAY}"/>
  51. </Delete>
  52. </DefaultRolloverStrategy>
  53. </RollingFile>
  54. <RollingFile name="RollingFileWarn" fileName="${log_path}/warn-latest.log" filePattern="${log_path}/$${date:yyyy-MM-dd}/warn-%d{yyyy-MM-dd}-%i.log">
  55. <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
  56. <!--<PatternLayout charset="UTF-8" pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />-->
  57. <PatternLayout charset="UTF-8" pattern="[%d][%t][%p][%c:%L] %m%n"/>
  58. <Policies>
  59. <TimeBasedTriggeringPolicy />
  60. <SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}" />
  61. </Policies>
  62. <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了100 -->
  63. <DefaultRolloverStrategy max="256">
  64. <Delete basePath="${log_path}/" maxDepth="3">
  65. <IfFileName glob="*/*warn*.log"/>
  66. <IfLastModified age="${KEEP_LOG_DAY}"/>
  67. </Delete>
  68. </DefaultRolloverStrategy>
  69. </RollingFile>
  70. <RollingFile name="RollingFileError" fileName="${log_path}/error-latest.log" filePattern="${log_path}/$${date:yyyy-MM-dd}/error-%d{yyyy-MM-dd}-%i.log">
  71. <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
  72. <!--<PatternLayout charset="UTF-8" pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />-->
  73. <PatternLayout charset="UTF-8" pattern="[%d][%t][%p][%c:%L] %m%n"/>
  74. <Policies>
  75. <TimeBasedTriggeringPolicy />
  76. <SizeBasedTriggeringPolicy size="1${EVERY_FILE_SIZE}" />
  77. </Policies>
  78. <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了100 -->
  79. <DefaultRolloverStrategy max="256">
  80. <Delete basePath="${log_path}/" maxDepth="3">
  81. <IfFileName glob="*/*error*.log"/>
  82. <IfLastModified age="180D"/>
  83. </Delete>
  84. </DefaultRolloverStrategy>
  85. </RollingFile>
  86. </appenders>
  87. <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
  88. <loggers>
  89. <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
  90. <logger name="org.springframework" level="INFO"></logger>
  91. <logger name="org.mybatis" level="DEBUG"></logger>
  92. <!--<root level="all">-->
  93. <root level="ALL">
  94. <appender-ref ref="Console" />
  95. <appender-ref ref="RollingFileInfo" />
  96. <appender-ref ref="RollingFileWarn" />
  97. <appender-ref ref="RollingFileError" />
  98. </root>
  99. <logger name="cn.timebusker.util" level="INFO">
  100. <appender-ref ref="RollingFileInfo" />
  101. </logger>
  102. </loggers>
  103. </configuration>

参考链接:Springboot整合log4j2日志全解

发表评论

表情:
评论列表 (有 0 条评论,448人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springboot整合log4j2

    相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高于logback等10倍以上;利用jdk1.5并发的特性,减少了死锁的发生;

    相关 Spring Boot 整合Log4j2

    写在前面 学习Log4j2与Spring Boot的整合是为了完成我的ELK体系中的日志生产这一部分,通过学习Log4j2中的语法以及定义规范来生产日志. 自定义日志