2009-08-06 13 views
5

ログ出力を実行ごとに一意のファイルにリダイレクトする従来のPSVMアプリケーションがあります。したがって、私が10:00にそれを呼び出すと、その出力を{thread-id} -10:00.logにリダイレクトさせます。別の実行スレッドが10:01に実行を開始し、その出力が{thread-id} -10:01.logになります。私はこれがエレガントではないことを理解しています。ロギングアペンダを動的に作成および破棄する

私の質問は以下のとおりです。

  • これは可能ですか?
  • 誰かにアプローチする方法がありますか?
  • アペンダーが不要になったらそれを解放/破壊することは可能ですか?

ありがとう!

答えて

4

私はFileAppenderで始まり、自分自身を作成することに由来します。バージョンを変更して現在のスレッドIDを取得し、作成前に適切なスレッドID /タイムスタンプをファイルに追加するだけです。あなたは、(バッファされた)FileWritersのマップがスレッドidにキーを付けられている(言い方をしている)でしょう。

アペンダーを書くことは非常に簡単です - here's a Javaworld guideする方法です。

上記では、プログラムが1分で2回起動する可能性はありますか?一意性を維持するためにプロセスIDなどを追加したいですか?

+0

迅速な回答ありがとうございます! 1つのスレッドが2回以上それを行うケースはありません。しかし、いずれにせよ、これは議論の目的の例に過ぎない。一意性のために名前のスコープが設定されます。 ファイルライターをリリースする方法についてのアイデアはありますか? –

+0

+1良いチュートリアルのリンク – WolfmanDragon

+0

Re。解放する。私はあなたがすべてのログメッセージの後に(ディスクへの書き込みを確実にするために)ライターをフラッシュする必要があり、それをリリースする心配はしないと思う。 JVMがすべてをダウンさせる。たくさんのスレッドを作成していて、たくさんのファイルを開いている場合を除きます。それで、あなたは一度に 'n'作家を開いたままにして、ログアウトしていないときにはいくつかを閉じたいと思うかもしれません。しかし、それはいくつかのスラッシングが発生する可能性があります: –

1

少なくとも、log4jでは簡単ではありません。しかし、logback(log4jの後継)を使用して出荷されるSiftingAppenderを見ると、ランタイム条件と不要になったときの削除でのアペンダの作成を処理するように設計されています。

アプリケーションの起動ごとにログファイルを1つだけ作成する必要がある場合は、タイムスタンプに基づいてログファイルの名前を付けることができます。さらに援助が必要な場合は、ログバックユーザーのメーリングリストを叫んでください。

+0

なぜこれが不可能であるのか、より多くの背景を知りたいのです。それは比較的単純なようです。私はlogback-userへの投稿をフォローアップしました。私はあなたがそこにそれを見つけて、精巧になることを願っています。ありがとう! –

+0

これは、カスタムアペンダーをプログラムで設定するか、設定ファイルで設定するかによって異なります。また、マルチスレッドアプリケーションでは、ログファイル(スレッドごとに1つ)を管理するという問題もあります。 元の質問は、これらの2つの問題に関してあまり具体的ではありませんでした。 – Ceki

関連する問題