- - PR -
weblogicデプロイ後のログ出力(log4j.DailyRollingFileAppender)について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-04-28 13:11
いつも参考にさせていただいています。
現在アプリケーションのログを日毎に切り替えを行っているのですが、 weblogicコンソールよりwebアプリケーションのデプロイを行うと次の日に ログファイルの切り替えに失敗しています。 <エラー内容↓> log4j:ERROR Failed to rename [test.log] to [test.log.2006-01-02]. weblogicの再起動を行うと、切り替えに成功し問題は解決するのですが。 恐らく、デプロイを行う前の状態でログファイル(test.log)が編集中(ログ書込中?)等に なっておりログファイルの切り替えに(test.log編集中のため)失敗しているものと思わ れます。 <log4j.xml記載内容> ------------------------------------------------------------------------------ <appender name="AccessLogTest" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="test.log"/> <param value="'.'yyyy-MM-dd" name="DatePattern"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="'%p', '%c', '%m', '%X{target}', '%X{action}', '%X{user}', '%d{yyyy-MMM-dd HH:mm:ss}')%n"/> </layout> </appender> ------------------------------------------------------------------------------ log4j.xmlファイルでファイルの切り替える前にログファイル(test.log)をクローズ する(または強制的に切り替える)ことは可能でしょうか? また、他に切り替えに失敗しない方法などありましたら、ご教示をよろしく御願い致 します。 |
|
投稿日時: 2006-04-28 16:13
再デプロイ後にも同じ Applender/Logger を使い回せるよう、Log4j をシステムクラスパスにいれてしまってはいかがでしょう?
少々強引ですが。 |
|
投稿日時: 2006-04-29 17:38
インギ様ご回答有難うござます。
再デプロイはweb.xml内を読んでると思うのですが、この中に log4j.xmlを読込むようなの記述を入れるということでしょうか。 それとも、再デプロイ実行コマンド(.cmd?)ファイルのようなものが 存在し、それにlog4j.xmlのパスを追記するということでしょうか? 上記の認識が間違えていたらすみませんが、「システムクラスパス」 を入れる場所とは具体的にどこでしょうか? 勉強不足でもうしわけありませんが、よろしくお願い致します。 |
|
投稿日時: 2006-04-29 19:17
今は WEB-INF/lib 以下に log4j のライブラリが配置されているのだと思います。
この状態だと再デプロイする度に新しいクラスローダでライブラリを読みこみます。 すると、タイミングによっては古いクラスローダで保持しているファイルハンドルが解放されないまま新しいクラスローダでログをローテートしようと試みてしまい、失敗するのではないかと思いました。 システムクラスパスとは、Web アプリケーション独自のクラスではなく、JVM グローバルで読み込まれるクラスパスです。つまり、startWebLogic.sh/cmd に記述されているクラスパスのことです。 こちらで読み込むようにクラスパスを変更しておくことで、ライブラリの読みこみ直しが発生しなくなります。 WebLogic Server のクラスローディングの仕組みについては以下のページに記載されています。 ・WebLogic Server J2EE アプリケーション クラスローディング http://edocs.beasys.co.jp/e-docs/wls/docs81/programming/classloading.html |
|
投稿日時: 2006-04-30 17:14
インギ様ご回答有難うございます。
>今は WEB-INF/lib 以下に log4j のライブラリが配置されているのだと思います。 上記の通りです。 >システムクラスパスとは、Web アプリケーション独自のクラスではなく、JVM グローバ >ルで読み込まれるクラスパスです。 >つまり、startWebLogic.sh/cmd に記述されているクラスパスのことです。 >こちらで読み込むようにクラスパスを変更しておくことで、ライブラリの読みこみ直し >が発生しなくなります。 なるほど、「startWebLogic.sh/cmd」の記述にWEB-INF/lib/log4jのjarファイルを読み込むように変更すればよいのですね。 確認ですが、上記内容は最初のweblogic起動時にWEB-INF/lib/log4jを読み込むように変更しておくと、その後、再デプロイを行った場合WEB-INF/lib/log4jの読み込み直しが発生せず「古いクラスローダで保持しているファイルハンドルが解放されないまま新しいクラスローダでログをローテートしようと試み」が発生しないのではということでよろしいのでしょうか? 認識が間違えていましたら申し訳ありません。 >WebLogic Server のクラスローディングの仕組みについては以下のページに記載されて >います。 >・WebLogic Server J2EE アプリケーション クラスローディング >http://edocs.beasys.co.jp/e-docs/wls/docs81/programming/classloading.html 参考にさせて頂きます。 大変有難うございます。早速試してみます。 |
|
投稿日時: 2006-05-01 01:01
>なるほど、「startWebLogic.sh/cmd」の記述にWEB-INF/lib/log4jのjarファイルを読み込むように変更すれ
>ばよいのですね。 そうですね。 ただ、WEB-INF/lib 以下のライブラリは通常 Web アプリケーションのクラスローダで読み込まれるので誤解が生じやすいです。ドメインディレクトリ直下とか、ドメインディレクトリ/lib とか掘って配置したほうが後々混乱は少ないかもしれません。 >変更しておくと、その後、再デプロイを行った場合WEB-INF/lib/log4jの読み込み直しが発生せず「古いクラ >スローダで保持しているファイルハンドルが解放されないまま新しいクラスローダでログをローテートしよ >うと試み」が発生しないのではということでよろしいのでしょうか? はい。そうなると思います。私の手元では未検証ですが。 別の方法になりますが、もしlog4jでファイルハンドルを解放する仕組みが用意されているのであれば Servlet の destroy() メソッドとかで処理する手もあります。 |
|
投稿日時: 2006-05-01 16:46
インギ様、度々の御回答有難うございます。
>システムクラスパスとは、Web アプリケーション独自のクラスではなく、JVM グロー >バルで読み込まれるクラスパスです。 >つまり、startWebLogic.sh/cmd に記述されているクラスパスのことです。 >こちらで読み込むようにクラスパスを変更しておくことで、ライブラリの読みこみ直 >しが発生しなくなります。 上記内容を試したところ、意図した通り動作しました。 >別の方法になりますが、もしlog4jでファイルハンドルを解放する仕組みが用意されて >いるのであれば Servlet の destroy() メソッドとかで処理する手もあります。 参考にさせて頂きます。 調査し、この方法も可能であれば試してみたいと思います。 インギ様、大変勉強させて頂きました。 真にありがとうございます。 |
|
投稿日時: 2008-12-01 18:21
この件(ログファイルのリネームに失敗)ですが、以下の条件でも発生しました。
・WindowsXP ・WebLogic 9.2 ・Log4J 1.2.15 ・JDK5 これはhttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47061&forum=12&6と原因は同じと思いますが、Win+JDK5でも発生するようです。 ただし、リネームに失敗しても、ファイルは消えませんでした。 (以前は、リネームエラー後、0バイトファイルが再作成されたように思います) |
1