Logrotate pour nettoyer les fichiers datés

je suis en train d'essayer de trouver une méthode pour ranger les fichiers Oracle Recover qui sont créés par Cron...

actuellement, notre processus de récupération de secours Oracle est invoqué par Cron toutes les 15 minutes en utilisant la commande suivante:

0,15,30,45 * * * * /data/tier2/scripts/recover_standby.sh SID >> /data/tier2/scripts/logs/recover_standby_SID_`date +%d%m%y`.log 2>&1

crée des fichiers qui ressemblent à:

$ ls -l /data/tier2/scripts/logs/
total 0
-rw-r--r-- 1 oracle oinstall 0 Feb  1 23:45 recover_standby_SID_010213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  2 23:45 recover_standby_SID_020213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  3 23:45 recover_standby_SID_030213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  4 23:45 recover_standby_SID_040213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  5 23:45 recover_standby_SID_050213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  6 23:45 recover_standby_SID_060213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  7 23:45 recover_standby_SID_070213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  8 23:45 recover_standby_SID_080213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  9 23:45 recover_standby_SID_090213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 10 23:45 recover_standby_SID_100213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 11 23:45 recover_standby_SID_110213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 12 23:45 recover_standby_SID_120213.log

je veux essentiellement supprimer les fichiers qui datent de plus de x jours, pour lesquels je pensais que logrotate serait parfait...

j'ai configuré logrotate avec le fichier de configuration suivant:

/data/tier2/scripts/logs/recover_standby_*.log {
    daily
    dateext
    dateformat %d%m%Y
    maxage 7
    missingok
}

y a-t-il quelque chose que je manque pour obtenir le résultat souhaité?

je suppose que je pourrais supprimer la date du fichier journal de Crontab, puis faire tourner ce fichier par logrotate, cependant la date dans le fichier journal ne reflétera pas le jour où les journaux ont été générés... c'est-à-dire que les recouvrements sur 010313 seraient versés au dossier avec une date de 020313 en raison de la mise à feu de logrotate sur 020313 et de la rotation du dossier...

d'autres idées? Et merci à l'avance pour toutes les réponses.

Cordialement

Gavin

21
demandé sur fatmcgav 2013-02-13 20:55:05

6 réponses

Logrotate supprime les fichiers selon l'ordre dans la liste lexicalement triée des noms de fichiers journaux, et aussi selon l'âge du fichier (en utilisant le dernier temps de modification du fichier)

  • rotation est le nombre maximum de fichiers tournés, vous pouvez trouver. S'il y a un plus grand nombre de fichiers journaux tournés, leurs noms sont triés lexicalement et les plus petits sont supprimés.

  • maxage définit un autre critère pour retrait de rotation des fichiers journaux. Tout fichier journal tournant, étant plus ancien que le nombre donné de jours est supprimé. Notez que la date est détectée à partir de la dernière date de modification du fichier, et non à partir du nom du fichier.

  • dateformat permet le formatage spécifique pour la date dans les fichiers tournés. Man page note que le format doit permettre d'lexicalement correct tri.

  • dateyesterday permet d'utiliser les dates dans le journal les noms de fichiers un jour de retour.

pour conserver un nombre donné de jours dans des fichiers quotidiens (par exemple 7), vous devez définir rotate à la valeur de 7 et vous pouvez ignorer maxage, si vos fichiers sont créés et tournent vraiment tous les jours.

si la création d'un journal de bord n'a pas lieu avant quelques jours, a. G. pendant 14 jours, le nombre de fichiers journaux tournés sera le même (7).

maxage améliorera la situation dans les scénarios "journaux Non produits" en enlevant toujours trop vieux fichiers. Après 7 jours sans production de log, il n'y aura plus de fichiers journaux tournés.

Vous ne pouvez pas utiliser dateformat comme le montre OP, car il n'est pas lexiquement sortable. Gâcher avec dateformat aurait probablement pour résultat de supprimer d'autres fichiers journaux que vous vouliez vraiment.

