大きなコードベースを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);
編集済み-この作業を行うのにまだ問題があります。
以下の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のLookupメカニズムを紹介します。イベントを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」という名前のシステムプロパティからホスト名を取得します。その他のルックアップオプションについては、ルックアップをご覧ください。または、独自のカスタムルックアップを作成することもできます。
しかし、何らかの理由で本当にプログラムでAppenderを構成する必要がある場合は、Log4j Webサイトで説明されているように、複数の方法で構成できます。どちらを選択するかは、プログラムで構成を作成するか、または既存の構成を変更するかによって異なります。
プログラムで構成を作成するには、Log4jはConfigurationBuilderを使用することをお勧めします。これは、2つのパスで構成を作成するLog4jの通常のメカニズムに従います。最初のパスでは、構成ダイアレクトが何であっても(ConfigurationBuilderを含む)、ノードツリーに変換されます。2番目のパスでは、ノードツリーが実際の構成に変換されます。2番目のパスは、通常、この方法で構築されたすべての構成に共通です。したがって、ConfigurationBuilder APIを見ると、特定のクラスを構築していません。代わりに、構成コンポーネントを作成します。これにより、後で対応するクラスが作成されます。
既存の構成のアペンダーの変更はスレッドセーフな方法で実行できないため、許可されません。代わりに、同じ名前で新しいAppenderを作成して開始し、既存のAppenderを構成から削除し、新しいAppenderを追加し、すべてのLoggerConfigオブジェクトを変更して、古いAppenderの代わりに新しいAppenderを参照し、古いAppenderを停止します。 。この例は、Log4jのカスタム構成ページにあります。
SyslogAppenderが構築されているLog4jのSocketAppenderは、複数のIPアドレスを返すDNS名を受け入れることにも注意してください。接続に失敗した場合、SocketAppenderはいずれかのIPアドレスで再接続を試みます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加