gpt4 book ai didi

java - log4J setSyslogHost(...) 相当于 log4j2

转载 作者:行者123 更新时间:2023-12-02 08:57:47 26 4
gpt4 key购买 nike

我正在将大型代码库从 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.newSyslogAppenderBuilder().withHost(syslogDomainName);

已编辑 -我仍然无法完成这项工作。

下面的 log4J2.xml 套接字配置适用于基本日志记录,也是我正在使用的:

<Socket name="syslog" port="514" host="${sys:log4j.syslog.host}" protocol="UDP" ReconnectionDelay="200">
<JsonLayout2/>
</Socket>

我们在 AWS 中有一个日志收集器,它可以随时消失,然后使用新的 IP 地址进行扩展。我需要弄清楚如何让它切换到新的 IP。

Log4J1 在运行时使用 syslog.setSyslogHost 非常简单。关于 Log4J2 中我缺少的内容有什么想法吗?

最佳答案

我要问的第一个问题是“你为什么要这样做”?如果是因为您需要动态确定主机名,我会向您指出 Log4j 的查找机制。如果您想以 RFC 3164 (BSD) 格式记录事件,SyslogAppender 通常配置为

<Syslog name="bsd" host="targetHost" port="514" protocol="TCP"/>

如果您想动态设置 targetHost,请执行以下操作:

<Syslog name="bsd" host="${sys:syslogHost}" port="514" protocol="TCP"/>

将从名为“syslogHost”的系统属性中获取主机名。请参阅Lookups如需更多查找选项,或者您可以编写自己的 custom Lookup .

但是,如果出于某种原因,您确实需要以编程方式配置 Appender,那么有多种方法可以实现此目的,如 Log4j web site 中所述。 。您选择哪个取决于您是否以编程方式创建配置或是否要修改现有配置。

要以编程方式创建配置,Log4j 建议使用 ConfigurationBuilder。这遵循 Log4j 分两次创建配置的正常机制。在第一遍中,无论配置方言是什么(包括 ConfigurationBuilder),都将转换为节点树。在第二遍中,节点树被转换为实际配置。第二遍通常对于以这种方式构建的所有配置都是通用的。因此,当您查看 ConfigurationBuilder API 时,您不会构建特定的类。相反,您将创建配置组件,这将在稍后导致创建相应的类。

修改现有配置的 Appender 不能以线程安全的方式完成,因此是不允许的。相反,您可以创建一个具有相同名称的新 Appender 并启动它,从配置中删除现有 Appender,添加新 Appender,修改所有 LoggerConfig 对象以引用新 Appender 而不是旧 Appender,然后停止旧 Appender 。您可以在 Log4j 的 custom configuration 上找到此示例。页。

我还应该注意到,SyslogAppender 构建于 Log4j 的 SocketAppender 之上,它接受返回多个 IP 地址的 DNS 名称。如果连接失败,SocketAppender 将尝试在任一 IP 地址重新连接。

关于java - log4J setSyslogHost(...) 相当于 log4j2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60381878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com