大型代码库从log4j迁移到log4j2。 Log4j具有设置SyslogHost的方法这是为什么?
问题描述
我正在将大型代码库从log4j迁移到log4j2。 Log4j具有设置SyslogHost的方法。
syslog.setSyslogHost(syslogDomainName);
我正在寻找log4j2中的等效项。
为了完整起见,原始的log4J代码如下所示:
SyslogAppender syslog = (SyslogAppender)Logger.getLogger("available-loggers").getAppender("syslog");
syslog.setSyslogHost(syslogDomainName);
新代码看起来要复杂一些:
org.apache.logging.log4j.Logger logger
= org.apache.logging.log4j.LogManager.getLogger("available-loggers");
org.apache.logging.log4j.core.Logger coreLogger
= (org.apache.logging.log4j.core.Logger)logger;
org.apache.logging.log4j.core.LoggerContext context
= (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext();
org.apache.logging.log4j.core.config.Configuration configuration = (Configuration)context.getConfiguration();
Appender appender = configuration.getAppender("syslog");
SyslogAppender syslog = (SyslogAppender) appender;
...
加上替代项
syslog.setSyslogHost(syslogDomainName);
编辑添加-我想知道是否可以使用AppenderBuilder创建具有正确主机名的syslog附加程序。
syslog.newSyslogAppenderBuilder().withHost(syslogDomainName);
思路:
我要问的第一个问题是“为什么要这样做?”如果是因为您需要动态确定主机名,我将为您指出Log4j的Lookup机制。如果要以RFC 3164(BSD)格式记录事件,则通常将SyslogAppender配置为
如果要动态设置targetHost,请执行以下操作:
这将从名为“ syslogHost”的系统属性中获取主机名。有关更多查找选项,请参见Lookups。您也可以编写自己的custom Lookup。
但是如果出于某种原因,您确实需要以编程方式配置Appender,则Log4j web site中描述了多种执行方法。选择哪种选择取决于您是以编程方式创建配置还是要修改的配置以及现有配置。
要以编程方式创建配置,Log4j建议使用ConfigurationBuilder。这遵循Log4j的通过两次创建配置的常规机制。在第一遍中,无论配置方言是什么(包括ConfigurationBuilder),都将转换为节点树。在第二遍中,将节点树转换为实际配置。第二遍通常以这种方式构建的所有配置都通用。因此,当您查看ConfigurationBuilder API时,您将不会构建特定的类。相反,您将创建配置组件,稍后将导致创建相应的类。
无法以线程安全的方式修改现有配置的Appender,因此不允许这样做。相反,您可以创建一个具有相同名称的新Appender并将其启动,从配置中删除现有的附加程序,添加新的Appender,修改所有LoggerConfig对象以引用新的Appender,而不是旧的Appender,然后停止旧的Appender。 。您可以在Log4j的custom configuration页面上找到此示例。
我还应注意,基于SyslogAppender构建的Log4j的SocketAppender接受返回多个IP地址的DNS名称。如果连接失败,则SocketAppender将尝试在任一IP地址处重新连接。
以上内容就是爱站技术频道小编为大家分享的大型代码库从log4j迁移到log4j2。 Log4j具有设置SyslogHost的方法这是为什么?看完以上分享之后,大家应该都知道原因了吧。