5 votes

LogRotate utiliser regex pour le nom de fichier

J'ai une classe de journalisation personnalisée qui crée un journal pour chaque instance du processus et ajoute un identifiant unique au nom du fichier journal, par exemple :

  • processus.1234.log
  • process.1235.log

Je peux également ajouter un tampon date/heure, par exemple :

  • process.1234.03012012.log
  • process.1235.03012012.log

Est-ce que LogRotate a la possibilité d'utiliser une expression rationnelle afin que je puisse archiver mes fichiers journaux par date et/ou par identifiant de processus ?

5voto

Dranzd Points 1

Je ne sais pas si les versions ultérieures le font, mais après avoir fait des recherches supplémentaires, j'ai découvert que les caractères génériques Shell sont pris en charge. Les deux * (correspond à plusieurs caractères) et ? (correspondre à un seul caractère) peuvent être combinés pour correspondre à des fichiers spécifiques.

À titre d'exemple, voici des motifs qui correspondent à votre cas d'utilisation ainsi que le reste d'un fichier qui pourrait se trouver à l'adresse suivante /etc/logrotate.d/process

/path/to/my/logfiles/process.????.????????.log
/path/to/my/logfiles/process.????.log
{

    # Look for previously matched log files and rotate daily if found
    daily

    # use date as a suffix of the rotated file
    dateext

    # Compress log file, optional if the files are small enough
    compress

    # Allow for a log file pattern to NOT match in order to support both
    # filename formats
    missingok

    # Do not create replacement log files, the application will do that
    nocreate

    # Keep 30 days worth of rotated logs
    maxage 30
}

Cependant, si vous avez l'intention de process pour être un caractère de remplacement pour un identifiant de processus réel, alors je pense que vous pouvez vous en sortir en utilisant un caractère de remplacement à la place de l'identifiant de processus comme suit :

/path/to/my/logfiles/*.????.????????.log
/path/to/my/logfiles/*.????.log
{
    ...
}

J'espère que cela vous aidera. Moi aussi, j'ai cherché une approche regex qui fonctionnerait et j'ai finalement décidé d'utiliser les jokers Shell au lieu de ce qui me semblait être des solutions réalisables, mais plus complexes.

Un exemple :

En cherchant une solution regex, j'ai trouvé un article de blog intitulé " Exclusion des fichiers des correspondances globales de logrotate " qui a fourni cette solution :

/var/log/upstart/*.log {
    daily
    missingok
    rotate 7
    compress
    notifempty
    nocreate
    nosharedscripts
    prerotate
        bash -c "[[ ! $1 =~ testprogram ]]"
    endscript
}

J'ai fini par retirer deux éléments de cet exemple et j'ai légèrement modifié la correspondance. Dans ma situation, je voulais faire pivoter tous les fichiers d'un répertoire sauf pour certains fichiers d'entrée qui ont un .inp extension.

C'est ce que j'ai trouvé :

# Force the prerotate "script" below to be run on each individual file
# in order to verify that it isn't an unprocessed input file
nosharedscripts

# Skip rotating any unprocessed input files (*.inp extension)
prerotate
   bash -c "[[ ! $1 =~ \.inp$ ]]"
endscript

Selon logrotate -d /etc/logrotate.d/myfilename cela semble fonctionner. Cependant, comme je l'ai mentionné, j'ai opté pour l'approche des jokers Shell car elle semblait plus facile à maintenir pour quelqu'un qui viendrait derrière moi.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X