この機能欲しかったんだよねー。

CustomLogで、pipeしてrotatelogsを使ってログ分割を行う場合、

CustomLog "|/path/to/rotatelogs /path/to/log/access_log.%Y%m%d%H 7200 540"

ログファイルは、

$ ls -1
access_log.2012030116
access_log.2012030118

の様に最新のファイルが変更になります。tail -f で追いかけていた場合は、途中でファイルを手動で切り替えないとならないのでとても不便です。また、fluentdのtail pluginも利用できません。

Apache 2.4.1 のrotatelogsでは、最新のファイルに対してハードリンクを張る機能が追加されたので、とりあえず試してみました。

$ wget http://ftp.riken.jp/net/apache//httpd/httpd-2.4.1.tar.gz
$ tar zxf httpd-2.4.1.tar.gz
$ cd httpd-2.4.1

2.4.1のソースコード中にはapr,apr-utilが含まれていないのでこちらもダウンロード

$ cd srclib
$ wget http://ftp.kddilabs.jp/infosystems/apache//apr/apr-1.4.6.tar.gz \
    http://ftp.kddilabs.jp/infosystems/apache//apr/apr-util-1.4.1.tar.gz       
$ tar zxf apr-1.4.6.tar.gz
$ tar zxf apr-util-1.4.1.tar.gz  
$ mv apr-1.4.6 apr
$ mv apr-util-1.4.1 apr-util
$ cd ..

そしてbuild。

$ ./configure --prefix=/path/to/httpd24 --enable-static-rotatelogs --with-included-apr
$ make

enable-static-rotatelogs を使うと、依存の無い(コピーして使える) rotatelogs コマンドが作れるので便利です。今回は rotatelogs を試したいだけなので、make install はしません

ビルドできたらrotatelogsを試しに実行

./support/rotatelogs 
Incorrect number of arguments
Usage: ./support/rotatelogs [-v] [-l] [-L linkname] [-p prog] [-f] [-t] [-e] [-c] <logfile> {<rotation time in seconds>|<rotation size>(B|K|M|G)} [offset minutes from UTC]

Add this:

TransferLog "|./support/rotatelogs /some/where 86400"

or 

TransferLog "|./support/rotatelogs /some/where 5M"

to httpd.conf. By default, the generated name will be
<logfile>.nnnn where nnnn is the system time at which the log
nominally starts (N.B. if using a rotation time, the time will
always be a multiple of the rotation time, so you can synchronize
cron scripts with it). If <logfile> contains strftime conversion
specifications, those will be used instead. At the end of each
rotation time or when the file size is reached a new log is
started.

Options:
  -v       Verbose operation. Messages are written to stderr.
  -l       Base rotation on local time instead of UTC.
  -L path  Create hard link from current log to specified path.
  -p prog  Run specified program after opening a new log file. See below.
  -f       Force opening of log on program start.
  -t       Truncate logfile instead of rotating, tail friendly.
  -e       Echo log to stdout for further processing.
  -c       Create log even if it is empty.

The program is invoked as "[prog] <curfile> [<prevfile>]"
where <curfile> is the filename of the newly opened logfile, and
<prevfile>, if given, is the filename of the previously used logfile.

「-L」オプションがどうやらそれの様子。

次にログを rotatelogs にログを渡す perl スクリプトを作って実際に切り替わるか試してみます。

#!/usr/bin/perl

use strict;
use warnings;

open(my $fh, '|-:unix', './support/rotatelogs',
    '-L','./log/access_log.link',
    './log/access_log.%Y%m%d%H%M','60','540') or die $!;
while(1){
    print $fh "[".localtime()."] foo bar\n";
    sleep 1;
}

上記のスクリプトでは access_log.%Y%m%d%H%M がログファイルで、access_log.link をリンクとして、60秒ごとにログファイルを切り替えるようにrotatelogsを起動し、1秒ごとにログを出力します。

こいつをtest.plとして保存し実行して、

$ perl test.pl

ログを tail -F(大文字) で観察。

$ tail -F log/access_log.link
[Thu Mar  1 18:21:55 2012] foo bar
[Thu Mar  1 18:21:56 2012] foo bar
[Thu Mar  1 18:21:57 2012] foo bar
[Thu Mar  1 18:21:58 2012] foo bar
[Thu Mar  1 18:21:59 2012] foo bar
tail: `access_log.link' has been replaced;  following end of new file
[Thu Mar  1 18:22:00 2012] foo bar
[Thu Mar  1 18:22:01 2012] foo bar
[Thu Mar  1 18:22:02 2012] foo bar
[Thu Mar  1 18:22:03 2012] foo bar

59秒と00秒の間で切り替わりました。よさそう。

staticでビルドすれば、Apache 2.4系を使わなくても rotatelogsだけコピーして、2.2系のサーバに使ったりできるので、今すぐにでもrotatelogsでローカルのログを管理しつつ、fluentも使うことができるんじゃないでしょうか。

このブログ記事について

このページは、Masahiro Naganoが2012年3月 1日 18:57に書いたブログ記事です。

ひとつ前のブログ記事は「GrowthForecastに1分更新グラフ作成とサマリーなどのJSONフォーマットでの出力機能追加」です。

次のブログ記事は「「Webエンジニアのためのデータベース技術[実践]入門」を読みました 」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja