1

私は htmlunit アプリケーションを持っていますが、コンソールに必要のないメッセージが多すぎるため、次の行でログをオフにしました。

LogFactory.getFactory().setAttribute(
    "org.apache.commons.logging.Log",
    "org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit")
    .setLevel(Level.OFF);   
java.util.logging.Logger.getLogger("org.apache.commons.httpclient")
    .setLevel(Level.OFF);

次に、最新の log4j jar をプロジェクトに追加して構成し、独自のカスタム ロギング メッセージを作成できるようにしました。しかし、今では htmlunit からのすべてがログ ファイルにも送られます。どうすればこれを防ぐことができますか? 自分のログ メッセージだけをログ ファイルに保存したい。

4

1 に答える 1

0

log4j について理解しておくべき重要なことの 1 つは、「ロガー階層」の概念と、これが設定にどのように影響するかです。log4jのドキュメントを引用するには、

ロガーの名前の後にドットが続く場合、ロガーは別のロガーの祖先であると言われます。ロガーは、それ自体と子孫ロガーの間に祖先がない場合、子ロガーの親であると言われます。

たとえば、「com.foo」という名前のロガーは、「com.foo.Bar」という名前のロガーの親です。同様に、「java」は「java.util」の親であり、「java.util.Vector」の祖先です。この命名スキームは、ほとんどの開発者にとって馴染みのあるものです。

ロガーはその親の設定を継承し、「ルート ロガー」は常に階層の最上位にあります。したがって、ルート ロガーを「デフォルト」のロガー設定としてある程度扱うことができ、コードに含まれるロガーだけに対してこれらの設定を追加することができます。

これをコードで設定する方法はわかりませんが、log4j.properties ファイルを使用して行うことは次のとおりです。

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logs/springapp.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

# Direct log messages to console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

# Root logger settings: by default only log messages at level "ERROR" and above 
# will be logged. These messages will be written to console
log4j.rootLogger=error, console

# All loggers with names starting with "org.somecompany.someproject"
# will log messages at all levels "DEBUG" and above.
# They will be written to file as well as console; writing to console
# is enabled since that setting is inherited from the root logger.
log4j.logger.org.somecompany.someproject=debug, file

次に、各クラスのロガーがそのクラスの完全修飾名として命名されていると仮定すると、上記の構成の「org.somecompany.someproject」をプロジェクト内のパッケージのルート パッケージ名に置き換えるだけで、あなたが望む行動。

詳細については、log4j のドキュメントを参照してください。

于 2012-08-11T23:08:30.357 に答える