nginxでログをsyslogに出力する

nginx

やりたいこと

オープンソース版の nginx はログを専用のファイルだけに出力するようになっている。
有償版 nginx を使うと、 ngx_http_log_module モジュール経由で syslog 出力可能。
今回は github で公開されているパッチ(yaoweibin / nginx_syslog_patch)を適用することで nginx のログを syslog 出力させる。

インストール

$ wget http://nginx.org/download/nginx-1.4.4.tar.gz
$ tar zxfv nginx-1.4.4.tar.gz
$ cd nginx-1.4.4
$ git clone https://github.com/yaoweibin/nginx_syslog_patch.git
$ patch -p1 < nginx_syslog_patch/syslog_1.4.0.patch
patching file src/core/ngx_cycle.c
patching file src/core/ngx_log.c
patching file src/core/ngx_log.h
patching file src/http/modules/ngx_http_log_module.c
patching file src/http/ngx_http_core_module.c
Hunk #2 succeeded at 4895 (offset 2 lines).
Hunk #3 succeeded at 4913 (offset 2 lines).
Hunk #4 succeeded at 4952 (offset 2 lines).
patching file src/http/ngx_http_request.c

$ ./configure --add-module=./nginx_syslog_patch
$ make
$ sudo make install

syslog 出力設定

/usr/local/nginx/conf/nginx.conf を変更

最低限の変更は以下

  • syslog のファシリティを設定
  • main の名前で log_format を定義
  • server ディレクティブ内でログの出力先に syslog を指定
$ diff -u nginx.conf.default  nginx.conf
--- nginx.conf.default  2014-01-19 10:55:59.267265629 +0000
+++ nginx.conf  2014-01-19 11:53:58.177324562 +0000
@@ -8,6 +8,7 @@

 #pid        logs/nginx.pid;

+syslog local6 nginx;

 events {
     worker_connections  1024;
@@ -18,9 +19,9 @@
     include       mime.types;
     default_type  application/octet-stream;

-    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
-    #                  '$status $body_bytes_sent "$http_referer" '
-    #                  '"$http_user_agent" "$http_x_forwarded_for"';
+    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+                      '$status $body_bytes_sent "$http_referer" '
+                      '"$http_user_agent" "$http_x_forwarded_for"';

     #access_log  logs/access.log  main;

@@ -39,6 +40,7 @@
         #charset koi8-r;

         #access_log  logs/host.access.log  main;
+        access_log  syslog:notice|logs/host.access.log main;

         location / {
             root   html;

ログを確認

curl で nginx にアクセスし、実際に syslog 出力されることを確認。

$ sudo tail -f /var/log/messages
Jan 19 11:55:37 image nginx: 127.0.0.1 - - [19/Jan/2014:11:55:37 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"

nginx が標準で syslog 対応していない理由

nginx が標準で syslog 対応していない理由について、開発者は次のようにコメントしている

The main problem with syslog in general is that it’s interface
blocks, and if syslogd daemon is dead/can’t cope with load nginx
won’t be able to work. Additionally, it’s slow/resource
consuming. Writing normal files is much faster and more reliable.
http://forum.nginx.org/read.php?2,225811,225811

なお、nginx フォークの Tengine(taobao 開発) は non-blocking な syslog を独自実装している

Advertisements
Tagged with: ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 4 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 4 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: