- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!技術的雑談-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 -- 初版
[[技術的雑談]]へ戻る
!!突っ込み
{{comment}}
[[技術的雑談]]へ戻る
{{trackback}}
[[技術的雑談]]へ戻る