Creating a Custom Logback Appender
1.简介
在本文中,我们将探讨创建自定义的Logback附加程序。 如果您正在寻找Java登录的介绍,请看一下这篇文章。
Logback附带了许多内置的附加器,它们可以写入标准输出,文件系统或数据库。 该框架的架构之美在于其模块化,这意味着我们可以轻松地对其进行自定义。 span>
在本教程中,我们将重点介绍经典的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提供了我们可以扩展以创建自定义附加程序的基类。 span>
Appender span> 是所有附加程序都必须实现的通用接口。 通用类型为 span> ILoggingEvent span> 或 span> AccessEvent span> ,具体取决于我们是否使用 span> logback-classic span> 或 span> logback-access span> 。 span>
我们的自定义附加程序应该扩展AppenderBase或UnsynchronizedAppenderBase , span> 都实现 span> Appender span> 并处理诸如过滤器和状态消息之类的功能。 span>
AppenderBase span> 是线程安全的; span> UnsynchronizedAppenderBase span> 子类负责管理其线程安全。 span>
就像 span> ConsoleAppender span> 和 span> FileAppender span> 都扩展 span> OutputStreamAppender span> 并调用超级方法 span> setOutputStream() span> ,如果自定义追加程序正在写入OutputStream ,则该自定义追加程序应将OutputStreamAppender子类化。 span>
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上找到该示例。