LINUX.ORG.RU
ФорумAdmin

nginx и логгирование в ram с ограничением размера?

 ,


0

3

На нагруженной системе традиционно отрубаю в nginx нафиг логгирование всяких assets (кстати, как это будет по-русски?) — картинок/js/css.

Сейчас понадобилось изучить общую картину нагрузки. Можно, конечно, включить временно запись в логи для этих файлов, но хочется немного более изящного решения. Идея — писать всё в один файл в tmpfs, но жёстко лимитировать его размер (общая статистика не нужна, достаточно за какой-то короткий последний период). В лоб можно тупо каждые N минут сбрасывать этот файл через echo -n > /tmp/nginx-access.log, но нет ли более изящного решения?

И второй вопрос — нельзя ли настроить nginx, чтобы кроме раскладывания по тематическим фильтрованным логам (по хостам) дублировать такие записи в общий файл (тот самый, короткий, в tmpfs)?

★★★★★

И второй вопрос — нельзя ли настроить nginx, чтобы кроме раскладывания по тематическим фильтрованным логам (по хостам) дублировать такие записи в общий файл (тот самый, короткий, в tmpfs)?

Просто повторить access_log сколько нужно и куда нужно:

    server {
        server_name  localhost1;
        access_log  /var/log/nginx/localhost1.log
        access_log  /var/log/nginx/access.log
    }

    server {
        server_name  localhost2;
        access_log  /var/log/nginx/localhost2.log
        access_log  /var/log/nginx/access.log
    }

В этом примере /var/log/nginx/access.log будет общим для всех хостов.

fjoe
()
Ответ на: комментарий от fjoe

Просто повторить access_log сколько нужно и куда нужно:

Ага, спасибо, то, что надо.

KRoN73 ★★★★★
() автор топика

Сопутствующий вопрос. Можно ли оставить n последних строк файла без создания временного файла? Т.е. что-то более изящное, чем tail && mv?

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Я делаю немного по-другому:
1) mv /var/log/nginx/access.log /var/log/nginx/access.log-2014-01-11-22-06-15 # убираем старый лог
2) killall -SIGUSR1 nginx # пишем лог в новый файл

Там, где оставлять логи не нужно - просто '> /var/log/nginx/access.log' - то же самое, что в первом посте, да.

fjoe
()
Последнее исправление: fjoe (всего исправлений: 1)
Ответ на: комментарий от fjoe

Полноценные логи у меня итак хранятся как положено и logrotate обрабатываются раз в сутки. Тут вопрос именно в хранении серии последних запросов в tmpfs для оперативного анализа. Пока так сделал, но хочется изящее:

#!/bin/sh

for f in /tmp/nginx*.log; do
    tail -n 5000 $f > /tmp/tail.tmp
    mv -f /tmp/tail.tmp $f
done

/etc/init.d/nginx reload
KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Тут вопрос именно в хранении серии последних запросов в tmpfs для оперативного анализа.


/var/log/nginx/access.log-2014-01-11-22-06-15 будет содержать все запросы с последнего SIGUSR1. Не по 5000 (количеству), а по времени (сколько времени прошло с последнего SIGUSR1).

fjoe
()

В logroute есть всё, что тебе нужно. Он ведь всё равно уже установлен и работает, так что он не будет лишней сущностью.

unikum ★★★★★
()
Ответ на: комментарий от KRoN73

вот псевдокод :)

ПОКА размер_файла больше 5Mb
ДЕЛАЙ
sed "удали первые 1000 строк" имя_файла
ГОТОВО

Bers666 ★★★★★
()
Ответ на: комментарий от KRoN73
while [ -n Z ]; do
    
    for f in /tmp/nginx*.log; do
        mv -f $f $f_last
    done
    
    /etc/init.d/nginx reopen
    <тут запускается скрипт сбора статистики из файлов *_last>
    <тут эти файлы удаляются или архивируются>
    sleep 30
done

Добавлненный в init-скрипт reopen выглядит так(на centos/redhat)

reopen() {
    echo -n $"Reopening logs for $prog: "
    killproc $nginx -USR1
    echo
}
Если нужно только переоткрыть лог - дешевле именно это и сделать, а не перечитывать конфиг + рестартить процессы nginx (что делает reload)

fjoe
()
Ответ на: комментарий от fjoe

Если нужно только переоткрыть лог - дешевле именно это и сделать, а не перечитывать конфиг + рестартить процессы nginx (что делает reload)

Учёл.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от Bers666

nginx-у не поплохеет, что его долбят USR1 каждые 30 сек?

У меня — раз в 10 минут. Он и reload-то делает за доли секунды (в отличие от restart), так что раз в 10 минут — пофиг.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от fjoe

рестартить процессы nginx (что делает reload)

Не знаю как в вашем дистре, а в убунте reload это HUP (только что глянул в инит скрипт)

Bers666 ★★★★★
()
Ответ на: комментарий от Bers666

Переоткрытие лог файла - очень лёгкая операция. Хоть каждую секунду.

fjoe
()
Ответ на: комментарий от Bers666

Потому я и добавляю reopen (SIGUSR1) который применяю вместо reload (SIGHUP)

fjoe
()
Ответ на: комментарий от Bers666

гм, точно! nginx:

HUP изменение конфигурации, обновление изменившейся временной зоны (только для FreeBSD и Linux), запуск новых рабочих процессов с новой конфигурацией, плавное завершение старых рабочих процессов


USR1 переоткрытие лог-файлов

Bers666 ★★★★★
()
Ответ на: комментарий от KRoN73

Да, чуть не забыл.

tail -n 5000 $f > /tmp/tail.tmp
mv -f /tmp/tail.tmp $f
Тут открытый лог файл переписывается новым (размером в 5000 строк). При этом затёртый лог (который там был до mv) остаётся открытым nginx'ом и nginx пишет всё туда, в уже несуществующий файл. После reload/reopen эти записи в несуществующем файле исчезнут вместе с файлом. Т.е. часть статистики потеряется. Насколько много? Зависит от времени выполнения этого скрипта. Если он обрабатывает 10000 файлов в цикле, а скорость поступления записей в файл 1000 строк в секунду, то первый обработанный лог потеряет приличное количество записей.

Не знаю, критично это или нет в данном случае. Мне, вот, критично, потому я с открытыми логами ничего не делаю. Только перемещение+закрытие дескриптора через SIGUSR1. Гарантировано ничего не потеряется.

fjoe
()

А nginx, случаем, еще не научили апачеподобному piped logging'у?
Если нет, то можно писать в rsyslog, он вроде как умеет ограничение логфайлов по размеру и кастомное действие по вылезанию за лимит.

thesis ★★★★★
()
Ответ на: комментарий от thesis

Для rsyslog точно где-то видел стороннее расширение, сам не пробовал, мне разбивать логи по времени удобнее, чем по размеру.

На счёт pipe не знаю, но можно попробовать прикрутить, например, named pipe, тот, что через mkfifo создаётся. Просто указать его в конфиге nginx в access_log директиве вместо обычного файла, и должно запуститься без проблем.

fjoe
()
Ответ на: комментарий от fjoe

но можно попробовать прикрутить, например, named pipe

Ну это все-таки не то. Логить в fifo - как-то очень уж костыльно.

thesis ★★★★★
()
Ответ на: комментарий от fjoe

Не знаю, критично это или нет в данном случае

Не критично. Статистика для долговременного хранения всё равно пишется по-старому на HDD.

KRoN73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.