在logback.xml中自定义动态属性的方法

当使用logback来记录Web应用的日志时,我们通过在logback.xml中配置appender来指定日志输出格式及输出文件路径,这在一台主机或一个文件系统上部署单个实例没有问题,但是如果部署多个实例(比如通过容器的方式),多个实例同时往同一文件写日志可能就会引起问题。这时可以将每个实例的日志文件加以区分,如IP或UUID,或两者结合的形式。这其实就涉及如何在logback.xml中自定义动态属性的问题。

可以有4种方式来实现logback.xml中获取自定义变量值:

  • 通过设置环境变量或传递系统属性(比如在程序启动时通过-D传递)的方式,两者是可以直接在logback.xml中通过 ${变量名} 获取的。
  • 自定义logback.xml的加载时机,在其加载前将需要设置的属性注入到logback的context中,这种方式相对复杂,本文不讨论。
  • 通过实现PropertyDefiner接口来提供属性值设置
  • 通过实现LoggerContextListener接口来设置属性值

第一种方式简单,但不能通过程序生成属性值,第二种方式稍显复杂,本文主要介绍后两种方式。

PropertyDefiner方式

首先定义一个类,实现PropertyDefiner接口,可以通过继承PropertyDefinerBase会更方便

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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 的形式。

1

2

3

4

5

6

7

8

9

10

<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中,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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()); 设置的值了。

1

2

3

4

5

6

7

8

9

10

11

12

13

<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中获取自定义属性值,主要是需要在加载前将对应的属性值进行设置,这样加载时才能有效获取。本文虽是自定义日志文件名称,但不局限于此,所有需要动态获取的变量都可以按这种方式实现。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以在logback.xml文件的```<configuration>```标签内添加您需要的内容。比如,如果您想配置一个新的日志记录器,您可以添加以下代码: ``` <logger name="com.example.package"> <level value="DEBUG"/> </logger> ``` 这段代码将会配置名为"com.example.package"的日志记录器,并设置其日志级别为DEBUG。 另外,如果您想配置一个新的appender(日志输出目的地),您可以添加以下代码: ``` <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>/var/log/example.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> ``` 这段代码将会配置一个名为"FILE"的文件appender,并将日志写入```/var/log/example.log```文件。 ### 回答2: 要向logback.xml添加内容,需要按照以下步骤进行操作: 1. 打开logback.xml文件:首先找到存储logback.xml文件的位置,通常是在项目的src/main/resources目录下,用文本编辑器打开该文件。 2. 添加新的配置节点:根据所需的功能,可以在logback.xml添加不同的配置节点。例如,如果要添加一个新的appender,可以在<configuration>节点下添加新的<appender>节点,设置节点的属性,如名称和类型。 3. 配置新节点的属性和值:在添加的新节点,可以根据需要配置不同的属性和值。例如,给新的<appender>节点设置File属性,指定日志文件的路径和名称。 4. 配置新节点的布局:在新节点,可以通过添加<layout>节点来配置日志的格式和布局。例如,可以通过添加<PatternLayout>节点来设置日志的输出格式,如时间、日志级别和消息。 5. 将新节点与已存在的节点关联:如果新添加的节点需要与已存在的节点进行关联,可以通过在配置文件的适当位置添加关联标签。例如,将新的<appender>节点与<root>节点关联,可以在<root>节点添加<appender-ref>子节点,指定关联的<appender>节点的名称。 6. 保存并关闭logback.xml文件:在完成所有的配置后,保存并关闭logback.xml文件。 7. 重启应用程序:使新的配置生效,需要重新启动应用程序。 通过以上步骤,可以向logback.xml文件添加新的内容,实现不同的日志配置和功能的扩展。 ### 回答3: 要向logback.xml添加内容,可以按照以下步骤进行操作: 1. 打开logback.xml文件,通常它位于项目的资源文件夹下(如src/main/resources)或类路径根目录。 2. 在文件找到需要添加内容的位置。根据logback.xml的结构,通常会有一个或多个appender的配置,可以在其添加自定义的日志输出。 3. 在找到的位置下方插入要添加的内容。可以根据需要添加新的appender或修改现有的appender配置。 4. 对于添加新的appender,需要包含appender的配置内容。这些配置内容可以根据具体需要进行调整,如设置日志输出的文件路径、日志格式、滚动策略等。可以参考logback官方文档或其他资源来了解各个配置参数的含义和使用方法。 5. 对于已存在的appender,可以添加或修改具体的配置参数,如日志输出级别、日志输出目标等。同样,需要根据具体需求进行调整。 6. 保存并关闭logback.xml文件。 注意事项: - 添加内容时需要保持logback.xml的结构正确,确保新内容的配置在适当的位置插入,不要破坏原有的配置。 - 需要注意appender的名称不能重复,如果添加了重复的名称会导致配置加载失败。 - 修改logback.xml后,可能需要重新启动应用程序才能使修改生效。 综上所述,向logback.xml添加内容需要打开该文件并在适当的位置添加配置,可以添加新的appender或修改现有的配置参数。完成后保存文件并重新启动应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值