Подтвердить что ты не робот

Nginx log to stderr

Я хочу перенаправить журналы доступа nginx на stdout, чтобы иметь возможность анализировать их через journalctl (systemd).

Есть тот же вопрос с одобренным ответом. Имейте nginx access_log и журнал error_log в STDOUT и STDERR основного процесса Но это не работает для меня. С /dev/stderr я получаю open() "/dev/stderr" failed (6: No such device or address). С /dev/stdout я не получаю журналы доступа в journalctl -u nginx.

nginx.conf

daemon off;

http {
    access_log /dev/stdout;
    error_log /dev/stdout;
    ...
}
...

sitename.conf

server {
    server_name sitename.com;
    root /home/username/sitename.com;

    location / {
        proxy_pass http://localhost:3000/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        access_log on;
    }
}

nginx.service

[Service]
Type=forking
PIDFile=/run/nginx.pid
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=nginx
ExecStartPre=/usr/sbin/nginx -t -q -g 'master_process on;'
ExecStart=/usr/sbin/nginx -g 'master_process on;'
ExecReload=/usr/sbin/nginx -g 'master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5

Я изо всех сил старался обходным путем, изменяя все возможные параметры в коде выше и с разными версиями nginx (1.2, 1.6), но без каких-либо успехов.

Мне действительно очень интересно, как это сделать, поэтому я поднимаю этот вопрос еще раз на другой поток, поскольку считаю, что предыдущий ответ неправильный, спекулятивный или специфичный для среды.

$ journalctl -u nginx

содержит только строки, такие как

 Feb 08 13:05:23 Username systemd[1]: Started A high performance web server and a reverse proxy server.

и никаких признаков журналов доступа: (

4b9b3361

Ответ 1

В соответствии с документацией nginx директива error_log поддерживает stderr в качестве аргумента. Поэтому следующая конфигурация должна записывать сообщения об ошибках в stderr:

http {
    error_log stderr;
    ...
}

К сожалению, access_log не поддерживает stdout в качестве аргумента. Тем не менее, его можно установить в syslog (документация) и заставить systemd включать вызовы syslog в свой журнал.

Ответ 2

server {
    error_log syslog:server=unix:/dev/log;
    access_log syslog:server=unix:/dev/log;
    ...
}

Конфигурация по умолчанию для журнала (я запускаю Ubuntu 15.04) читает из syslog, поэтому этот config - это все, что требуется для просмотра журналов с помощью journalctl -u nginx