Rotação de log no NginX no arquivo de configuração

1

Eu tentei este tutorial para girar o arquivo de log sem externo software, mas parece que não funciona, minha configuração no bloco server { :

if ($time_iso8601 ~ "^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})") {}
access_log /var/log/access-$year-$month-$day.log;
error_log /var/log/error-$year-$month-$day.log;

e o arquivo criado, chamado:

-rw-r--r-- 1 root root    0 May 28 17:46 error-$year-$month-$day.log

minha versão do NginX:

nginx version: nginx/1.8.0

built with OpenSSL 1.0.2a 19 Mar 2015

TLS SNI support enabled

configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/bin/nginx --pid-path=/run/nginx.pid --lock-path=/run/lock/nginx.lock --user=http --group=http --http-log-path=/var/log/nginx/access.log --error-log-path=stderr --http-client-body-temp-path=/var/lib/nginx/client-body --http-proxy-temp-path=/var/lib/nginx/proxy --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-imap --with-imap_ssl_module --with-ipv6 --with-pcre-jit --with-file-aio --with-http_dav_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_realip_module --with-http_spdy_module --with-http_ssl_module --with-http_stub_status_module --with-http_addition_module --with-http_degradation_module --with-http_flv_module --with-http_mp4_module --with-http_secure_link_module --with-http_sub_module

    
por Kokizzu 28.05.2015 / 13:18

4 respostas

3

Veja meu comentário acima e o raciocínio de cpburnz, mas se você realmente quiser prosseguir:

Você pode escrever um script que grava apenas os comandos de log em um arquivo de inclusão, com a data atual codificada permanentemente. Você teria esse include d em seu arquivo de configuração do nginx, e seu script reiniciaria ou recarregaria o nginx depois de gravar os comandos de log no arquivo de inclusão.

Algo como:

#!/bin/bash

date='date -Id'

cat > /etc/nginx/includes/log_by_date.inc <<EOF
access_log /var/log/access-${date}.log;
error_log /var/log/error-${date}.log;
EOF

/etc/init.d/nginx restart

Você executaria isso do cron, provavelmente perto da meia-noite.

mais é claro que você precisa include /etc/nginx/includes/log_by_date.inc onde você tem seus comandos atuais de registro.

    
por 28.05.2015 / 15:39
3

De acordo com esse post no blog,

Please note, that it’s not possible to embed variables in error_log directives, as any potential error would not be able to be logged if the file cannot be written.

Com isso em mente, não é possível ter o log de erros girado automaticamente com o formato de nomenclatura error-$year-$month-$day.log usando esse método Nginx.

No entanto, configurar a rotação de log para o log de erros não é muito difícil. Crie um script simples de shell (bash) em /usr/local/bin/rotate_nginx_error_log.sh :

#!/bin/sh
# /usr/local/bin/rotate_nginx_error_log.sh

# Get yesterday's date as YYYY-MM-DD
YESTERDAY=$(date -d 'yesterday' '+%Y-%m-%d') 

PID_FILE=/run/nginx.pid
LOG_FILE=/var/log/error.log
OLD_FILE=/var/log/error-$YESTERDAY.log

# Rotate yesterday's log.
mv $LOG_FILE $OLD_FILE

# Tell nginx to reopen the log file.
kill -USR1 $(cat $PID_FILE)

Certifique-se de que tenha permissões executáveis:

chmod +x /usr/local/bin/rotate_nginx_error_log.sh

Em seguida, adicione um cronjob ao seu crontab que gira o log todas as noites à meia-noite:

0 0 * * * /usr/local/bin/rotate_nginx_error_log.sh
    
por 28.05.2015 / 15:29
1

Aqui está o que eu tenho no meu servidor:

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;
}

access_log /path/to/logs/nginx-access-$year-$month.log;

Agora, às vezes, $time_iso8601 não tem o formato esperado e, em seguida, os registros são gravados em um arquivo chamado nginx-access--.log (de fato, $year e $month não estão definidos).

Então, vou pensar em mudar as linhas para algo assim:

if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;

    access_log /path/to/logs/nginx-access-$year-$month.log;
}
else {
    access_log /path/to/logs/nginx-access-notime.log;
}

No entanto, como explicado por @cpburnz, você não poderá fazer isso nos logs de erros.

    
por 14.04.2016 / 15:22
1

O seguinte funciona para o log de acesso com nginx 1.13.x

Queríamos a configuração do nosso log de acesso no bloco 'http', 'if' não é permitido lá, então use 'map':

http {
    ...

    # Variable for access log filename date
    map $time_iso8601 $logdate {
        '~^(?<ymd>\d{4}-\d{2}-\d{2})'   $ymd;
        default                         'nodate';
    }

    log_format    acfmt    '$remote_addr "$request" "$query_string" "$http_referer" $request_time $status';
    access_log    'logs/access_${logdate}.log'    acfmt;

    ...
}

A rotação do log ocorre na primeira solicitação a cada dia. Ao contrário da documentação em outro lugar, um SIGUSR1 não parece ser necessário.

    
por 07.02.2018 / 15:48

Tags