- PR -

log4jのアペンドの設定に関して

投稿者投稿内容
なお
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-05-25 20:18
いつもお世話になっております。
log4jのアペンドの設定に関して、お聞きしたいことがあります。

log4jを用いて、以下のような設定の元、ログ出力を行いました。
------ log4j.properties --------------------------------
log4j.category.test=INFO,A1
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.File=test.log
log4j.appender.A1.Append=false
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%m%n
--------------------------------------------------------

また、test.java内で以下のような記述をし、
1アクションで、1つのログを出力しようとしたのですが、
ログに出力した内容が新規ファイルに出力されず、常に追記でログが出力されます。
------ test.java --------------------------------
org.apache.log4j.Logger log =
org.apache.log4j.Logger.getLogger(this.getClass());
log.info("Error Code");
--------------------------------------------------------

現在のところ、
ファイルが新規に作成されるタイミングは、アプリケーションを再起動した場合のみですが、
やりたい事は、1アクション毎に新規にファイルが作成され、そこにログを出力したいのです。
この『log4j.appender.A1.Append=false』の設定だけではダメなのでしょうか?

どうか、ご教授お願い致します。

環境は、WebSphere,DB2。
開発は、WindowsXPを用いて行っています。
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2004-05-26 13:29
引用:

現在のところ、
ファイルが新規に作成されるタイミングは、アプリケーションを再起動した場合のみですが、
やりたい事は、1アクション毎に新規にファイルが作成され、そこにログを出力したいのです。
この『log4j.appender.A1.Append=false』の設定だけではダメなのでしょうか?


普通、一言ロギングする毎にファイルを開き直したりしないと思いますよ。
だからそのような設定項目も無いのです。

どうしてもやりたいならばAppenderを自作すれば良いと思いますが、そもそも「一言ごとに新規ファイル」ってのを考え直すべきだと思います。

# 実はたまに見かけるんですよね。一言書く度にファイルを開き直すようなコードを。
# どこかに悪いサンプルでも出回ってるんでしょうか。
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-05-26 20:31
引用:

# 実はたまに見かけるんですよね。一言書く度にファイルを開き直すようなコードを。


クローズする前に異常終了して0バイトのログファイルだけが残されるってのの対策じゃないですかね。
VBとかCとかならfinalyないし。
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2004-05-27 11:28
flushだけすれば異常終了してもログが消える心配はありません。
closeまでする必要はないです。
なお
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-05-27 14:24
なおです。ご返信ありがとうございます。

引用:
普通、一言ロギングする毎にファイルを開き直したりしないと思いますよ。
だからそのような設定項目も無いのです。


現在、

1.WEB画面で登録ボタンを押し、サーバにアップロードされたCSV形式のデータを、DBに登録する。
  その際に、CSVデータのチェック(桁数チェックや必須チェック)を行い、
  不正な値(DBに登録出来ない値)が入力されている場合は、その結果をログに出力する。
2.WEB画面でログ出力ボタンを押し、ログをダウンロードし、CSVデータの不正な箇所を確認する。
3.2で確認した内容で、CSVデータを修正し、再度、サーバにCSVデータをアップロードする。
4.ログデータに、エラーが吐かれなくなるまで、1〜3を繰り返す。

という処理を作成しております。

その為、エラーログは下に下に追記されていくのではなく、
1回のボタン押下毎に、新しいログを出していく、という方法が必要となります。
(メッセージが何も吐かれていないログがダウンロードされた時、エラーがなくなったと判断させるためです。)

これは、自分で実装しない限り、log4jの標準機能では出来ない、という事でよろしいのでしょうか?
また、もし、log4jでは出来ないとした場合、
上記のことを実現する為に、何がオススメでしょうか?

引用:
flushだけすれば異常終了してもログが消える心配はありません。
closeまでする必要はないです。



log4jでcloseを行うメソッドって、あるのでしょうか?
apiを探しても、見つからないのですが・・・
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-05-27 14:30
そのような処理をLog4Jを使って実装するのは適当ではないでしょう。そもそもファイル名は
どうやって特定するのですか? それくらいなら、自力でファイルにログを吐けばよいと思いますが。

さらにいえば、DB登録処理が失敗した時点で画面にメッセージ出力すればいいじゃん、とも
思うのですが、登録処理は非同期で実行されるのでしょうか。
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-05-27 14:43
AppenderをRollingFileAppenderにして
ログを吐くコードの最後でRollingFileAppender:rollOver()で
強制的にローテートを起こすである程度望みの動作になると思います。

やはり、ukさんの言うとおり私も自分で実装しますがね。
なお
常連さん
会議室デビュー日: 2004/02/17
投稿数: 29
投稿日時: 2004-05-27 16:51
引用:
そもそもファイル名はどうやって特定するのですか?


これに関しては、log4j.propertiesに記述しているファイル名を取得しようと思っていました。
(カテゴリからアペンダを取得して、ファイル名を取得という具合に、、)

引用:
DB登録処理が失敗した時点で画面にメッセージ出力すればいいじゃん、とも
思うのですが、登録処理は非同期で実行されるのでしょうか。


私も、画面にメッセージでいいと思うのですが、仕様でそうなっていますんで・・。
(その仕様を決めてきた人にも相談しているものの、無理だ無理だ、と、、)
登録処理に関しては、原則的に非同期、しかし、同期する事もありうる、となっております。
(これも仕様です。。。)

rollOverメソッドを試させて頂きましたが、
前回分の内容が半角スペースに置き換わっているような結果になりました。

やはり、自分で実装するしかないのでしょうか。。

スキルアップ/キャリアアップ(JOB@IT)