当前位置:   article > 正文

个人笔记Spring-boot 整合log4j2_logging.log4j.core

logging.log4j.core

今天我整合了log4j2到spring-boot,排了一整天的雷,记录一下。

 

整合过程很简单,

1,排除spring-boot原有的spring-boot-starter-logging,将log4j2的依赖引入

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-log4j2</artifactId>
  14. </dependency>

 

因为其他依赖里也会引这个,可以做个全局排除

  1. <!--全局排除spring-boot-starter-logging内的所有依赖-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-logging</artifactId>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>*</groupId>
  8. <artifactId>*</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

 

2,配置log4j2.xml, yml文件也可以

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration status="OFF">
  3. <appenders>
  4. <Console name="Console" target="SYSTEM_OUT">
  5. <!--只接受程序中DEBUG级别的日志进行处理-->
  6. <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
  7. <PatternLayout pattern="[%d{HH:mm:ss.SSS}] %-5level %class{36} %L %M - %msg%xEx%n"/>
  8. </Console>
  9. <!--处理DEBUG级别的日志,并把该日志放到logs/debug.log文件中-->
  10. <!--打印出DEBUG级别日志,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
  11. <RollingFile name="RollingFileDebug" fileName="./logs/debug.log"
  12. filePattern="logs/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
  13. <Filters>
  14. <ThresholdFilter level="DEBUG"/>
  15. <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
  16. </Filters>
  17. <PatternLayout
  18. pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
  19. <Policies>
  20. <SizeBasedTriggeringPolicy size="500 MB"/>
  21. <TimeBasedTriggeringPolicy/>
  22. </Policies>
  23. </RollingFile>
  24. <!--处理INFO级别的日志,并把该日志放到logs/info.log文件中-->
  25. <RollingFile name="RollingFileInfo" fileName="./logs/info.log"
  26. filePattern="logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
  27. <Filters>
  28. <!--只接受INFO级别的日志,其余的全部拒绝处理-->
  29. <ThresholdFilter level="INFO"/>
  30. <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
  31. </Filters>
  32. <PatternLayout
  33. pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
  34. <Policies>
  35. <SizeBasedTriggeringPolicy size="500 MB"/>
  36. <TimeBasedTriggeringPolicy/>
  37. </Policies>
  38. </RollingFile>
  39. <!--处理WARN级别的日志,并把该日志放到logs/warn.log文件中-->
  40. <RollingFile name="RollingFileWarn" fileName="./logs/warn.log"
  41. filePattern="logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
  42. <Filters>
  43. <ThresholdFilter level="WARN"/>
  44. <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
  45. </Filters>
  46. <PatternLayout
  47. pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
  48. <Policies>
  49. <SizeBasedTriggeringPolicy size="500 MB"/>
  50. <TimeBasedTriggeringPolicy/>
  51. </Policies>
  52. </RollingFile>
  53. <!--处理error级别的日志,并把该日志放到logs/error.log文件中-->
  54. <RollingFile name="RollingFileError" fileName="./logs/error.log"
  55. filePattern="logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
  56. <ThresholdFilter level="ERROR"/>
  57. <PatternLayout
  58. pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %class{36} %L %M - %msg%xEx%n"/>
  59. <Policies>
  60. <SizeBasedTriggeringPolicy size="500 MB"/>
  61. <TimeBasedTriggeringPolicy/>
  62. </Policies>
  63. </RollingFile>
  64. <!--druid的日志记录追加器-->
  65. <RollingFile name="druidSqlRollingFile" fileName="./logs/druid-sql.log"
  66. filePattern="logs/$${date:yyyy-MM}/api-%d{yyyy-MM-dd}-%i.log.gz">
  67. <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] %-5level %L %M - %msg%xEx%n"/>
  68. <Policies>
  69. <SizeBasedTriggeringPolicy size="500 MB"/>
  70. <TimeBasedTriggeringPolicy/>
  71. </Policies>
  72. </RollingFile>
  73. </appenders>
  74. <loggers>
  75. <root level="DEBUG">
  76. <appender-ref ref="Console"/>
  77. <appender-ref ref="RollingFileInfo"/>
  78. <appender-ref ref="RollingFileWarn"/>
  79. <appender-ref ref="RollingFileError"/>
  80. <appender-ref ref="RollingFileDebug"/>
  81. <appender-ref ref="druidSqlRollingFile"/>
  82. </root>
  83. <!--记录druid-sql的记录-->
  84. <logger name="druid.sql.Statement" level="debug" additivity="false">
  85. <appender-ref ref="druidSqlRollingFile"/>
  86. </logger>
  87. <logger name="druid.sql" level="debug" additivity="false">
  88. <appender-ref ref="druidSqlRollingFile"/>
  89. </logger>
  90. <logger name="druid.sql" level="debug" additivity="false">
  91. <appender-ref ref="Console"/>
  92. </logger>
  93. <logger name="druid.sql.Statement" level="debug" additivity="false">
  94. <appender-ref ref="Console"/>
  95. </logger>
  96. <!--log4j2 自带过滤日志-->
  97. <Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
  98. <Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
  99. <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
  100. <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
  101. <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" />
  102. <Logger name="org.crsh.plugin" level="warn" />
  103. <logger name="org.crsh.ssh" level="warn"/>
  104. <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
  105. <Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
  106. <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
  107. <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
  108. <logger name="org.thymeleaf" level="warn"/>
  109. </loggers>
  110. </configuration>

3,在application.yml中引入配置文件

 

# log4j2 日志配置

logging:

config: classpath:log4j2.xml

 

本以为这样直接启动就可以了,可发现启动不了了·····

