user icon

DockerのJenkinsコンテナでアクセスログについて悩んでいた

muraveです。

今年の4月にリリースされたJenkins 2系をDocker公式イメージ

OFFICIAL REPOSITORY jenkins

で試していたのですが、Webフックからキックしてのビルドを試していて大変ハマリました。Webフックからのアクセス状況とかどうなってんだ?などなどtcpdumpとか使って調べてたんですけど、アクセスログもあったほうがいいよね、と思ったのでした。

公式イメージのJenkinsさんってそのまま立ち上げたらアクセスログ出してくれないんですよね。

調べまして、JENKINS_OPTSに

--accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=ログファイルのパス

てな感じで設定すれば良いことはわかりました。分かりましたが、コンテナ内やボリュームにログファイルを出すのは違う気がします。docker logs で見ることができるログはどういう扱いなんでしょう?

デフォルト設定のロギング・ドライバのログ(JSON形式)はホストの

/var/lib/docker/containers/(コンテナID)/(コンテナID)-json.log

にあって、これが docker logs の表示元になっています。

問題はどうやったらここに出力されるのか?ですが、標準出力、標準エラー出力へ出力すれば良いそうです。例えば、Nginx公式イメージのDockerfileでは

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

と、/dev/stdout と /dev/stderr へのシンボリックリンクを作成することで対応しているようです。

Jenkinsさんの場合は先ほどのJENKINS_OPTSでログファイルのパス指定が可能でしたので

--accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/dev/stdout

と設定すると標準出力に出力されるようになり、コンテナのログにJenkinsさんへのアクセスログが記録されるようになりました。

これでDockerのロギング・ドライバでアクセスログも統一的にあつかえますね。
例えばFluentdロギング・ドライバに切り替えてログ集約するようにしたりする場合にも安心です。

Facebooktwitterlinkedintumblrmail

Tags: ,

名前
E-mail
URL
コメント

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)