自定义Log4j 2.0

我们越来越接近Log4j 2 GA版本,因此,我们应该开始研究它会给我们带来什么。

我个人有很多理由对Log4j 2.0感到兴奋。 社区很棒,Apache许可证给了我很多自由,最后它受到Apache软件基金会的保护。 嘿,这是一个很棒的软件。

在过去的几周中,我围绕Log4j 2.0进行了很多讨论,并意识到有几个人喜欢他们可以轻松扩展框架。 在云时代,您可能想使用商业服务来收集日志,甚至使用您自己的服务。 今天,我们需要更加灵活地将日志发送到哪里,这就是Log4j 2.0所提供的。

使用Log4j 1Logback,您可以通过扩展类和实现接口进行自定义。 仅此一项是可行的,但是提供您自己的配置元素并不是那么容易。

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邮件列表中看到您所做的工作。

参考: PHP和Java Entwickler博客上的JCG合作伙伴 Christian Grobmeier 自定义Log4j 2.0

翻译自: https://www.javacodegeeks.com/2014/02/customizing-log4j-2-0.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值