报这个错

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/core/appender/rolling/DirectFileRolloverStrategy

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(ClassLoader.java:760)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)

at java.net.URLClassLoader.access$100(URLClassLoader.java:73)

at java.net.URLClassLoader$1.run(URLClassLoader.java:367)

at java.net.URLClassLoader$1.run(URLClassLoader.java:361)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:360)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

at org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.decodeCacheFiles(PluginRegistry.java:181)

at org.apache.logging.log4j.core.config.plugins.util.PluginRegistry.loadFromMainClassLoader(PluginRegistry.java:119)

at org.apache.logging.log4j.core.config.plugins.util.PluginManager.collectPlugins(PluginManager.java:132)

at org.apache.logging.log4j.core.pattern.PatternParser.<init>(PatternParser.java:131)

at org.apache.logging.log4j.core.pattern.PatternParser.<init>(PatternParser.java:112)

at org.apache.logging.log4j.core.layout.PatternLayout.createPatternParser(PatternLayout.java:209)

at org.apache.logging.log4j.core.layout.PatternLayout.createSerializer(PatternLayout.java:123)

at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:111)

at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:58)

at org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:494)

at org.apache.logging.log4j.core.config.AbstractConfiguration.setToDefault(AbstractConfiguration.java:567)

at org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:47)

at org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:81)

at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:171)

at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:145)

at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:70)

at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:57)

at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:147)

at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)

at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)

at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:103)

at org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:43)

at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:42)

at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)

at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)

at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)

at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)

at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:273)

at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:179)

at com.gwmfc.cheetah.CheetahApplication.main(CheetahApplication.java:27)

Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.core.appender.rolling.DirectFileRolloverStrategy

at java.net.URLClassLoader$1.run(URLClassLoader.java:372)

at java.net.URLClassLoader$1.run(URLClassLoader.java:361)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:360)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

... 42 more

Disconnected from the target VM, address: '127.0.0.1:13969', transport: 'socket'

 

Process finished with exit code 1

 

百思不得其解,就去问了前辈,前辈推荐这个网站

https://www.findjar.com/class/com/groupbyinc/flux/common/apache/logging/log4j/core/appender/rolling/DirectFileRolloverStrategy.html

 

发现是差log4j-core这个依赖

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.10.0</version>

</dependency>

 

然后又换了个错

"C:\Program Files\Java\jdk1.8\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:12999,suspend=y,server=n -javaagent:C:\Users\zhangjinqi\.IntelliJIdea2018.2\system\captureAgent\debugger-agent.jar=file:/C:/Users/zhangjinqi/AppData/Local/Temp/capture2882.props -Dfile.encoding=UTF-8 -classpath C:\Users\zhangjinqi\AppData\Local\Temp\classpath1497961761.jar com.gwmfc.cheetah.CheetahApplication

Connected to the target VM, address: '127.0.0.1:12999', transport: 'socket'

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

SLF4J: Defaulting to no-operation (NOP) logger implementation

SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...

Disconnected from the target VM, address: '127.0.0.1:12999', transport: 'socket'

Exception in thread "main" java.lang.ClassCastException: org.apache.logging.log4j.simple.SimpleLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext

at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.getLoggerContext(Log4J2LoggingSystem.java:265)

at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.beforeInitialize(Log4J2LoggingSystem.java:132)

at org.springframework.boot.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:230)

at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:209)

at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)

at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)

at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)

at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:69)

at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:48)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:292)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)

at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)

at com.gwmfc.cheetah.CheetahApplication.main(CheetahApplication.java:27)

 

Process finished with exit code 1

 

网上说是需要排除这些依赖

log4j-to-slf4j-2.0.2.jar

log4j-to-slf4j-2.0.2-sources.jar

log4j-slf4j-impl-2.0.2.jar

log4j-slf4j-impl-2.0.2-sources.jar

我试了,没有任何卵用

不过是需要排除的 (次日又加上试了一遍)

次日加回的错误

后来终于找到是还差一个依赖log4j-api

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-api</artifactId>

<version>2.10.0</version>

</dependency>

 

项目终于正常启动了,日志文件也生成了。

 

可我正在沾沾自喜时,发现这生成的Druid的SQL是什么啊···

SQL呢···

又陷入了绝境·····经过一下午的冥思苦想

发现application.yml的filters配置写的是slf4j``可现在用的是log4j 就改了

 

SQL就正常输出了,但日志配置文件还需要修改,以保证日志文件和控制台都有SQL和参数输出

<!--记录druid-sql的记录-->

<logger name="druid.sql.Statement" level="debug" additivity="false">

<appender-ref ref="druidSqlRollingFile"/>

</logger>

<logger name="druid.sql" level="debug" additivity="false">

<appender-ref ref="druidSqlRollingFile"/>

</logger>

<logger name="druid.sql" level="debug" additivity="false">

<appender-ref ref="Console"/>

</logger>

<logger name="druid.sql.Statement" level="debug" additivity="false">

<appender-ref ref="Console"/>

</logger>

 

 

后来发现用logger.info什么输出的都不生效

因为程序用的还是slf4j的写法

private static Logger logger = LoggerFactory.getLogger(HiveService.class);

 

需要换成

private static Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

生效

 

 

 

 

 

 

2020.7.13

后来同事发现自己Druid的mybatis数据源映射失败,没报错但项目启动失败,找了好久才找到。

我觉得是自己的日志框架有问题

 

try {

SpringApplication.run(CheetahApplication.class, args);

} catch (Exception e) {

logger.error(e);

// System.out.println(e);

}

 

在启动类加这个解决

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/813274
推荐阅读
相关标签
  

闽ICP备14008679号