[推荐]spring如何自定义加载logback.xml
参考URL: https://blog.csdn.net/static_coder/article/details/80276356
官网https://github.com/qos-ch/logback-extensions/wiki
在resources下面创建logback.xml文件,logback框架会自动加载这个配置文件。
但是如何引入自定义logback配置文件呢?方法如下:
<dependency>
<groupId>org.logback-extensions</groupId>
<artifactId>logback-ext-spring</artifactId>
<version>0.1.2</version>
</dependency>
logback-ext-spring是由官方提供的对Spring的支持,它的作用就相当于log4j中的Log4jConfigListener;用于解决与spring的结合。logback-ext-spring提供了一个日志监听器LogbackConfigListener 。
需要注意的是:日志的监听器和spring的核心监听器都是实现了ServletContextListener。
<bean id="logInitialization"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="ch.qos.logback.ext.spring.LogbackConfigurer" />
<property name="targetMethod" value="initLogging" />
<property name="arguments">
<value>classpath:logback-spring.xml</value>
</property>
</bean>
参考URL: https://www.jb51.net/article/168057.htm
在logback.xml中获取自定义属性值,主要是需要在加载前将对应的属性值进行设置,这样加载时才能有效获取。
有4种方式来实现logback.xml中获取自定义变量值:
第一种方式简单,但不能通过程序生成属性值,第二种方式稍显复杂
首先定义一个类,实现PropertyDefiner接口,可以通过继承PropertyDefinerBase会更方便
import ch.qos.logback.core.PropertyDefinerBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.UUID;
/***
* 将本地IP拼接到日志文件名中,以区分不同实例,避免存储到同一位置时的覆盖冲突问题
* @Author ronwxy
* @Date 2019/8/20 16:17
*/
public class IPLogDefiner extends PropertyDefinerBase {
private static final Logger LOG = LoggerFactory.getLogger(IPLogDefiner.class);
private String getUniqName() {
String localIp = null;
try {
localIp = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
LOG.error("fail to get ip...", e);
}
String uniqName = UUID.randomUUID().toString().replace("-", "");
if (localIp != null) {
uniqName = localIp + "-" + uniqName;
}
return uniqName;
}
@Override
public String getPropertyValue() {
return getUniqName();
}
}
然后在logback.xml中,添加 配置,指定属性名(本例中为localIP)及获取属性值的实现类,这样就可以在配置中通过 ${localIP}来引用该属性值了。在实现方法 getPropertyValue 中返回你需要生成的值,本例中是返回 本地IP-UUID 的形式。
定义一个实现LoggerContextListener接口的类,在start方法中,将需要设置的属性设置到logback的Context中,
ContextAwareBase是logback提供的,实现了Configurator的一些通用的方法
实现 LifeCycle 接口,意味着它们实现了 start()、stop()和 isStarted()方法。
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;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.UUID;
/***
* 第二种实现方式
*/
public class LoggerStartupListener extends ContextAwareBase
implements LoggerContextListener, LifeCycle {
private boolean started = false;
@Override
public void start() {
if (started) {
return;
}
Context context = getContext();
context.putProperty("localIP", getUniqName());
started = true;
}
private String getUniqName() {
String localIp = null;
try {
localIp = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
//LOG.error("fail to get ip...", e);
}
String uniqName = UUID.randomUUID().toString().replace("-", "");
if (localIp != null) {
uniqName = localIp + "-" + uniqName;
}
return uniqName;
}
//省略了其它函数
然后在logback.xml中,配置如上监听器类,这样就可以通过 ${localIP} 获取到上面 context.putProperty(“localIP”, getUniqName()); 设置的值了。
<configuration>
<!--<define name="localIP" class="com.cnbot.common.IPLogDefiner"/>-->
<contextListener class="cn.jboost.common.LoggerStartupListener"/>
<define name="localIP" class="com.cnbot.common.IPLogDefiner"/>
<appender name="interfaceLogFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoding>UTF-8</encoding>
<File>D:\\logs\\elk\\interface-${localIP}.log</File>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
# 省略了其它配置
这种方式能设置任意个数的属性值,比前一种方式灵活。
亲测,原作者该方法有效!
logback.xml读取spring的属性
参考URL: https://cloud.tencent.com/developer/article/1479576
官网示例:
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
<remoteHost>${fluentHost}</remoteHost>
...
</appender>
source的内容为application.properties中定义的信息,defaultValue为缺省值,name就是在这个配置文件中的变量名,scope固定值,使用${}来获取值。
从源码来理解slf4j的绑定,以及logback对配置文件的加载
参考URL: https://www.cnblogs.com/youzhibing/p/6849843.html
springboot 源码阅读之 logback-spring.xml 是在哪里加载的?
参考URL: https://blog.csdn.net/heshiyuan1406146854/article/details/100930734
Logback.xml 给变量指定默认值
参考URL: https://blog.csdn.net/weixin_30532987/article/details/95144958
Logback源码分析系列之一起来看logback源码
参考URL: https://blog.csdn.net/yinlongfei_love/article/details/80807321