我们越来越接近Log4j 2 GA版本,因此,我们应该开始研究它会给我们带来什么。
我个人有很多理由对Log4j 2.0感到兴奋。 社区很棒,Apache许可证给了我很多自由,最后它受到Apache软件基金会的保护。 嘿,这是一个很棒的软件。
在过去的几周中,我围绕Log4j 2.0进行了很多讨论,并意识到有几个人喜欢他们可以轻松扩展框架。 在云时代,您可能想使用商业服务来收集日志,甚至使用您自己的服务。 今天,我们需要更加灵活地将日志发送到哪里,这就是Log4j 2.0所提供的。
使用Log4j 1和Logback,您可以通过扩展类和实现接口进行自定义。 仅此一项是可行的,但是提供您自己的配置元素并不是那么容易。
Log4j手册将其带到了重点:
通过在大多数配置声明中要求类属性,允许扩展Log4j1.x。 对于某些元素,尤其是PatternLayout,添加新的模式转换器的唯一方法是扩展PatternLayout类并通过代码添加它们。
使用Log4j 2.0,可以编写以下定制:
- 核心:您可以编写Appender,记录器或过滤器。
- 转换器:您可以转换一些LogEvent消息(例如:转换日期)
- 查找:查找一些资源(例如:从系统属性中获取一些值)
- 密钥提供者:您可以为日志提供加密功能
在许多情况下,Appender是最有趣的东西。 Appender是Log4js体系结构的最后一个元素,它实际上对Log-Event做一些事情 。 例如,一个Appender可能写入文件或将Log事件发送到数据库。
让我们看一下一个真正存在的琐碎Appender: File Appender 。
如果我们需要构建这样的东西,我们首先用@Plugin注释我们的类:
@Plugin(name = "File",
category = "Core",
elementType = "appender",
printObject = true)
public final class FileAppender
extends AbstractOutputStreamAppender<FileManager> {
最重要的是,注释将采用插件名称,其类别“ Core”和元素类型“ appender”,告诉log4j这将是一个追加器。 稍后将插件名称用于我们的配置文件。
至此,您几乎可以随意实现所需的任何东西。 您应该确保实现了Appender-interface 。 在FileAppender中,对AbstractOutputStreamAppender进行了扩展,它实现了Appender接口。 您实际上不需要这样做,但是这很有意义。 与其他框架不同,Log4j 2.0在后台使用字节数组进行操作,这使您可以做更多的事情。 您通常想保持这种传统。
对于您的Appender,您只需要做一件事:在Appenders类中实现一个Plugin-Factory。 File-Appender的简化版本如下:
@PluginFactory
public static FileAppender createAppender(
@PluginAttribute("fileName") final String fileName,
...
@PluginElement("Layout") Layout<? extends Serializable> layout,
@PluginElement("Filters") final Filter filter
...) {
// Do things...
return new FileAppender(
layout, filter, fileName, ...);
}
工厂方法使用@PluginFactory注释。 它是静态的,并创建Appender的实例。 工厂还处理配置。 它接受使用@PluginAttribute或@PluginElement注释的属性。 您可能会猜到,这些是您配置中的元素。 它可能看起来像这样:
<Configuration>
<Appenders>
<File name="File" fileName="target/mylog.log">
<PatternLayout>
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
...
@PluginAttribute从附加元素(在本例中为“文件”)中命名属性。 @PluginElement为嵌套元素命名,例如PatternLayout是Layout实例。
旁注:您可能已经注意到配置文件的可读性得到了提高。 这也是Log4j 2.0的新功能。 但是,如果您出于某些原因坚持使用严格的样式,则仍然可以按照这种方式编写配置:
<Appender type="File" name="File" fileName="target/mylog.log">
现在,假设我们有一个全新的插件,该插件位于公司的包装中。 我们如何使Log4j 2.0识别它? 对于Log4j 1来说,这并非微不足道,但对于新Log4j而言,它却很简单。
只需将一个或多个包含您的附加程序的软件包添加到配置中:
<Configuration packages="de.grobmeier.appenders">
将扫描软件包,如果找到了插件,则会添加它们。 如果您担心启动时间性能,甚至可以在构建时预加载插件 。
让我们回顾一下。 创建您自己的Log4j 2.0 Appender将需要三个步骤:
- 创建一个实现Appender并具有@Plugin批注的类
- 使用@PluginFactory批注创建静态方法
- 将您的附加程序添加到您的配置中
使用插件架构,甚至可以进行复杂的设置。 例如,您可以为NoSQL数据库创建一个抽象的“ NoSQL Appender”,然后基于此提供各种实现。 这已经是现实,因为Log4j支持MongoDB和CouchDB 。
如果您想了解有关这种高级用法的更多信息,建议您使用NoSQL软件包 。
祝您玩得开心,不要忘了我们很乐意在Log4j邮件列表中看到您所做的工作。
翻译自: https://www.javacodegeeks.com/2014/02/customizing-log4j-2-0.html