[AWK] Logfile meldingen optellen per 5 minuten.

Pagina: 1
Acties:

  • mace
  • Registratie: Juni 2003
  • Laatst online: 01-12 16:53

mace

Sapere Aude

Topicstarter
Hallo,

Ik heb een applicatie die logfiles analyseert en daar mooie grafiekjes uit laat rollen.
Het is een firewalllog die ik verwerk met AWK, awk maakt SQL statements en die zet ik in een MySQL database. Hieronder een stukje logfile:

code:
1
2
Jun 13 04:20:15 somehost.nl deviceid: NetScreen device_id=deviceid  system-notification-00257(traffic): start_time="2004-06-13 05:20:14" duration=0
Jun 13 04:22:57 somehost.nl deviceid: NetScreen device_id=deviceid  system-notification-00257(traffic): start_time="2004-06-13 05:22:56" duration=0


Even de hostnames enzo verwijderd...

Ik gebruik dit stuk AWK om er info uit te filteren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$6~/NetScreen/ && $14~/proto=/ && $8 == "system-notification-00257(traffic):" { 
                sub(/action=Deny/,0,$19)
                sub(/action=Permit/,1,$19)
                Verzonden[substr($9,13)"@"substr($10,1,5)"@"$19]+=substr($20,6)
                Ontvangen[substr($9,13)"@"substr($10,1,5)"@"$19]+=substr($21,6)
                Connecties[substr($9,13)"@"substr($10,1,5)"@"$19]++
}
$6~/NetScreen/ && $15~/proto=/ && $8 == "system-notification-00257(traffic):" { 
                sub(/action=Deny/,0,$20)
                sub(/action=Permit/,1,$20)
                Verzonden[substr($9,13)"@"substr($10,1,5)"@"$20]+=substr($21,6)
                Ontvangen[substr($9,13)"@"substr($10,1,5)"@"$20]+=substr($22,6)
                Connecties[substr($9,13)"@"substr($10,1,5)"@"$20]++
}

END {
for ( sleutel in Connecties ) {
    split(sleutel,waarde,"@")
    print "INSERT INTO `packets` ( `datum` , `tijd`, `actie` , `sent` , `rcvd` , `connecties` ) VALUES ('"waarde[1]"','"waarde[2]"','"waarde[3]"','"Verzonden[sleutel]"','"Ontvangen[sleutel]"','"Connecties[sleutel]"');"


dmv substr worden de datum en de tijd in een array gezet, en nu ben ik al zover dat hij per minuut alles optelt. Het onderste stukje genereert netjes SQL en dat werkt allemaal feilloos.

Nu het volgende:

Per minuut is niet de bedoeling, ik wil per 5 minuten alles optellen, en eventueel per 15 minuten maar daar zit niet veel verschil tussen denk ik.

Ik moet dus al die meldingen optellen, ik dacht aan een for loopje, en dan die waardes in die array's stoppen, maar tot zover lukt het me niet. Het probleem is voornamelijk dat door deze constructie automatisch alles wordt opgeteld in de array, en ik wil dus wel de index zo houden als het kan.

  • Mafkees
  • Registratie: Oktober 2003
  • Niet online
Kun je met AWK niet gewoon alles in de database stoppen en dan vervolgens door middel van SQL statements informatie per 5 minuten opvragen? Dan mis je ook geen informatie lijkt me.

  • mace
  • Registratie: Juni 2003
  • Laatst online: 01-12 16:53

mace

Sapere Aude

Topicstarter
Mafkees schreef op woensdag 31 januari 2007 @ 16:56:
Kun je met AWK niet gewoon alles in de database stoppen en dan vervolgens door middel van SQL statements informatie per 5 minuten opvragen? Dan mis je ook geen informatie lijkt me.
Klopt, maar dan wordt de database te groot.

Ik heb inmiddels een oplossing:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function round_time( a_time ) {

     split(a_time, times, ":")
     hours=times[1]
     minutes=times[2]
     seconds=times[3]
     if ( HOURS_MODULO ) {
         hours -= hours % HOURS_MODULO
         minutes=seconds="00"
         if (hours<10)
            hours == "0" hours
     } else {
           hours=times[1]
         if ( MINUTES_MODULO ) { 
           minutes -= minutes % MINUTES_MODULO
           if (minutes<10)
               minutes == "0" minutes
           seconds="00"
         } else {
            minutes=times[2]
           if ( SECONDS_MODULO )
             seconds -= seconds % SECONDS_MODULO
           if (seconds<10)
               seconds == "0" seconds
         }
     }

     return hours ":" minutes ":" seconds


Modulo is dus instelbaar per uur, minuut of seconden, erg handig, met dank aan mijn vakdocent. :P

Gaat nog niet 100% goed, maar mysql zeurt er niet over dus ik ook niet ;)

[ Voor 4% gewijzigd door mace op 31-01-2007 17:32 ]