logrotate nicht drehen die Protokolle

24

Ich habe diese logrotate Konfiguration und ich laufe auf 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

}

Ich habe das gestern in /etc/logrotate.d abgelegt und heute wurde das Log nicht gedreht.

Unten sind die Dinge, die ich getan habe:

  1. Ich habe überprüft, ob sich das Protokoll in der Tat in /var/log/mysql/mysql-slow.log befindet
  2. mysqladmin-Zeilen funktionieren einwandfrei, wenn sie als root ausgeführt werden
  3. mysql kann in das mysql-slow.log schreiben

Als ich das tat:

$ 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. Wo ist das Protokoll, aus dem hervorgeht, dass Logrotate erfolgreich war? Ich möchte sehen, ob irgendetwas darauf hindeutet, dass ein Problem aufgetreten ist.
  2. Irgendwelche Ideen, warum das Logrotate nicht funktioniert?
Carmen
quelle
Funktioniert es also, wenn es von Hand ausgeführt wird? Ist crondläuft?
Kyle Smith
Ja, es funktioniert, wenn du logrotate -f mysql_slow_query meinst. Und Crond rennt.
Carmen
Sind Sie sicher, dass es noch keine andere Konfiguration gibt, die diese Protokolldatei verarbeiten soll? Vielleicht mysql-server? Rennen grep '/var/log/mysql' /etc/logrotate.d/*.
Zoredache
Ich habe diesen Befehl ausgeführt und nur meine Konfiguration zeigt etwas in / var / log / mysql
Carmen
Zu welcher Tageszeit werden die täglichen Cron-Jobs in Ihrem Ubuntu-Setup ausgeführt? Möglicherweise finden Sie diese Informationen in der /etc/crontabDatei in der Zeile, die mit endet /etc/cron.daily ). Vielleicht haben Sie die logrotate-Konfiguration erstellt, nachdem die Cron-Tagesjobs für diesen Tag bereits ausgeführt wurden?
Ricmarques

Antworten:

47

Ein häufiges Problem ist, dass beim erstmaligen Einrichten eines täglichen Eintrags für logrotate.d der erste Tag nicht gedreht wird. Wenn Sie eine zeitbasierte Rotation (täglich / wöchentlich / monatlich) verwenden, kritzelt logrotate einen Datumsstempel des letzten Datums, an dem die Datei in /var/lib/logrotate/status(oder /var/lib/logrotate.statusauf RHEL-Systemen) gesichtet wurde .

Das gekritzelte Datum wird zum Bezugsdatum der logrotatezukünftigen Serien, mit denen "tägliche" Umdrehungen verglichen werden. Da der Standard-Cron-Job täglich ausgeführt wird, ist dies in der Regel nur bei täglichen Jobs ein Problem.

Sie können dieses Problem auf zwei Arten vermeiden.

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

    • Dadurch wird das Datum in die Statusdatei geschrieben und die Protokolle gedreht

  2. Bearbeiten /var/lib/logrotate/statusund fügen Sie die Zeile manuell hinzu:

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

    • Setzen Sie es auf das heutige oder ein früheres Datum. Der nächste Lauf sollte dazu führen, dass er ausgeführt wird.
user168717
quelle
Funktioniert wie ein Champion!
Seth
6
Es tatsächlich tut drehen sich die Protokolle bei Verwendung von -f(zumindest auf meinem RH - Derivat).
Bufh
12
-fFür Force Rotation, -dfür Debug, impliziert Debug auch einen Testlauf, sodass im eingeschalteten Zustand keine Änderungen vorgenommen werden -d.
ThorSummoner
1
-dTrockenlauf zu implizieren, ist eine heikle Angelegenheit. Es wurden keine Änderungen vorgenommen und ich kratzte mir am Kopf, bis ich diese Tatsache bemerkte.
Artem
5

Laut folgendem Artikel von Slicehost:

Grundlegendes zu Logrotate unter Ubuntu - Teil 2
http://articles.slicehost.com/2010/6/30/understanding-logrotate-on-ubuntu-part-2

... in der /var/lib/logrotate/statusDatei " werden Informationen darüber gespeichert, wann die einzelnen Protokolldateien zuletzt gedreht wurden ". Die logrotate-Manpage besagt, dass es sich um eine " Statusdatei " handelt.

Hier in ServerFault gibt es eine weitere Diskussion, die ebenfalls nützlich sein kann:

Wie geht Logrotate genau mit "täglich" um?

In dieser Diskussion sagt "MadHatter" in Bezug auf die Datei "status" (state) Folgendes:

"Jede Datei hat eine Zeile. Dies ist das Datum, an dem sie zuletzt gedreht wurde. Wenn Sie an einem Datum logrotate ausführen, an dem eine bestimmte Datei gedreht werden muss, geben Sie die Anzahl der Tage zwischen dem aktuellen Datum und dem Datum in der Datei an ( 1 für täglich, 7 für wöchentlich usw.) wird die Datei gedreht. "

Ich hoffe das hilft.

Ricmarques
quelle
0

Wenn mysqladminein Benutzer oder ein Kennwort erforderlich ist, wird es nicht /root/.my.cnfohne Änderung aus der Konfiguration gelesen .

Versuchen Sie, Ihre Ausgabe an den Logger weiterzuleiten, um zu sehen, was gerade passiert.

  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

MySQL protokolliert nach dem Drehen keinen Fehler in einer neuen Datei?

KCD
quelle