Windows版のApacheでログを完全に出力しないようにする

この記事は最終更新日から1年以上が経過しています。情報が古くなっている可能性があります。

いろいろあって Windows 版の Apache を使っているんですが、実は古いログを消してくれません。

Windows の場合、デフォルト状態だと (Apacheのあるフォルダ)/logs/error.log に書き込まれるようになっていますが、ずっと起動していても、再起動してもずっとログが追記されていってしまうので、こまめに消しておかないと数GBに膨れ上がることがあったり…

Linux だとログ管理ツール (logrotate) が良きに計らって1日ごとにファイルを分けたり古いログから消してくれるんですが、残念ながら Windows には logrotate のような機能はないようで、バッチファイルを定期的にタスクスケジューラで実行させる等のひと工夫が必要になります。

大量に書き込まれた 4GB 近いエラーログのせいで php の exec() が Apache 経由で正常に実行できない不具合に遭遇したことがあります…(ログを消したら直った)
直接の原因はよくわからないけど定期的にログを消しておく事に越したことはなさそう

それならいっそ、ログを完全に出力しないようにしてみましょう。

Sponsored Link

方法

htpd.conf 中の

ErrorLog "logs/error.log"

の部分を

ErrorLog nul

に変えるだけです。
あと、mod_log_config が有効になっている場合は # をつけてコメントアウトしておきましょう。

error.log はファイル自体は作成されますが、中身は空っぽで書き込まれていないはずです。

解説

私もよくわかっていないのですが、Windows にも Linux でいう /dev/null みたいなデバイス、nul (nullではない) があります。
nul デバイスは指定した出力を捨ててくれる(ブラックホール的な)もので、ファイル名の代わりに指定して出力を捨てたりできるらしいです。

ErrorLog に nul を指定することで、エラーログが全て nul デバイスに流れてエラーログに一切書き込まれないようになっていると思われます(実際のところはよくわからんけど動いてるからヨシ!)

正確には起動に失敗するような致命的なエラーは問答無用でログに書き込まれるようですが、滅多に起こらないので目的は満たせていると思います

コメント

  1. 別にLinuxでもApacheがログを削除しているわけではないですね。
    良きに計らってくれているのはlogrotateです。

    • そうなんですね…!普段意識したことがなかったので初耳でした…
      ご指摘ありがとうございます!修正しておきます。