2012-08-12 81 views
15

私はいくつかのWebアプリケーションを同じTomcatで実行しています。Log4j対Logback:同じログへの並行書き込み?

の1-検索することにより、私は複数のアプリケーションが存在する場合、同じファイルにログインすると、いくつかの問題を作成する可能性があることを理解:

私は2つの質問があります。同じWebサーバーで複数のアプリケーションを実行しているのですか?デフォルトのstdout出力が使われているときも正しいですか?

2- Logbackライブラリで慎重なモードがある:

が賢明モードでは、FileAppender安全潜在的に実行し、さらには異なるJVMで実行されている他のFileAppenderインスタンスの存在下で、指定されたファイルに書き込みます異なるホスト。慎重なモードのデフォルト値はfalseです。

Logbackを複数のJVMで使用するだけでいいのか、それとも同じWebサーバー上で複数のアプリケーションを実行する場合に便利なのかを知りたいですか?もしそうでなければ、この点でlog4jと同じですか?

おかげ

答えて

1
  1. はい。一般的には、各アプリケーション(Webかどうか)ごとに異なるログファイルを作成するという原則が必要です。別の方法として、書き込み先のファイルを決定するためにサーバーに任せておくことです。 JBossには一般的にログアウトする方法があり、同じファイルに移動します。しかし、私はまだ各アプリケーションごとに別々のログを持つことを好みます。
  2. 私が知る限り、log4jとLogbackの両方は、アプリケーションを引き起こす可能性のあるオーバーヘッドを最小限に抑えることを目的としているため、より有利なものとなる可能性は低いです。複数のJVMが必要不可欠な場合は、Logbackを処理する方が優れていると思いますが、これ以外の方法で使用することは悪い考えではありません。
3

明確にしなければならない一つのことがあります:問題があるでしょう異なるインスタンスのLog4jのが同時に同じファイルに書き込みしているとき、同じJVMで動作しているかどうか。

サーバー(および異なるクラスローダー)を使用する場合、展開および構成に応じて、単一のサーバー全体のインスタンスまたはLog4jの複数のインスタンスを持つことができます。

  1. 上記を参照してください。 Stdoutは同じ混在出力の問題を抱えていますが、ファイルをローテーションするときは問題になりません。
  2. Logbackの慎重なモードは、異なるインスタンス(同じJVMかどうか)による同時書き込みを処理します。設定でサーバ全体のLog4jインスタンスが使用されている場合、この面で利点はありません。 log4jのとlogbackの両方で
+0

私たちは何が問題であるかを詳しく説明できますか?これらは次のとおりです: 混在した行、1行に混在した内容、失われたログ、ローリングファイル名の問題? – j23

15

複数FileAppenderのインスタンスが同じログファイルに書き込む場合は、破損しているになってきたログファイルの高い危険性があります。同一のJVMまたは異なるJVM上で実行されるインスタンスは、無関係です。つまり、破損のリスクは同じです。

prudent mode logbackのFileAppenderに、ドキュメントで述べたように、潜在的に異なるホスト上で実行しても、同じまたは異なるJVMで実行されている他のFileAppenderインスタンスの存在下で、破損を避けることができます。デフォルトでは、賢明なモードは無効になっています。

コンソールは破損していないので、問題は解決しません。

1

Filelocksを使用することは実際には効率的で安全ではないので、別のアペンダー/ JVMの作品から同じファイルにログを記録する際には推奨しません。私がlogback-appenders-faqから直接取った構成を見てください。いくつかの統一ソースに書き込む複数のJVM用

<configuration> 
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <!-- Support multiple-JVM writing to the same log file --> 
    <prudent>true</prudent> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> 
     <maxHistory>30</maxHistory> 
    </rollingPolicy> 

    <encoder> 
     <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
    </encoder> 
    </appender> 

    <root level="DEBUG"> 
    <appender-ref ref="FILE" /> 
    </root> 
</configuration> 

あなたの他のオプションはSocketAppendersJDBCAppenderです。

JDBCAppenderが完全にかかわらず、将来的に交換されるといずれかをお勧めしません。ログバックmailinglistを参照してください。

SocketAppendersは、ログバックのために多くのコードを書くことを計画していない可能性があるので、少し生のかもしれません。

もう1つのオプションがあります。 clusterlogのようなものを使うことができます。これはあなたが持っている問題の種類を正確に解決するために構築されています。

関連する問題