⽇志分割
Springboot Logback⽇志使⽤,Springboot Logback详细配置和⽇志分割Springboot Logback springProperty使⽤,Springboot Logback区分环境
================================©Copyright 蕃薯耀 2020-12-23
⼀、引⼊Logback⽇志的maven依赖:logback-classic
⼆、Springboot Logback 区分环境配置:1、application.properties:
spring.profiles.active=dev
server.port=6000
server.servlet.context-path=/logback
2、application-dev.properties:
logging.config=classpath:logback-spring-dev.xml
3、application-test.properties:
logging.config=classpath:logback-spring-test.xml
4、application-prod.properties:
logging.config=classpath:logback-spring-prod.xml
通过logging.config设置Springboot使⽤的⽇志配置⽂件,这样每个环境都可以使⽤不能的配置。如果不区分环境,可以直接命名为:logback-spring.xml,这样Springboot会⾃动加载。
三、Springboot Logback.xml 配置⽂件详细设置:1、logback-spring-dev.xml
2、logback-spring-test.xml
3、logback-spring-prod.xml
四、logback监听器的使⽤(LogbackStartupListener.java)在logback的xml配置⽂件中,有⼀个监听器的配置:
类⽂件: package com.lqy.log.listener; import org.springframework.util.StringUtils; import ch.qos.logback.classic.Level;import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.LoggerContextListener;import ch.qos.logback.core.Context; import ch.qos.logback.core.spi.ContextAwareBase;import ch.qos.logback.core.spi.LifeCycle; public class LogbackStartupListener extends ContextAwareBase implements LoggerContextListener, LifeCycle { @Override public void start() { //log.info(\"LogbackStartupListener start()\"); String userDir = System.getProperty(\"user.dir\"); String osName = System.getProperty(\"os.name\"); String osVersion = System.getProperty(\"os.version\"); String javaVersion = System.getProperty(\"java.version\"); String weblogicName = System.getProperty(\"weblogic.Name\"); System.out.println(\"userDir===\" + userDir); System.out.println(\"osName===\" + osName); System.out.println(\"osVersion===\" + osVersion); System.out.println(\"javaVersion===\" + javaVersion); System.out.println(\"weblogicName===\" + weblogicName); if(StringUtils.isEmpty(weblogicName)) { weblogicName = \"notWeblogic\"; } System.out.println(\"weblogicName2===\" + weblogicName); Context context = getContext(); context.putProperty(\"weblogicName\ } @Override public void stop() { //log.info(\"LogbackStartupListener stop()\"); } @Override public boolean isStarted() { return false; } @Override public boolean isResetResistant() { return false; } @Override public void onStart(LoggerContext context) { //log.info(\"LogbackStartupListener onStart()\"); } @Override public void onReset(LoggerContext context) { //log.info(\"LogbackStartupListener onReset()\"); } @Override public void onStop(LoggerContext context) { //log.info(\"LogbackStartupListener onStop()\"); } @Override public void onLevelChange(Logger logger, Level level) { //log.info(\"LogbackStartupListener onLevelChange()\"); }} 1、为什么要使⽤监听器: 通过监听器,可以往logback的context注⼊变量,如系统环境变量(os.name),这样在配置⽂件就能通过${os.name}直接引⼊使⽤变量的值。 如⽰例中引⼊了weblogic容器的服务名称:weblogic.Name String weblogicName = System.getProperty(\"weblogic.Name\");context.putProperty(\"weblogicName\ xml引⼊使⽤就是:${weblogicName}使⽤如下: 五、logback通过springProperty标签使⽤Springboot配置⽂件中的变量1、logback引⼊Springboot配置⽂件的环境变量name:⾃定义别名 source:对应Springboot配置⽂件中的属性名 使⽤: ${springProfilesActive}⽰例: 2、logback使⽤springProperty标签可能存在的问题报错: no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]详细错误如下: Logging system failed to initialize using configuration from 'classpath:logback-test.xml'java.lang.IllegalStateException: Logback configuration error detected: ERROR in ch.qos.logback.core.joran.spi.Interpreter@13:83 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]] at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169) at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithSpecificConfig(AbstractLoggingSystem.java:66) at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:57) at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:118) at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:310) at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:281) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:239) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:216) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:80) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345) at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) at com.lqy.log.LogbackApplication.main(LogbackApplication.java:10) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [classpath:logback-test.xml][notWeblogic][ERROR] [2020-12-22 10:39:29.409] org.springframework.boot.SpringApplication.reportFailure:837Application run failed 原因: logback最开始使⽤的命名是:logback-test.xml,这样会导致出错。 SpringBoot 会在 classpath 下查找是否有logback的 jar包,存在jar包,然后检查配置⽂件,包含 logback-test.groovy、logback-test.xml、logback.groovy 或者 logback.xml,如果都找不到的话,才会加载项⽬路径下的 logback-spring.xml。 如果命名为logback-test.xml,logback会优先SpringBoot加载完,导致加载不到SpringBoot配置⽂件的变量⽽报错。 解决⽅案:⽅案⼀(⾸选): 简单的解决⽅法,就是重命名,改成:logback-spring-test.xml ⽅案⼆: 不使⽤springProperty标签,通过LogbackStartupListener注⼊相关的变量,上⾯已经说到。 六、测试logback⽇志: import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RequestMapping(\"/\")@RestController public class LogController { private static final Logger log = LoggerFactory.getLogger(LogController.class); @RequestMapping(\"log\") public String log() { String time = new Date().getTime() + \"\"; log.info(time); log.info(\"{} + {} is {}\ log.warn(\"{} + {} is not {}\ String weblogicName = System.getProperty(\"weblogic.Name\"); log.error(\"weblogicName==={}\ return \"ok,时间=\" + time + \",weblogicName=\" + weblogicName; }} (如果⽂章对您有帮助,欢迎捐赠,^_^)================================©Copyright 蕃薯耀 2020-12-23 因篇幅问题不能全部显示,请点此查看更多更全内容