appender log4j 扩展_java-如何在log4j2中创建自定义Appender?

在log4j2中,其工作原理与在log4j-1.2中完全不同。

在log4j2中,您将为此创建一个插件。 该手册在此处提供了自定义附加程序示例的说明:[http://logging.apache.org/log4j/2.x/manual/extending.html#Appenders]

扩展packages可能很方便,但这不是必需的。

当使用packages注释自定义Appender类时,插件名称将成为配置元素名称,因此带有自定义附加程序的配置将如下所示:

...

请注意,配置上的packages属性是所有带有自定义log4j2插件的软件包的逗号分隔列表。 Log4j2将在类路径中的这些包中搜索以@Plugin注释的类。

这是打印到控制台的示例自定义追加程序:

package com.yourcompany.yourcustomappenderpackage;

import java.io.Serializable;

import java.util.concurrent.locks.*;

import org.apache.logging.log4j.core.*;

import org.apache.logging.log4j.core.config.plugins.*;

import org.apache.logging.log4j.core.layout.PatternLayout;

// note: class name need not match the @Plugin name.

@Plugin(name="MyCustomAppender", category="Core", elementType="appender", printObject=true)

public final class MyCustomAppenderImpl extends AbstractAppender {

private final ReadWriteLock rwLock = new ReentrantReadWriteLock();

private final Lock readLock = rwLock.readLock();

protected MyCustomAppenderImpl(String name, Filter filter,

Layout extends Serializable> layout, final boolean ignoreExceptions) {

super(name, filter, layout, ignoreExceptions);

}

// The append method is where the appender does the work.

// Given a log event, you are free to do with it what you want.

// This example demonstrates:

// 1. Concurrency: this method may be called by multiple threads concurrently

// 2. How to use layouts

// 3. Error handling

@Override

public void append(LogEvent event) {

readLock.lock();

try {

final byte[] bytes = getLayout().toByteArray(event);

System.out.write(bytes);

} catch (Exception ex) {

if (!ignoreExceptions()) {

throw new AppenderLoggingException(ex);

}

} finally {

readLock.unlock();

}

}

// Your custom appender needs to declare a factory method

// annotated with `@PluginFactory`. Log4j will parse the configuration

// and call this factory method to construct an appender instance with

// the configured attributes.

@PluginFactory

public static MyCustomAppenderImpl createAppender(

@PluginAttribute("name") String name,

@PluginElement("Layout") Layout extends Serializable> layout,

@PluginElement("Filter") final Filter filter,

@PluginAttribute("otherAttribute") String otherAttribute) {

if (name == null) {

LOGGER.error("No name provided for MyCustomAppenderImpl");

return null;

}

if (layout == null) {

layout = PatternLayout.createDefaultLayout();

}

return new MyCustomAppenderImpl(name, filter, layout, true);

}

}

有关插件的更多信息:[http://logging.apache.org/log4j/2.x/manual/plugins.html]

如果手册还不够,查看log4j-core中内置附加程序的源代码可能会很有用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值