log4j2と同等のlog4J setSyslogHost(...)

から:

大きなコードベースを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で何が欠けているかについてのアイデアはありますか?

rgoers:

私が最初に尋ねる質問は、「なぜこれをしたいのか」です。ホスト名を動的に決定する必要がある場合は、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]

編集
0

コメントを追加

0

関連記事