webForumDet fria alternativet

logrotate med apache

3 svar · 631 visningar · startad av Qimen

QimenMedlem sedan juni 20013 568 inlägg
#1

Hej,

Har nu några olika access/error-loggfiler från apache (olika domäner) som jag sedan låter webalizer leka lite med vilket fungerar fint. Har lagt till att webalizer ska uppdatera statistiken varje timme med crontab.

/etc/crontab:

1 * * * * root /etc/cron.custom/cron.webalizer

/etc/cron.custom/cron.webalizer:

echo `date +%d-%m-%Y' '%H:%M` ":Webalizer run" >> /var/log/httpd/webalizer.log
/usr/local/bin/webalizer -c /usr/local/etc/webalizer/nicci.local.conf >> /var/log/httpd/webalizer.log
/usr/local/bin/webalizer -c /usr/local/etc/webalizer/richard.local.conf >> /var/log/httpd/webalizer.log
/usr/local/bin/webalizer -c /usr/local/etc/webalizer/zedd.local.conf >> /var/log/httpd/webalizer.log

Med det scriptet körs de domäner jag har samt lite information om körningen sparas i en egen logg. Config-filen för de olika domänerna ser ut såhär:

/usr/local/etc/webalizer/nicci.local.conf

LogFile /var/log/httpd/nicci.local-access.log
OutputDir /home/qimen/nicci.local/www/webalizer
HostName Nici.local
DNSCache /var/log/httpd/dns_cache.db
DNSChildren 5

Såhär lång fungerar allt som det ska, nu till själva problemet. Jag vill rotera alla loggfilerna varje dag och spara gårdagens log packad på ett ställe jag väljer. Eftersom jag kör freebsd installerade jag logrotate med ports och läste lite om det via google. Tydligen brukar det finnas ett exempel av hur man kan rotera apacheloggar men den finns inte med i min logrotate.d-mapp. :(

I vilket fall som helst så har jag kommit fram till att jag måste sätta Incremental och IncrementalName i config-filen för varje domän så att webalizer tar med all statistik och inte bara den nuvarande.

Incremental yes
IncrementalName /var/log/httpd/nicci.local.current

Men sedan tar det stopp, jag vet inte alls hur jag ska konfiguera logrotate. :l
Jag vill ha med all statistik som förts sedan domänen skapades. Sedan vet jag inte om jag ska rotera loggarna dagligen eller veckovis (om det är mycket trafik så behövs dagligen antar jag?).

/usr/local/etc/logrotate.conf

# Rotera varje vecka
weekly

# Spara loggarna 4 veckor tillbaka (men kommer all statistik med då?)
rotate 4

# Skapa nya tomma loggfiler när de gamla roteras.
create

# Komprimera loggfilerna, men hur/var?
compress

# Skicka fel till root
errors root

# Inkludera egna roteringscript
include /usr/local/etc/logrotate.d

# Loggfil för senaste rotering(?)
/var/log/lastlog {
    monthly
    rotate 1
}

Sedan vår fil som ska ta hand om apache-loggar:

/usr/local/etc/logrotate.d/apache

# Rotera loggfilerna för samtliga domäner.
/var/log/httpd/*-access.log {
    # Spara logg-filerna i 4 veckor.
    rotate 4

    # Rotera varje dag.
    daily

    # Skapa nya loggar när gamla har roterats.
    create

    # Är det denna bit som sparar mina komprimerade loggfiler på ett 
    # visst ställe? Hur gör jag i så fall så att loggfilerna sparas i 
    # varje enskild domäns loggmapp? (/home/användare/domän/logs/).
    # Kanske måste det göras med ett eget script?
    ifempty
    olddir /var/log/httpd/old
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}

/var/log/httpd/*-error.log {
    rotate 4
    daily
    create
    ifempty
    olddir /var/log/httpd/old
    postrotate
        /usr/bin/killall -HUP httpd
    endscript
}

Anledningen till att jag vill spara loggfilerna i användaren/domänen är för att jag vill att användaren ska kunna ladda ned loggfilerna en månad tillbaka via ftp.
Det var mer eller mindre så långt jag kommit på egen hand. Vet inte riktigt hur jag ska gå vidare nu. :)

QimenMedlem sedan juni 20013 568 inlägg
#2

Löste det hela med ett litet shellscript som jag kör med crontab. Hur effektivt detta är på en server med många konton vet jag inte men det verkar fungera fint till < 10 konton. :)
Det jag gör nu är att jag lägger till "användare/domän" i en fil när jag lägger till en ny domän i systemet. Webalizer körs sedan med "Incremental yes" i varje konfigurationsfil och mot backupfilen som skapas i scriptet (kopian av accessloggen innan rotering). Vid nästa körning av scriptet skrivs den filen över.

#!/bin/sh

# Halt the server
kill `cat /var/run/httpd.pid`

# User part
file=/usr/local/etc/webalizer/domains
row="";

while [ 1 ]
        do
                read row || break;

                # Where to save our old logs
                OLD_ACCESS_LOG=/home/$row/logs/access_log-`date +%Y%m%d`
                OLD_ERROR_LOG=/home/$row/logs/error_log-`date +%Y%m%d`

                # Copy webalizer file
                cp /var/log/httpd/users/$row-access.log /var/log/httpd/users/$row-access.log.backup

                # Move old files
                mv /var/log/httpd/users/$row-access.log `echo $OLD_ACCESS_LOG`
                mv /var/log/httpd/users/$row-error.log  `echo $OLD_ERROR_LOG`

                # Compress old files
                /usr/bin/gzip $OLD_ACCESS_LOG
                /usr/bin/gzip $OLD_ERROR_LOG

        done < $file;

# Restart web server
/usr/local/sbin/httpd

Den nackdel jag kan se nu är att man bara kan köra webalizer efter att loggfilerna roterats (blir ju ingen uppdatering annars). Får se om det går att lösa på något snyggt sätt. Visserligen har jag tänkt mig rotera loggfilerna varje dag och det räcker att webalizer uppdateras dagligen.

colioneMedlem sedan juni 20013 386 inlägg
#3

Du kke bör kasta ett öga i den här tråden också?

http://www.webforum.nu/showthread.php?t=50742

QimenMedlem sedan juni 20013 568 inlägg
#4

colione skrev:

Du kke bör kasta ett öga i den här tråden också?

http://www.webforum.nu/showthread.php?t=50742

Jupp, hämtade "lite" inspiration där. :)

Genererad på 367 ms · cache AV · v20260730165559-full.f96bc7eb