トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

技術的雑談-log4cxx-0.9.7のTimeZoneバグ

技術的雑談-log4cxx-0.9.7のTimeZoneバグ


 環境


  • 使用OS : RedHat Enterprise Linux
  • log4cxx-0.9.7

 現象

  • log4cxxをリンクしたプリケーションでlocaltime()系の関数を使うと、時刻がOS設定のTimezoneではなく、GMTになってしまう。
  • (日本で使っている場合は)logなどの時刻が9時間遅れる

 原因


log4cxx-0.9.7での既知のバグです。

参照:http://permalink.gmane.org/gmane.comp.apache.logging.log4cxx.devel/137

log4cxx-0.9.7のtimezone.cppの中にあるlog4cxx::helpers::TimeZoneクラスの中で「TZ」という環境変数を操作していますが、TimeZoneクラスのコンストラクタを空文字列で初期化しようとしたときはTZ環境変数も空文字に設定されてしまう為、結果的にGMTとして認識されてしまいます。

参照: linux JMプロジェクト、tzset(3)より抜粋

TZ 環境変数が存在しているが、その値が空だったり、以下に示す形式のどれにも
あてはまらない場合は、協定世界時 (Coordinated Universal Time: UTC) が
用いられる。

また、TimeZoneクラスの中で、環境変数を変更したままほったらかしている。
結果、そのプロセスで以降TimeZoneがGMTになってしまう。

TimeZoneクラスは自身の中に自身のstaticなインスタンスを持っている為、liblog4cxx.soが読み込まれた時点でTimeZoneクラスのコンストラクタが呼ばれる。
なのでアプリケーションの最初からTimeZoneが狂う恐れがある。

詳細な原因は不明だが、log4cxxのSyslogAppenderでsyslogを出力させると突然TimeZoneが直ったりする。

 対処


上記のURLにあるパッチを適用する。

もしくは、2006/02/16現在まだリリースされていないが、log4cxx-0.9.8にupgradeする。
log4cxx-0.9.8ではTimeZoneなどの計算処理にapr(Apache portable Runtime : Apacheプロジェクトの汎用的なLibraryらしい)を使っているので、ソースを見る限りでは同じ問題は起こさないらしい。少なくともTimeZoneクラスの中では。

しかし、log4cxx-0.9.7の中ではアチコチでTZ環境変数をいじっている所があるので何か危険なにおいがする。


 履歴

2005/02/16 -- 初版

技術的雑談へ戻る

 突っ込み

name   comment  
URL (入力するとす ぱ むとみなします!)


技術的雑談へ戻る

TrackBack

TrackBack URL for this entry:
http://www.himajin2001.com/fswiki/tb.cgi/%B5%BB%BD%D1%C5%AA%BB%A8%C3%CC%2Dlog4cxx%2D0%2E9%2E7%A4%CETimeZone%A5%D0%A5%B0

技術的雑談へ戻る

最終更新日時:最終更新時間:2006年02月16日 12時04分39秒
トップページに戻る