创建一个自定义的Logback Appender

Creating a Custom Logback Appender

1.简介

在本文中,我们将探讨创建自定义的Logback附加程序。 如果您正在寻找Java登录的介绍,请看一下这篇文章。

Logback附带了许多内置的附加器,它们可以写入标准输出,文件系统或数据库。 该框架的架构之美在于其模块化,这意味着我们可以轻松地对其进行自定义。

在本教程中,我们将重点介绍经典的logback,它需要以下Maven依赖项:

1
2
3
4
5
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

Maven Central上提供了此依赖关系的最新版本。

2.基本的Logback Appender

Logback提供了我们可以扩展以创建自定义附加程序的基类。

Appender 是所有附加程序都必须实现的通用接口。 通用类型为 ILoggingEvent AccessEvent ,具体取决于我们是否使用 logback-classic logback-access

我们的自定义附加程序应该扩展AppenderBase或UnsynchronizedAppenderBase 都实现 Appender 并处理诸如过滤器和状态消息之类的功能。

AppenderBase 是线程安全的; UnsynchronizedAppenderBase 子类负责管理其线程安全。

就像 ConsoleAppender FileAppender 都扩展 OutputStreamAppender 并调用超级方法 setOutputStream() ,如果自定义追加程序正在写入OutputStream ,则该自定义追加程序应将OutputStreamAppender子类化。

3.定制Appender

对于我们的自定义示例,我们将创建一个名为MapAppender的玩具附加器。 此附加程序会将所有记录事件插入到ConcurrentHashMap中,并带有密钥的时间戳。 首先,我们将子类化AppenderBase并将ILoggingEvent用作通用类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MapAppender extends AppenderBase<ILoggingEvent> {

    private ConcurrentMap<String, ILoggingEvent> eventMap
      = new ConcurrentHashMap<>();

    @Override
    protected void append(ILoggingEvent event) {
        eventMap.put(System.currentTimeMillis(), event);
    }
   
    public Map<String, ILoggingEvent> getEventMap() {
        return eventMap;
    }
}

接下来,要使MapAppender开始接收日志记录事件,让我们将其作为附加器添加到配置文件logback.xml中:

1
2
3
4
5
6
<configuration>
    <appender name="map" class="com.baeldung.logback.MapAppender"/>
    <root level="info">
        <appender-ref ref="map"/>
    </root>
</configuration>

4.设置属性

Logback使用JavaBeans自省来分析在附加程序上设置的属性。 我们的自定义附加程序将需要getter和setter方法,以使内省者可以找到并设置这些属性。

让我们向MapAppender添加一个属性,该属性为eventMap提供其键的前缀:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MapAppender extends AppenderBase<ILoggingEvent> {

    //...

    private String prefix;

    @Override
    protected void append(ILoggingEvent event) {
        eventMap.put(prefix + System.currentTimeMillis(), event);
    }

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    //...

}

接下来,在我们的配置中添加一个属性以设置此前缀:

1
2
3
4
5
6
7
8
9
<configuration debug="true">

    <appender name="map" class="com.baeldung.logback.MapAppender">
        <prefix>test</prefix>
    </appender>

    //...

</configuration>

5.错误处理

为了在创建和配置自定义追加程序时处理错误,我们可以使用从AppenderBase继承的方法。

例如,当prefix属性为null或空字符串时,MapAppender可以调用addError()并提早返回:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MapAppender extends AppenderBase<ILoggingEvent> {

    //...

    @Override
    protected void append(final ILoggingEvent event) {
        if (prefix == null ||"".equals(prefix)) {
            addError("Prefix is not set for MapAppender.");
            return;
        }

        eventMap.put(prefix + System.currentTimeMillis(), event);
    }

    //...

}

当在我们的配置中打开调试标志时,我们将在控制台中看到一个错误,警告我们尚未设置prefix属性:

1
2
3
4
5
<configuration debug="true">

    //...

</configuration>

六,结论

在本快速教程中,我们重点介绍了如何为Logback实现自定义附加程序。

像往常一样,可以在Github上找到该示例。