如何在logback.xml中自定义动态属性
原文地址:http://blog.jboost.cn/trick-logback-prop.html
当使用logback来记录Web应用的日志时,我们通过在logback.xml中配置appender来指定日志输出格式及输出文件路径,这在一台主机或一个文件系统上部署单个实例没有问题,但是如果部署多个实例(比如通过容器的方式),多个实例同时往同一文件写日志可能就会引起问题。这时可以将每个实例的日志文件加以区分,如IP或UUID,或两者结合的形式。这其实就涉及如何在logback.xml中自定义动态属性的问题。
可以有4种方式来实现logback.xml中获取自定义变量值:
- 通过设置环境变量或传递系统属性(比如在程序启动时通过-D传递)的方式,两者是可以直接在logback.xml中通过
${变量名}
获取的。 - 自定义logback.xml的加载时机,在其加载前将需要设置的属性注入到logback的context中,这种方式相对复杂,本文不讨论。
- 通过实现PropertyDefiner接口来提供属性值设置
- 通过实现LoggerContextListener接口来设置属性值
第一种方式简单,但不能通过程序生成属性值,第二种方式稍显复杂,本文主要介绍后两种方式。
PropertyDefiner方式
首先定义一个类,实现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中,添加 <define>
配置,指定属性名(本例中为localIP)及获取属性值的实现类,这样就可以在配置中通过 ${localIP}
来引用该属性值了。在实现方法 getPropertyValue
中返回你需要生成的值,本例中是返回 本地IP-UUID
的形式。
<configuration>
<define name="localIP" class="cn.jboost.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>
# 省略了其它配置
LoggerContextListener方式
定义一个实现LoggerContextListener接口的类,在start方法中,将需要设置的属性设置到logback的Context中,
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; /***
* 第二种实现方式
* @Author ronwxy
* @Date 2019/8/20 18:45
*/
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中获取自定义属性值,主要是需要在加载前将对应的属性值进行设置,这样加载时才能有效获取。本文虽是自定义日志文件名称,但不局限于此,所有需要动态获取的变量都可以按这种方式实现。
如果觉得有帮助,请帮忙转发、推荐。欢迎关注我的微信公众号:jboost-ksxy
———————————————————————————————————————————————————————————————
如何在logback.xml中自定义动态属性的更多相关文章
- SpringBoot在logback.xml中读取application.properties中配置的日志路径
1.在springboot项目中使用logback记录日志,在logback.xml中配置日志存储位置时读取application.properties中配置的路径,在 logback.xml中配置引 ...
- JavaWeb 如何在web.xml中配置多个servlet
15:34:42 <servlet> <description></description> <display-name>ListMusicServle ...
- 如何在spingboot项目中自定义自己的配置
在实际开发中,为了方便我们常常会考虑把配置文件的某一类配置映射到配置类上,方便spring容器加载,实现方法如下: 1. 书写配置文件信息:书写某一类特定字段开头的配置信息,例如在yml配置文件中可以 ...
- web.xml中自定义Listener
Listener可以监听容器中某一执行动作,并根据其要求做出相应的响应. 常用的Web事件的监听接口如下: ServletContextListener:用于监听Web的启动及关闭 ServletCo ...
- 如何在 Fiddler Script 中 自定义 修改 Request 、 Response
Fiddler是一个http协议调试代理工具,方便进行http请求的拦截处理.改写请求.返回值等. 在Rules菜单下: 此次更改请求 头 ,so go to OnBeforeRequest 或者 ...
- tomcat如何在server.xml中配置contexts
https://tomcat.apache.org/tomcat-8.5-doc/deployer-howto.html#A_word_on_Contexts 例如你的程序 名字是hello端口是80 ...
- Logback.xml 给变量指定默认值
随着通用日志组件转入 Slf4j,logback 也变成了默认的日志实现,像 log4j 一样,logback.xml 中也可以使用系统属性或环境变量,如 ${catalina.home}.在 log ...
- logback.xml sql语句输出
在使用springBoot框架之后,日志配置文件变成了logback.xml,输出sql语句的方法为: <!-- 打印sql语句 --> <logger name="com ...
- 在pom.xml中使用distributionManagement将项目打包上传到nexus私服
本文介绍 如何在pom.xml中使用distributionManagement将项目打包上传到nexus私服 1.pom.xml文件添加distributionManagement节点 <!- ...
随机推荐
- Single Thread Execution设计模式
public class Test { public static void main(String[] args){ // FlightSercurityTest.test(); // EatNoo ...
- PG利用Multicorn访问CSV外部数据源
Multicorn 是一个 PostgreSQL 9.1+ 的扩展模块,用于简化外部数据封装开发,允许开发者使用 Python 编程语言开发. Install Multicorn Requiremen ...
- 洛谷P2172 [国家集训队]部落战争 题解
题目链接:https://www.luogu.org/problemnew/show/P2172 分析: 不要被[国家集训队]的标签吓到,其实这题不是很难. 本题可以对比P4304 [TJOI2013 ...
- canvas动画:气泡上升效果
HTML5中的canvas真是个很强大的东西呢! 这几天突发奇想想做一个气泡上升的动画,经过许久的思考和多次失败,终于做出了如下效果 由于是录制的gif图,看着会有点卡顿,实际演示是很自然的 想要做出 ...
- 个人永久性免费-Excel催化剂功能第73波-数据转换:单行多项目转多行单项目
数据分析的前半部分数据处理.转换等工作是一个又脏又累的活,默默地干着,却又不出彩让人看到过程的艰辛和成果.如何让这个过程可以更加轻松一点,是Excel催化剂为大家所想的,今天带来一大刚需的数据转换功能 ...
- 机器学习-FP Tree
接着是上一篇的apriori算法: FP Tree数据结构 为了减少I/O次数,FP Tree算法引入了一些数据结构来临时存储数据.这个数据结构包括三部分,如下图所示 第一部分是一个项头表.里面记录了 ...
- sql注入篇2
一.前言 上一篇:sql注入篇1 二.基于回显的注入类型判断 1.有结果的注入 例如下图: (sqlllab less-1)可以看到有正常结果返回,对于的利用方式就是老套路了,先order by查询出 ...
- mpvue的使用,包含axios、router的集成等完美结合小程序
mpvue开发微信小程序框架的使用注意事项: 1.路由跳转,引用mpvue-router-patch 在main.js文件中引入控件:import MpvueRouterPatch from 'mpv ...
- Python识别璇玑图中诗的数量
一.璇玑图简介 璇玑图的读法有很多,这里我使用七七棋盘格的读法,在璇玑图中分离出一个七七棋盘格,如下表 吏 官 同 流 污 合 玩 痞 悍 蒙 骗 造 假 蛋 鸡 宴 请 客 友 朋 远 戚 偏 正 ...
- JavaScript基础学习第六天
目标: 能够使用对象的方式处理数据 ☞ 代码预解析: 1. 变量提升 :当程序中遇到定义变量后,就会将该变量的定义提升到当前作用域的开始位置,不包括变量的赋值 2. 函数提升:当程序中遇到函数的声明时 ...