Astuce: Lancez logrotate depuis la ligne de commande avec -d option pour effectuer un dry run: vous verrez ce que logrotate ferait mais ne fait rien. Puis effectuer un manuel exécuter à l'aide de -v (verbose) afin que vous puissiez confirmer que ce qui est fait est ce que vous voulez.

Solution: nettoyer les journaux créés par cron

Le concept est le suivant:

laisser cron créer et mettre à jour les fichiers journaux, mais faire de petites modifications pour créer des fichiers, en suivant les noms de fichiers standards de logrotate quand vous utilisezdateext

/data/tier2/scripts/logs/recover_standby_SID.log-`date +\%Y\%m\%d`.log

utilisez logrotate uniquement pour supprimer les fichiers journaux trop anciens

  • objectif au fichier journal existant /data/tier2/scripts/logs/recover_standby_SID.log
  • utiliser missingok pour logrotate de nettoyage pour arriver
  • set rotate assez haut, pour couvrir le nombre de fichiers journaux à conserver (au moins 7, s'il y aura un fichier journal "rotated" par jour, mais vous pouvez sans risque le placer très haut comme 9999)
  • set maxage à 7. Cela supprimera les fichiers dont le dernier délai de modification est supérieur à 7 jours.
  • dateext est utilisé juste pour s'assurer que, logrotate cherche des fichiers plus anciens ressemblant à tourné.

le fichier de configuration de Logrotate ressemblerait à:

data/tier2/scripts/logs/recover_standby_SID.log {
    daily
    missingok
    rotate 9999
    maxage 7
    dateext
}

Solution: tourner directement par logrotate une fois par jour

Je ne suis pas sûr, comment est le fichier de récupération de source en veille créé, mais je supposerai, Oracle ou un de vos scripts est régulièrement ou continuellement ajouté à un fichier /data/tier2/scripts/logs/recover_standby_SID.log

Le concept est le suivant:

  • tourner le fichier une fois par jour de logrotate
  • travailler directement avec le journal fichier contenant des données de récupération /data/tier2/scripts/logs/recover_standby_SID.log
  • daily provoquera une rotation une fois par jour (en termes de comment cron comprend daily)
  • rotate doit être réglé à 7 (ou supérieur).
  • maxage 7 (jours)
  • dateext pour utiliser la valeur par défaut logrotate date suffixe
  • dateyesterday utilisé pour causer des suffixes de date dans les fichiers tournés étant d'un jour en arrière.
  • missingok pour nettoyer les fichiers anciens même si aucun nouveau contenu n'est tourner est présent.

la configuration de Logrotate ressemblerait à:

data/tier2/scripts/logs/recover_standby_SID.log {
    daily
    missingok
    rotate 7
    maxage 7
    dateext
    dateyesterday
}

notez que vous pourriez avoir besoin de jouer un peu avec copytruncate et d'autres options similaires qui sont liées à la façon dont le fichier journal source est créé par un processus externe et comment il réagit à l'acte de rotation.

27
répondu Jan Vlcinsky 2015-06-04 21:33:33

Vous pouvez utiliser find commande de faire cette tâche facilement! Il va supprimer tous les 7 Days les anciens fichiers. Mettre dans crontab et exécuter tous les soirs de base:

$ cd /data/tier2/scripts/logs/    
$ /usr/bin/find . -mtime +7 -name "*.log" -print -delete

Ou Mieux

$ /usr/bin/find /data/tier2/scripts/logs/ -mtime +7 -name "*.log" -print -delete;
12
répondu Satish 2016-06-03 20:08:36

(Impossibilité de faire des commentaires comme pas assez de réputation)

j'ai eu un problème similaire. Par tous les comptes logrotate est inutile pour l'utilisation sur les noms de fichiers avec intégré datamps.

Si toutes choses égales par ailleurs je serais probablement aller avec find dans un travail de cron.

Pour mes propres raisons, je voulais l'utiliser logrotate et, finalement trouvé un moyen: https://stackoverflow.com/a/23108631

en substance, c'était une façon d'encapsuler le travail de cron dans un fichier logrotate. Peut-être pas la plus jolie ou la plus efficace, mais comme je l'ai dit, j'avais mes raisons.

3
répondu northern-bradley 2017-05-23 11:55:09

(mis à jour) Vos options sont les suivantes:

  • comme Satish a répondu, abandonnez logrotate et mettez un script de recherche dans cron
  • vous pouvez même, utiliser logrotate et mettre un script find dans la commande postrotate

au départ, j'ai pensé que changer la forme de la date pour qu'elle corresponde à vos logs pourrait marcher, mais comme Reid Nabinger l'a fait remarquer, le format de la date n'était pas compatible avec logrotate de toute façon. Récemment, j'ai essayé de configurer la même chose mais pour Java rotated logs que je voulait que logrotate supprime. J'ai essayé la configuration ci-dessous mais elle a essayé de supprimer toutes les logs

/opt/jboss/log/server.log.* {
    missingok
    rotate 0
    daily
    maxage 30
}

j'ai fini par mettre en œuvre ce que Satish a suggéré - une recherche simple avec le script rm dans cron.

3
répondu Lars Nordin 2018-08-22 05:12:40

comme @Jan Vlcinsky, vous pouvez laisser logrotate ajouter la date - il suffit d'utiliser dateyesterday pour obtenir la bonne date.

Ou, si vous voulez mettre dans la date vous-même, vous pouvez le " but " au nom sans la date , puis le nom, la date sera nettoyé.

cependant, ce que j'ai trouvé est que si je n'ai pas de fichier log là, logrotate ne fait pas le nettoyage des fichiers avec dates.

mais si vous êtes prêt à avoir un fichier journal vide, ensuite, il peut être fait au travail.

Par exemple, pour nettoyer /var/log/mylogfile.aaaammjj.journal après 7 jours, touch /var/log/mylogfile.log, puis configurer logrotate comme suit:

/var/log/mylogfile.log
{
        daily
        rotate 7
        maxage 7
        dateext
        dateformat .%Y%m%d
        extension .log
        ifempty
        create
}

cette entrée, combinée avec l'existence de mylogfile.log, déclenche logrotate pour nettoyer les vieux fichiers, comme s'ils avaient été créés par logrotate.

daily,rotate les plus maxage faire supprimer les vieux fichiers journaux après 7 jours (ou 7 vieux fichiers journaux, selon ce qui arrive premier.)

dateext,dateformat les plus extension fait correspondre logrotate à nos noms de fichiers.

Et ifempty les plus create assurez-vous qu'il y ait toujours un fichier vide, sinon la rotation du journal s'arrêterait.

une Autre astuce pour les tests, soyez prêt à modifier le fichier /var/lib/logrotate.le statut pour réinitialiser la date de 'dernière rotation' ou logrotate ne fera rien pour vous.

2
répondu Ben Aveling 2017-11-12 23:18:47

FYI je sais que c'est une vieille question, mais la raison pour laquelle ça ne fonctionne pas pour vous est parce que votre dateformat n'est pas lexiquement sortable. À partir de la page de manuel:

   dateformat format_string
          Specify the extension for dateext using the notation similar to strftime(3)  function.  Only
          %Y  %m  %d  and %s specifiers are allowed.  The default value is -%Y%m%d. Note that also the
          character separating log name from the extension is part of the dateformat string. The  sys-
          tem  clock must be set past Sep 9th 2001 for %s to work correctly.  Note that the datestamps
          generated by this format must be lexically sortable (i.e., first the year,  then  the  month
          then  the  day.  e.g.,  2001/12/01 is ok, but 01/12/2001 is not, since 01/11/2002 would sort
          lower while it is later).  This is because when using the rotate option, logrotate sorts all
          rotated filenames to find out which logfiles are older and should be removed.

la solution est soit de passer à un qui va Année-Mois-date, ou appeler un processus externe pour effectuer le nettoyage.

1
répondu Reid Nabinger 2015-04-29 18:41:34