logrotate não girando os logs

24

Eu tenho essa configuração de logrotate e estou executando no Ubuntu 10.04.

/var/log/mysql/mysql-slow.log {
    daily
    rotate 3
    compress
    notifempty
    missingok
    create 660 mysql adm
    postrotate 
    if test -x /usr/bin/mysqladmin && \
       /usr/bin/mysqladmin  ping &>/dev/null
    then
       /usr/bin/mysqladmin  flush-logs
    fi
endscript

}

Coloquei isso em /etc/logrotate.d ontem e hoje o log não foi girado.

Abaixo estão as coisas que eu fiz:

  1. Eu verifiquei que o log está realmente em /var/log/mysql/mysql-slow.log
  2. Linhas mysqladmin funcionam bem quando executadas como root
  3. O mysql pode escrever no mysql-slow.log

Quando eu fiz isso:

$ logrotate -d -f mysql-slow

reading config file mysql-slow
reading config info for /var/log/mysql/mysql-slow.log 

Handling 1 logs

rotating pattern: /var/log/mysql/mysql-slow.log  forced from command line (3 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/mysql/mysql-slow.log

log needs rotating
rotating log /var/log/mysql/mysql-slow.log, log->rotateCount is 3
dateext suffix '-20120329'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/mysql/mysql-slow.log.3.gz to /var/log/mysql/mysql-slow.log.4.gz     (rotatecount 3, logstart 1, i 3), 
renaming /var/log/mysql/mysql-slow.log.2.gz to /var/log/mysql/mysql-slow.log.3.gz (rotatecount 3, logstart 1, i 2), 
renaming /var/log/mysql/mysql-slow.log.1.gz to /var/log/mysql/mysql-slow.log.2.gz (rotatecount 3, logstart 1, i 1), 
renaming /var/log/mysql/mysql-slow.log.0.gz to /var/log/mysql/mysql-slow.log.1.gz (rotatecount 3, logstart 1, i 0), 
renaming /var/log/mysql/mysql-slow.log to /var/log/mysql/mysql-slow.log.1
creating new /var/log/mysql/mysql-slow.log mode = 0660 uid = 20004 gid = 4
running postrotate script
running script (multiple) with arg /var/log/mysql/mysql-slow.log : " 
    if test -x /usr/bin/mysqladmin && \
       /usr/bin/mysqladmin &>/dev/null
    then
       /usr/bin/mysqladmin flush-logs
    fi
"
compressing log with: /bin/gzip
removing old log /var/log/mysql/mysql-slow.log.4.gz
  1. Onde está o log que mostra que o logrotate foi bem-sucedido? Quero ver se há algo que diria que houve um problema.
  2. Alguma idéia de por que o logrotate não está funcionando?
Carmen
fonte
Então funciona quando executado manualmente? Está crondcorrendo?
Kyle Smith
sim, funciona, se você quer dizer logrotate -f mysql_slow_query. E crond está correndo.
2829 Carmen
Você tem certeza de que não existe outra configuração que supostamente lide com esse arquivo de log? Talvez mysql-server? Corra grep '/var/log/mysql' /etc/logrotate.d/*.
Zoredache
Corri esse comando e só minha configuração aparecer como fazer algo em / var / log / mysql
Carmen
A que horas do dia os trabalhos diários do cron são executados na configuração do Ubuntu? Você pode encontrar essas informações no /etc/crontabarquivo, na linha que termina com /etc/cron.daily ). Talvez você tenha criado a configuração do logrotate após a execução das tarefas diárias do cron naquele dia?
Ricmarques

Respostas:

47

Um problema comum é que quando você configura uma entrada diária logrotate.d pela primeira vez, ela não gira no primeiro dia. Quando você usa um logrotate de rotação baseado em tempo (diário / semanal / mensal), rabisca um carimbo de data da última data em que viu o arquivo /var/lib/logrotate/status(ou /var/lib/logrotate.statusnos sistemas RHEL).

A data rabiscada se torna a data de referência a partir das quais as execuções futuras logrotateserão usadas para comparar as rotações 'diárias'. Como o trabalho cron padrão é executado diariamente, isso normalmente é apenas um problema nos trabalhos diários.

Você pode evitar esse problema de duas maneiras;

  1. corre sudo logrotate -f /etc/logrotate.d/<my rotate job>

    • Isso rabiscará a data no arquivo de status e girará os logs

  2. Edite /var/lib/logrotate/statuse adicione a linha manualmente:

    "/var/log/my_special.log" 2013-4-8

    • configurá-lo para hoje ou uma data anterior. A próxima execução deve fazer com que ela seja executada.
user168717
fonte
Funciona como um campeão!
Seth
6
Na verdade, faz girar os logs ao usar -f(pelo menos no meu derivado RH).
bufh
12
-ffor Force Rotation, -dfor Debug, a depuração também implica em execução a seco, portanto nenhuma alteração será feita enquanto -destiver ativada.
22416 ThorSummoner
1
-dimplicando corrida a seco é complicado. Nenhuma mudança estava sendo feita, e eu tinha coçado a cabeça até perceber esse fato.
Artem Russakovskii
5

De acordo com o seguinte artigo do Slicehost:

Entendendo o logrotate no Ubuntu - parte 2
http://articles.slicehost.com/2010/6/30/understanding-logrotate-on-ubuntu-part-2

... o /var/lib/logrotate/statusarquivo " armazena informações sobre quando ele girou pela última vez cada arquivo de log. ". A página de manual do logrotate diz que isso é chamado de "arquivo de estado".

Há outra discussão aqui no ServerFault que também pode ser útil:

Como o logrotate lida exatamente com "diariamente"?

Nessa discussão, "MadHatter" diz, sobre o seguinte, sobre o arquivo "status" (estado):

"Cada arquivo possui uma linha, que é a data em que foi girada pela última vez; se você executar a rotação do log em uma data em que um determinado arquivo deve ser rotacionado, dado o número de dias entre a data atual e a data no arquivo ( 1 para diário, 7 para semanal, etc.), o arquivo será girado. "

Eu espero que isso ajude.

ricmarques
fonte
0

Se mysqladminrequer um usuário ou senha, ele não será lido da /root/.my.cnfconfiguração sem modificação.

Tente canalizar sua saída para o registrador para ver o que está acontecendo.

  postrotate
      # just if mysqld is really running
      if test -x /usr/bin/mysqladmin && \
         /usr/bin/mysqladmin ping &>/dev/null
      then
         env HOME=/root/ /usr/bin/mysqladmin flush-logs 2>&1 | logger
      else
         logger "mysqladmin ping failed so not rotating mysql logs"
      fi
  endscript

O MySQL não registra erro no novo arquivo após a rotação?

KCD
fonte