[linux logrotate] custom filenames

Pagina: 1
Acties:

  • usr-local-dick
  • Registratie: September 2001
  • Niet online
Hoi Leden

Ik ben op zoek naar een manier om logfiles custom te renamen en te compressen.
Op een debian server met logrotate staat nu in /etc/logrotate.d/apache:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
/var/log/apache/*.log {
        monthly
        missingok
        rotate 48
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache reload > /dev/null
        endscript
}


En dus staat er na een tijdje dit in mijn logdir:

access.log
access.log.0
access.log.1.gz
access.log.2.gz
enz.

Dat wil je dus niet want de files worden allemaal gerenamed access.log.2.gz is dus een andere file bij de volgende logrotate actie :(
Wat je eigenlijk wilt is na een paar maanden zoiets:

access.log
access.log.July-2003.bz2
access.log.June-2003.bz2
access.log.May-2003.bz2
enz

Anyway ik had dus iets in elkaar geflanst wat er zo uit ziet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
/var/log/apache/error.log {
        daily
        missingok
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache reload > /dev/null
                bzip2 /var/log/apache/error.log.1
                mv /var/log/apache/error.log.1.bz2  /var/log/apache/error.`date +%d-%m-%Y-%T`.bz2

        endscript
}


Dit werkt perfect :)
MAAR!
Zoals je ziet moet je bij deze actie iedere logfile expliciet aangeven. Das dus niet fijn als je mad veel logfiles hebt :'(
Waar ik nu naar op zoek ben is een manier waarop je in het begin een wildcard opgeeft (a la het eerste script -> /var/log/apache/*.log), en dan vervolgens bij postrotate een soort foreach-achtig ding gebruikt om alle files uit de wildcard doorheen te halen....
Of moet ik in postrotate gewoon dan maar een shell scrippie zetten met foreach?
Dat kan natuurlijk ook.
Ohja met deze aanpak weet logrotate niet meer hoeveel hij er moet laten staan omdat je zelf de file renamed -> niet echt een probleem als je iedere paar maanden die files er vanaf haalt en op CD zet ofzo.
Vindt het nl. wel fijn als je die save hebt kun je later nog een keer iets terugzoeken...
Heeft niemand zich hier eerder aan gestoord trouwens volgens mij heb ik deze feature zelfs een keer gezien op een Win32 server ;)

  • imdos
  • Registratie: Maart 2000
  • Laatst online: 14:00

imdos

I use FreeNAS and Ubuntu

Zoals ik het nu zie doe je het eerst handmatig wijzigen; en omdat je zelf je log-files renamed (automatisch) kom je dus nooit verder dan *.log.1 en kan je dus constant hetzelfde postrotate mechanisme gebruiken!

pvoutput. Waarom makkelijk doen, als het ook moeilijk kan! Every solution has a new problem


  • usr-local-dick
  • Registratie: September 2001
  • Niet online
imdos schreef op 13 augustus 2003 @ 09:18:
Zoals ik het nu zie doe je het eerst handmatig wijzigen; en omdat je zelf je log-files renamed (automatisch) kom je dus nooit verder dan *.log.1 en kan je dus constant hetzelfde postrotate mechanisme gebruiken!
Ja dat realiseerde ik me ook. Maar de vraag was hoe dit te doen met wildcards/variable/$file etc etc....

  • usr-local-dick
  • Registratie: September 2001
  • Niet online
imdos schreef op 13 augustus 2003 @ 09:18:
Zoals ik het nu zie doe je het eerst handmatig wijzigen; en omdat je zelf je log-files renamed (automatisch) kom je dus nooit verder dan *.log.1 en kan je dus constant hetzelfde postrotate mechanisme gebruiken!
Indeed :)

Het volgende is niet echt elegant, maar *lijkt* goed te werken (heb het met daily gedaan, met montly is het zolang wachten ;))

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/var/log/apache/error.log {
        daily
        missingok
        sharedscripts
        postrotate
                        for i in $(ls /var/log/apache/*.log); do
                        b="$i.`date +%Y-%m-%d`"
                        mv "$i" "$b"
                        touch "$i"
                        /etc/init.d/apache reload > /dev/null
                        bzip2 "$b"
                        chown root:adm "$i"
                        chmod 640 "$i" ;
                        done;
        endscript
}


Wat niet elegant is: het script wordt gedraaid omdat /var/log/apache/error.log bestaat. Met die file doe ik verder niks, de for-lus kijkt naar alle logfiles.
Ook een apache restart na ieder logfile is een beetje duur.
Ik heb in ieder geval wel de rename en apache restart na elkaar gedaan, had eerst het compress stuk hiertussen staan, dat betekende dat als apache logt tijdens het compresses dat je bzip2 file corrupt wordt.
Anyway na deze job staat er in mijn logdir dus:
code:
1
2
3
4
access.log
access.log.2003-08-21.bz2
error.log
error.log.2003-08-21.bz2


Klaar :)