2008年7月1日火曜日

JettyのNCSAログの問題

  • Jettyは、(Combined)NCSAログを出力することができます
  • 単体でApacheのログ相当のものが取れるということで便利そう
  • 実際アクセスログは役に立っています。
  • 複雑なアクセス解析の要件があったのでログ解析ツールに投げ込んでみたところInvalid NCSA Log。ハア(゚Д゚)? このログアナライザ腐ってんじゃね?
  • 腐ってるのはJettyの方でした
  • ログのおかしな点は二点
  1. 二番目の出力。ユーザー名が空なのはいいが(たいてい空だ)、"-"と出力されずたんなる半角空白として出力されている。これは不正。
  2. タイムスタンプが[27/7/2008:10:16:17 +0900]とか出力されている。月の表記がおかしい。英語風に`Jul`が出力されないといけない。
  • ひとつめは、ログアナライザもそのくらい判別しろよ、というところで、まあ微妙なところとして(そもApacheのページにそう出力するよと書いてあるんだからそうすべきだが)
  • 二つ目は原因がはっきりしている。日付出力のロケールにさ。Locale.getDefault()とかやってるわけです。でロケールが日本になって。こういなことに。
  • 文句言いたいところですが窓口がわかりません
  • とにかく確認するためにNCSARequestLogのソースを追ってみる。(version:6.1.11)
  • 55:private Locale _logLocale = Locale.getDefault();
  • せめていじれるようにしてくれ。
  • ユーザーの方も
  • 250:String user = request.getRemoteUser();
  • 251:buf.append((user == null)? " - " : user);
  • これか。ありゃこれは正しいのか。でもハイフンの左右に空白が入ることが前提でハイフンいれてるから。-(空白2)-(空白2)という感じになって、パースミスがソフトによっては生じてるのね。これはソフトが糞でいいか。
  • まあ急ぎでもないしgrepで置換すればなんとかなるのでいいや。機会と調べる暇があったらバグ報告しておこう
  • アメリカ人中心の考えでバグは多いが、このパターンは逆だな。USロケールにしとけばなんの問題もないのに。あえてI18Nのためにデフォルトにしとけばオッケーでバグになってる。