Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Log4J、出力ファイルに任意の文字列出力

いつもお世話になっています。
Log4Jのことで質問させていただきます。

現在Log4Jを利用してログをファイルに
出力させています。
設定ではファイルを1M単位で4つまで
作るようにしていますが、
このファイルを作るときの最初一回だけ
ある決まった文字列を出力させたいと思っています。
現在はログにこの文字列をログが書かれる度に
表示させていますが、これはファイル全体から見て
一回だけで良いことなので、毎回表示するのは
ちょっと無駄のような気がしたからです。
サーバ起動時にやればいいのでは…と
思われるかもしれませんが、現在開発の
仕様上、1つのファイルの中に一回以上は書かれないと
いけないようになっています。
Log4Jにこのような機能があるのでしょうか。
あるとしたら、設定方法などお願いします。



6

回答

79407

閲覧

6件の回答

評価

0

ログ出力のためのロジックを考えないといけないのだろうというところで、目的が今一つ解らないのですが
(本当にそれが適していることなのか等)

>毎回表示するのは
>ちょっと無駄のような気がしたからです。



>現在開発の
>仕様上、1つのファイルの中に一回以上は書かれないと
>いけないようになっています。

の関係も今一つ解らないのですが・・

評価

0

まあさん回答ありがとうございました。
私が書いたところの情報が少なかったようですね。

書きたい文字列のことですが、
バージョン、サーバ情報等などです。
これは現在プロジェクトでの事情になりますが、
お客さんにバグ等が発生した時に上記の情報が
書かれているファイルとログファイルを
送って貰るようにはしています。
しかし、意外にこのようなことを従ってくれなく
お客が多くて毎回メールで送ってくれるように
頼んでいる状況です。
それで、そうだったらログに書いておけばよいのでは…
という話になりまして、ログにこれらの情報を
書くようにしています。
しかし、この情報がちょっと長くて逆に
ログがちょっと読みづらくなってしまうので、
以前の掲示内容にあるようなことをしたいと
思っているのです。
別にLog4Jでは不可能であれば、このファイルを
必ず送って貰うように運用で対応すれば済むことには
なりますが、まず、出来ることなのか出来ないこと
なのかが知りたいと思っています。
すみませんが、よろしくお願いします。

評価

0

あんまり追ってませんが。

org.apache.log4j.RollingFileAppenderを継承してsetFile()で書き出してあげればできるかも。

評価

0

ありがとうございます。
mioさんのおっしゃるとおりにしたらうまくいきました。
Log4Jの仕組みが分からなくてちょっと苦労しましたが、うまく出来たのでかなりうれしいです。
以下のような作業をしました。

1.RollingFileAppender継承したクラスを作る
2.public synchronized void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize) throws IOException メソッドをオーバーライドする。
3.2のメソッドから親のsetFileメソッドを呼び出した後、fileNameを出力ストリームで開いて書き出したいことを書いておく。

私が苦労したのは、2の呼び出しのところで、
呼ばれたパラメータのappendをそのまま渡すようにしたのですが、
最初サーバが起動したときはこの値はtrueとして
渡されてきます。しかし、その後はfalseで来てました。
なので、一番最初のログファイル以降では
書き出した文字列が消えてしまうのです。
どうすれば、trueが渡されるのかまでは
分からないのですが、オーバーライドしたメソッドの中で
このappendを強制的にtrueにしたらうまくいきました。
(もっと調べればもっといい対応できると思うのですが…)

本当に助かりました。ありがとうございました。

評価

0

うまくいったようで何よりです。
今回のような使い方(継承して、やりたいことだけ書く)ができるのも、オブジェクト指向言語の大きなポイントですね。

100%問題ないか分からないうちに書くのもなんですが、参考までに以下のような感じで導きました。

1. ファイルが変わっていく→RollingFileAppenderを見てみる
2. どこかでファイルサイズの比較があるだろうと、「size」を検索して「maxFileSize」を見つける
3. maxFileSizeを比較に使っているsubAppend()を見つける
4. this.rollOver()というそれっぽい名前を呼んでるので見てみる
5. 最後にthis.setFile()というそれっぽい名前を呼んでいるので見てみる
6. 大した処理はないので、オーバーライドして問題なさそうな気がした

log4j自体の仕組みは、あんまり調べてません。どちらかといえばメソッド名からの予想です。

評価

0

回答ありがとうございました。
まだまだ、ソース追っかけは苦手です…
根気よく追っかければいいものの、
途中で挫折してしまうのはオチです。
慣れだとも思いますが…
ソースを読む癖を付けるように頑張ります。
ありがとうございました。

P.S
 ちなみに、私が解決した内容の中で、一つ抜けていますね。一応書いておきます。
私みたいな方に役に立って貰えたらうれしいですけど^^;

4.log4j.properties(私の場合はpropertiesファイル形式でした)のFileAppenderに継承したクラスを指定する


質問から6ヶ月以上経過しているので、回答を書き込むことはできません。