Майте журнал nginx access_log та log_log для STDOUT та STDERR головного процесу


137

Чи існує спосіб мати головний журнал процесів STDOUT STDERR замість файлу?

Здається, що ви можете пройти лише файловий шлях до директиви access_log:

access_log  /var/log/nginx/access.log

І те саме стосується error_log:

error_log /var/log/nginx/error.log

Я розумію, що це просто не може бути особливістю nginx, мені було б цікаво стисле рішення, яке використовує, наприклад, хвіст. Бажано, щоб він походив з основного процесу, хоча я працюю на nginx на передньому плані.


14
Використання Nginx всередині контейнера Docker? Оформити цю відповідь .
czerasz

Прийнята відповідь (Патріка) працює для офіційних образів докерів Nginx (hub.docker.com/_/nginx).
Фаршид Т

Відповіді:


198

Редагувати: схоже, nginx зараз підтримує, error_log stderr;як згадується у відповіді Анона .

Ви можете надіслати журнали до /dev/stdout. В nginx.conf:

daemon off;
error_log /dev/stdout info;

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

редагувати: Можливо, потрібно запустити ln -sf / proc / self / fd / dev / якщо використовується певні контейнери докера, тоді використовуйте /dev/fd/1або/dev/fd/2


2
Коли я намагаюся це зробити, я отримую таку помилку: 29.07.2014 10:19:09 [emerg] 13742 # 0: open () "/ dev / stdout" не вдалося (13: дозвіл відхилено)
Джон Тірсен

1
Джон, на якій системі ти працюєш? У моїй системі / dev / stdout - це прочитане у всьому світі символьне посилання на / dev / fd / 1, яким володіє та читає + записується моїм користувачем.
Патрік

1
Я бачу цю помилку, ENXIOколи stdout відкритий для сокета, а не до файлу. Існує білет на бік ядра, що вказує, що це навмисно і з наміру: bugzilla.kernel.org/show_bug.cgi?id=1360 - таким чином, хоча ця відповідь достатня в деяких випадках, вона не повністю покриває діапазон можливих невдачі.
Чарльз Даффі

1
Втратили на цьому кілька годин без жодного успіху. Спробував змінити все (режими демон, користувачі, версії nginx тощо). Це просто не працює для мене. "" "open ()" / dev / stderr "не вдалося (6: Немає такого пристрою чи адреси)" "" (ті ж проблеми із stdout, але nginx має виводитись stderrзгідно з документами)
Іван Клешнін,

1
Всередині докера вам може бути відмовлено у дозволі, якщо ваш процес не працює як корінь у контейнері. У наступній версії виправлено це рішення.
Dobes Vandermeer

54

Якщо питання стосується докера ... офіційні зображення докера nginx роблять це, роблячи софтпосилання в напрямку stdout / stderr

RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log

REF: https://microbadger.com/images/nginx


5
Ця відповідь здебільшого правильна, але, на жаль, не для альпійських зображень (див. Github.com/nginxinc/docker-nginx/blob/master/stable/alpine/… ), лише для інших, як Джессі , використовують це твердження. Якщо ви альпійський користувач, просто створіть свій власний Dockerfile за допомогою FROM nginx:alpine RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log CMD ["nginx-debug", "-g", "daemon off;"]
jonashackt

1
Відповідь Патріка працює для офіційних зображень nginx ( hub.docker.com/_/nginx ), як для debian (остання), так і для альпійських баз.
Фаршид Т

Здається, ваше посилання REF померло.
peedee

@jonashackt Я використовував альпійські зображення, і я знайшов, що він також увійшов до stdout
Qiulang

Клацніть на версію ( hub.docker.com/_/nginx ), щоб побачити файл докера з вищезгаданим рядком (десь перед рядком 100).
qräbnö

24
Syntax: error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
Default:    
error_log logs/error.log error;
Context:    main, http, stream, server, location

http://nginx.org/uk/docs/ngx_core_module.html#error_log

Не використовуйте: /dev/stderr це порушить вашу установку, якщо ви збираєтесь використовувати systemd-nspawn.


5

Запускаючи Nginx в контейнері Docker, пам’ятайте, що том, встановлений над журналом dir, перемагає мету створення програмного зв’язку між файлами журналу та stdout / stderr у вашому Dockerfile, як описано у відповіді @Boeboe .

У такому випадку ви можете або створити програмне посилання у вашій точці входу (виконується після встановлення томів), або взагалі не використовувати об'єм (наприклад, коли журнали вже зібрані центральною системою журналу).


3

У зображенні докера PHP-FPM я бачу такий підхід:

# cat /usr/local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2

[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2

1

Для налагодження:

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"

З класичною метою

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"

Вимагають

Під серверною дужкою на конфігураційному файлі

access_log /dev/stdout;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.