4

"send hello"-> receive from socketなどのユーザーコマンドを介してソケットとの間でデータを送受信する単純なコンソールアプリケーションを作成してい"hello"ます。使用可能なコマンドの 1 つは logLevel(ALL|WARN|DEBUG|etc.)である必要があります。これにより、ユーザーは、アプリケーション全体で使用している Log4J ロガーのログ レベルを設定できます。

今、プロパティ ファイルで 2 つの Appender を指定しました。

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./logs/client.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# info and above messages are printed to stdout
log4j.appender.stdout.Threshold=INFO
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

ここでの私の目標は、すべてのログ エントリを任意のレベルからログ ファイルに送信することですが、ユーザーが現在 stdout に設定している特定のログ レベルに一致するログ エントリのみを送信することです。サンプル ワークフローは次のようになります。

> INFO: current log level is INFO and above.
> send hello
> INFO: sending hello to server
> INFO: receiving "hello" from server
> logLevel WARN
> INFO: log level set to warn
> send hello
> # no info here, but its still sent to the logfile
4

2 に答える 2

8

ここでの私の目標は、すべてのログ エントリを任意のレベルからログ ファイルに送信することですが、ユーザーが現在 stdout に設定している特定のログ レベルに一致するログ エントリのみを送信することです。

stdoutしたがって、基本的には、アペンダーのしきい値をプログラムで変更する必要があります。これは簡単に実行できますが、しわは、しきい値プロパティがインターフェイス自体ではなくAppenderSkeleton(拡張された) 抽象クラスの一部であることです。ConsoleAppenderAppender

((AppenderSkeleton)Logger.getRootLogger().getAppender("stdout"))
   .setThreshold(Level.toLevel(levelNameProvidedByUser));

本当にすべてのログ メッセージをファイルに送りたい場合は、ルート ロガー レベルを INFO ではなく ALL にlog4j.properties設定し、しきい値に依存して stdout をフィルタリングする必要があります。

于 2013-11-01T13:58:56.863 に答える