log4j(一) 自定义属性

本文介绍如何在Log4j中为SocketAppender添加自定义属性,如projName,并通过修改源码实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

log4j之自定义属

    通过
http://blog.chinaunix.net/uid-28953367-id-4098272.html 这篇文章可以了解到,log4j配置文件中,可供使用者自行定义的仅有appender(创建appender),如果想自定义appender(或layout等其他)属性,应该如何做?其实log4j提供了良好的框架来供开发者扩展自己的功能。
    以org.apache.log4j.net.SocketAppender为例,定义一个SocketAppender,如下
  1. #socket
  2. log4j.appender.socket=org.apache.log4j.net.SocketAppender
  3. log4j.appender.socket.RemoteHost=10.10.40.25
  4. log4j.appender.socket.Port=8888
  5. #重发间隔ms
  6. log4j.appender.socket.reconnectionDelay=1000
    查看log4j源码,可以看到,org.apache.log4j.net.SocketAppender拥有众多属性,诸如RemoteHost  Port  reconnectionDelay  address  locationInfo等,通过跟踪log4j源码可以了解到,log4j在加载配置文件时,会使用反射机制,通过org.apache.log4j.config.PropertySetter类中的setProperty方法,并调用SocketAppender类中各属性的set方法,将配置文件中各属性值设置到SocketAppender实例中(各属性值会根据实际属性类型进行转换)。
   了解到log4j加载配置文件的过程之后,为log4j添加自定义属性的思路便就明了了。
   如,想在SocketAppender中增加一个projName属性,以标识该工程的工程名,步骤如下

   一、修改配置文件,为SocketAppender增加projName属性

  1. #socket
  2. log4j.appender.socket=org.apache.log4j.net.SocketAppender
  3. log4j.appender.socket.RemoteHost=10.10.40.25
  4. log4j.appender.socket.Port=8888
  5. #重发间隔ms
  6. log4j.appender.socket.reconnectionDelay=1000
  7. #本地信息
  8. log4j.appender.socket.LocationInfo=true
  9. #自定义属性--工程名
  10. log4j.appender.socket.projName=myProjName
    
此时运行代码,会报出 log4j:WARN No such property [projName] in org.apache.log4j.net.SocketAppender. 的错误,这是因为源码中SocketAppender类并没有projName属性。

    二、
修改org.apache.log4j.net.SocketAppender源码
   在org.apache.log4j.net.SocketAppender源码中,添加
 String projName; 
属性,并为其添加 set/get 方法,再次运行程序,便会发现再无上述错误出现,调试程序可以发现,log4j会自动调用SocketAppender中setProjName方法设置SocketAppender实例中的projName值。

   
为其他appender或者layout添加自定义属性的步骤类似,接下来,便可以编写自己的代码,在实际代码中使用这些自定义的属性了。
   
阅读(35) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
### log4j2 自定义插件 Bean 注入 示例 配置 在 Log4j 2 中,自定义插件可以通过 `@Plugin` 注解实现。如果需要将外部的 Bean(例如通过 Spring 创建的 Bean)注入到 Log4j 的插件中,可以结合 Log4j 的插件机制与依赖注入框架的功能来完成。以下是实现的具体方法和配置示例。 #### 1. 自定义插件类 创建个带有 `@Plugin` 注解的自定义插件类,并通过构造函数或字段注入的方式引入外部 Bean。以下是个示例代码: ```java import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.appender.AbstractAppender; @Plugin(name = "CustomBeanAppender", category = "Core", printObject = true) public class CustomBeanAppender extends AbstractAppender { private final MyCustomBean myCustomBean; protected CustomBeanAppender(String name, Layout<?> layout, MyCustomBean myCustomBean) { super(name, null, layout); this.myCustomBean = myCustomBean; } @Override public void append(org.apache.logging.log4j.core.LogEvent event) { // 使用 myCustomBean 进行业务逻辑处理 String customMessage = myCustomBean.process(event.getMessage().getFormattedMessage()); System.out.println(customMessage); } @PluginFactory public static CustomBeanAppender createAppender(String name, Layout<?> layout, MyCustomBean myCustomBean) { return new CustomBeanAppender(name, layout, myCustomBean); } } ``` #### 2. 配置文件中的插件声明 在 `log4j2.xml` 或其他配置文件中,声明自定义插件并绑定外部 Bean。以下是个 XML 配置示例: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <!-- 自定义插件声明 --> <CustomBeanAppender name="CustomBeanAppender" myCustomBeanRef="myCustomBean"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/> </CustomBeanAppender> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="CustomBeanAppender"/> </Root> </Loggers> </Configuration> ``` 在此配置中,`myCustomBeanRef` 是指向外部 Bean 的引用名称。 #### 3. 外部 Bean 的注册 如果使用 Spring 框架,可以通过 Spring 的上下文注册 `MyCustomBean` 并确保其在 Log4j 插件初始化时可用。以下是个 Spring 配置示例: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean(name = "myCustomBean") public MyCustomBean myCustomBean() { return new MyCustomBean(); } } ``` 确保 Spring 上下文已加载并在应用程序启动时可用。 #### 4. 插件管理器的扩展 为了使 Log4j 能够找到自定义插件,需要确保插件所在的包被正确扫描。可以通过以下方式实现: - 在 `log4j.plugin.packages` 系统属性中指定插件包[^1]。 - 使用 `PluginManager.addPackages` 方法手动添加插件包。 例如,在应用程序启动时执行以下代码: ```java import org.apache.logging.log4j.core.config.plugins.util.PluginManager; public class PluginInitializer { public static void initPlugins() { PluginManager.addPackages("com.example.plugins"); } } ``` #### 注意事项 - 自定义插件的类必须位于 Log4j 的类路径中,或者通过 OSGi 或其他方式显式加载。 - 如果插件依赖外部 Bean,则需要确保这些 Bean 已正确初始化并可供插件访问。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值