Apacheでアクセスログがたまに欠落します。欠落した場合は、欠落したログの先頭に「Error writing to log file. 10000000 messages lost.」というエラー文字が追加されています。


この現象はアクセス数の増加に伴って頻発しております。Apacheのアクセスログはrotatelogsを使って、ログローテーションしています。何らかの原因でアクセスログが吹っ飛び、そこからログを書き直しはじめるので、欠落した日のログは極端に少ないです。原因は何でしょうか?また、その対処方法も教えて下さい。

ログDIRでls -lすると

----
root root   2223423 access_log_20080224 (欠落)
root root    72547 access_log_20080225 (欠落)
root root 1831166391 access_log_20080226 (正常)

回答の条件
  • 1人3回まで
  • 登録:2008/02/27 21:05:19
  • 終了:2008/02/28 00:45:32

回答(2件)

id:y-kawaz No.1

y-kawaz回答回数1421ベストアンサー獲得回数2262008/02/27 22:02:38

ポイント40pt

欠落したファイルの例を見た限りでは正常なファイルサイズが 1.8GB となっており、2GB(正確には2147483647バイト)を超えるファイルが無いことです。

恐らくlsで省略した部分にも2GBを超えるものはないのではないでしょうか?

大きく欠落しているファイルはおそらくファイル内の位置を示す値が2GBに到達してしまったために想定外の問題が起きて最初から上書きされてしまったような状況と考えられます。

Linuxには2Gの壁と呼ばれるものがあり、lseek() などファイル内の読み出し位置を移動する関数に与える値の型に signed long (2^31-1=2147483647が最大)が使われている為に発生するものです。

最近のファイルシステムでは2GBの壁は取り除かれていますがアプリケーション側でそれを想定していない作りの場合はこの壁は依然存在します。


いちばん簡単な解決策は2GBに到達しない程度に分割する、ということです。

おそらく現在は以下のような設定になっていると思われますが、

CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log_log_%Y%m%d 86400 540" combined

1日毎の分割では2GBに達してしまうようなので更に以下のように時間ごとにも分割されるようにすればよいと思われます。

CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log_log_%Y%m%d_$H 3600 540" combined
id:redhat

なるほど、「2Gの壁」恥ずかしながら、初めて知りました。ログを分割して対処したいと思います。ありがとうございました。

2008/02/28 00:44:48
id:toohigh No.2

toohigh回答回数291ベストアンサー獲得回数372008/02/28 00:07:09

ポイント35pt

ログのサイズが大きすぎること、が原因でしょう。

正常に作成された場合のログのサイズが 1.8GB 程度ということで、2GBの壁の影響かと思われます。

対処方法ですが、こんなところでしょうか。

  • 手っ取り早いのは、rotatelogs のオプションを変えて、たとえば一時間ごとにログファイル名が変わるようにする。もちろん、ファイルサイズでのローテートを使うなどの方法も可能。
  • apache のコンパイル時に、ソースの一部を書き換えて rotatelogs が 2GB 以上の出力(LARGEFILE)ができるようにする。

分かりやすさその他の理由から前者の方がおすすめかな、という気がします。

id:redhat

なるほど、「2Gの壁」恥ずかしながら、初めて知りました。ログを分割して対処したいと思います。ありがとうございました。

2008/02/28 00:44:54

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません