个人笔记Spring-boot 整合log4j2

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

 

整合过程很简单,

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


            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.springframework.boot
                    spring-boot-starter-logging
                
            
        
        
            org.springframework.boot
            spring-boot-starter-log4j2
        

 

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





org.springframework.boot

spring-boot-starter-logging





*

*





 

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



    

        
            
            
            
        

        
        
        
            
                
                
            
            
            
                
                
            
        

        
        
            
                
                
                
            
            
            
                
                
            
        

        
        
            
                
                
            
            
            
                
                
            
        

        
        
            
            
            
                
                
            
        

        
        
            
            
                
                
            
        
    

    
        
            
            
            
            
            
            
        

        
        
            
        
        
            
        
        
            
        
        
            
        

        
        
        
        
        
        
        
        
        
        
        
        
        
    

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.(PatternParser.java:131)

at org.apache.logging.log4j.core.pattern.PatternParser.(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.(PatternLayout.java:111)

at org.apache.logging.log4j.core.layout.PatternLayout.(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.(DefaultConfiguration.java:47)

at org.apache.logging.log4j.core.LoggerContext.(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.(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这个依赖

org.apache.logging.log4j

log4j-core

2.10.0

 

然后又换了个错

"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

我试了,没有任何卵用

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

次日加回的错误

个人笔记Spring-boot 整合log4j2_第1张图片

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

org.apache.logging.log4j

log4j-api

2.10.0

 

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

 

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

个人笔记Spring-boot 整合log4j2_第2张图片

SQL呢···

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

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

 

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

 

 

后来发现用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);

}

 

在启动类加这个解决

 

你可能感兴趣的:(java,spring,boot)