2009-04-24 28 views
2

次のような集中ログを設定するのが最もよいでしょうか。中央ロギングサーバーをセットアップし、ロギングイベントをテストと本番から分ける方法は?

誤って非標準ログを記録する可能性のある条件を参照するコードについて心配する必要はありません。プロダクションエラーlog4jバスにエラーを出力します。言い換えれば、私は、次のようなコードを持ってしたいと考えていません。それをサーバー名などもしっかりカップルの何かので、私はこれをしたくない

if (!production) 
    logWrapper.logTest(error); 
else 
    logWrapper.logProd(error); 

、参照、今のコードは、唯一の1で動作することができます2つのサーバー名:prodとtest。また、デベロッパーがこれを正しく設定せず、ロギングリポジトリを汚染する可能性があるため、これを設定で宣言的に設定することもできません。 提案がありますか?

いくつかの詳細は、いくつかの要因でするつもりはありませんが、私はとにかくそれをリスト:

  • のみのWebアプリケーションを、 10.1.3.4今のOracle Application Server上で実行されている、および将来のOracleでWebLogic
  • この例で示すように中央ログサーバーを使用する場合:http://timarcher.com/?q=node/10 ...中央サーバーがテキストファイルを記録し、電子メールを送信しないことを除いて!
  • のlog4jを使用し、多分それは(SLF4Jは一種の不遜なので言及して大部分はそれを無視することです。)SLF4Jを経て生産とステージングのため

答えて

0

使用異なるロギング設定ファイルをラップされます。

あなたはこのカップルの異なる方法

1)二つの異なるコンフィギュレーションファイル(ステージ用と生産のための1つのアプリの中に保管行う)と、アプリケーションを持っている可能性があり、使用するコンフィギュレーションファイルを知っているいくつかのスタートアップコードを持っていますそれが設定されているマシンに基づいて、あるいは環境設定を設定するアプリケーション構成ファイル内の設定に基づいています。

2)ファイルを1つだけ持っているだけで、テストやプロダクションでは、適切なファイルに置き換えてください。

0

私は本当にあなたが設定でこれを設定する必要があると思います。それは正しい決定です。

+0

をチェックアウトすることができます次に、あなたがその場で可能と設定が誤って設定されることはありませんことを確認する必要があり... – Zombies

2

環境について詳しく説明しなくても、具体的な回答は難しいですが、複数の環境を処理するためのロギングを設定していた場合は、ここで取り組んでいます。

1)アプリケーションはロギングに気を付けるべきではありません。ロギングを設定するには、log4jの(または任意のロギングフレームワーク)の設定を作成します

logger.warn("message", error); 

2):たとえば、以下は、すべての環境で動作するはずです。これは2つの方法のうちの1つを行うことができます。最初の方法は、環境ごとにtest_log4j。{xml、properties}、prod_log4j。{xml、properties}などを作成することです。これにより各環境の設定が非常に簡単になり、新しい環境を追加するだけで新しいファイルが追加されます。代わりに、log4j。{xml、properties}を1つ作成し、antスタイルのプロパティ置換を使用して環境ごとに適切な値を挿入します。プロパティ値は、環境固有のプロパティファイルまたはJVMに渡される-Dkey = value引数から取得できます。これは、各環境の構成がかなり似ていると仮定したDRYスタイルの構成の方が優れています。

<logger name="my.example"> 
    <level value="${my.example.level}"/> 
</logger> 

3)は、おそらくマシンまたはマシン上でいくつかのファイルに基づいて環境を()を決定して、正しい設定をロード起動スクリプトを作成します。例として環境間でログレベルを変更します。これは正しいlog4j構成、正しいプロパティファイル、または正しい-DKey = value引数のいずれかです。

1

使用しているRDBMSについては言及していません。 Oracleを使用している場合は、SYS_CONTEXT()関数を使用してデータベース名を取得できます。そこから、/ dev/qa/test /などのプロダクションにいるかどうかを判断できます。一元化したログ洪水を減らす -

Here's a nice article on sys_context()

+0

これは良い提案であるように思われます。 – Zombies

1

この特定の問題は、実際には、解決するために設計した主要な問題の一つだ、logFacesで扱われています。あなたのアプリケーションの設定で。アプリケーション名を指定します(例: "My production app")。アプリケーションからのすべてのログ・ステートメントは、集中ログ・サーバーに流れ、照会およびリアルタイム表示でストレージ内で使用可能になります。コードを変更することはありません。設定の問題です。通常、私たちは開発中に同じアプリケーションをいくつか、QAにいくつかのバージョンを用意しています。それぞれの開発者は、他の人が何が起こっているのかを見るためにビューアを調整できます。私はしばしばQAホストを監視し、それが実現する前でも問題があることを知っています。もう1つの面白いシナリオは、すべてのアプリケーションで何が起こっているのかを一度に見ることができますが、データレイヤだけに焦点を当てたい場合です。

開示:私はこの製品の著者です。

+1

開発者がそのファイルを正しく設定しないとどうなりますか?あなたはあなたのログファイルの信頼性を台無しにしていませんか? IE:プロダクションでエラーが発生したように見えますが、実際にプロダクトになっているのか、prodログファイルを指す誤って構成されたテストコンフィグファイルであるのかは不明です。 – Zombies

+0

実際、ログファイルは保存されておらず保存されていません。ログファイルは、いつでも一致する基準を指定するだけで、いつでも必要に応じて作成できます。たとえば、最後の日曜日にアプリケーション名「My production」に関連し、データレイヤーからスローされた例外だけを含むログファイルを取得することができます。それは可能ですが、それは信じられないほど簡単なので構成を台無しにするのは比較的難しいです。ログサーバーを使用してアプリケーションのインスタンスに名前を付けるだけで済みます。それはかなりストレートフォワードプロパティです。 – Dima

+0

同じアプリのアプリ名を「my test」から「my qa」に、「my production」に再設定する必要はありませんか? – Zombies

0

mattkempはこれをかなり釘付けにしました。私が追加するかもしれない1つのことは、私が生産とテストの間に期待する主要な違いは、テストバージョンではデバッグロギングが永久にアクティブになり、 。

これ以外にも、テスト中に何が起きても、生産中にも起こりうるので、少なくとも私はテストと生産からほぼ同じタイプのログエントリを期待します。

サーバーのセットアップ自体については、適切なlog4jセットアップを使用して、syslogまたはWindows NTのイベントログのいずれかに進むといいでしょう。こうすることで、最終的なシステムの他の部分を同じロギングサーバーに記録することもできます。適切なロギングシステムでは、イベントが生成されたサーバーが表示されるため、イベントがプロダクトかテストかのどちらであるかははっきりしているはずです。優れたWebベースのシスログGUIの

、あなたがhttp://www.phplogcon.org/

関連する問題