java定义log4j2_java – 如何在log4j2中创建自定义Appender?

在log4j2中,与log4j-1.2中的工作方式完全不同。

扩展org.apache.logging.log4j.core.appender.AbstractAppender可能很方便,但这不是必需的。

当您使用@Plugin(name =“MyCustomAppender”,….)注释您的自定义Appender类时,插件名称将成为配置元素名称,因此,使用自定义appender的配置将如下所示:

...

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

以下是打印到控制台的示例自定义appender:

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);

}

}

如果手册不够,可以在log4j-core中查看内置的追加器的源代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值