petterg Skrevet 2. januar 2005 Del Skrevet 2. januar 2005 (endret) Setter meg alltid fast når jeg kommer til utrykk for bruk i sed. (Kan godt tenkes det finnes bedre ting å bruke enn sed.) Skal plukke info ut av en logfil. Dvs at fila stadig endrer seg, og referanser til linjenummer er derfor ikke å stole på - med mindre man tar en arbeidskopi. Prosessen jeg skal se på loggen fra logger flere ting mens den kjører. Den benytter av en eller annen merkelig grunn et eget loggingsystem - kan derfor ikke bruke filtreringsmulighetene i syslog. Når den starter skriver den inn f.x. Tue, 28 Dec 2004 21:08:11 CET:8980: +++ starting debugging for process 8980 by uid=0 og når den er ferdig skrives Tue, 28 Dec 2004 21:08:38 CET:8980: ------ Process 8980 finished. Total of 27.540371 secs I mellom start- og sluttlinjene logges diverse informasjon mens prosessen kjører. All info som logges ang prosessen starter med tidspunkt og prosess ID. Det jeg ønsker å hente ut av loggen er alle linjene som stammer fra samme prosess, og hvor minst en av linjene innholder en bestemt søkestreng. Ofte starter en ny instans av prosessen før den forige er ferdig, slik at sammenhørende linjer ikke står etter hverandre. Loggen kan f.x. se slik ut: Tue, 28 Dec 2004 21:08:11 CET:8980: +++ starting debugging for process 8980 by uid=0 Tue, 28 Dec 2004 21:08:11 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:11 CET:8980: (div. info) [b]søkestreng[/b] (div. info) Tue, 28 Dec 2004 21:08:11 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:18 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:18 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:19 CET:8998: +++ starting debugging for process 8998 by uid=0 Tue, 28 Dec 2004 21:08:19 CET:8998: (div. info) Tue, 28 Dec 2004 21:08:19 CET:8998: (div. info) Tue, 28 Dec 2004 21:08:19 CET:8998: (div. info) Tue, 28 Dec 2004 21:08:19 CET:8998: (div. info) Tue, 28 Dec 2004 21:08:19 CET:9007: +++ starting debugging for process 9007 by uid=0 Tue, 28 Dec 2004 21:08:19 CET:9007: (div. info) Tue, 28 Dec 2004 21:08:19 CET:8998: (div. info) Tue, 28 Dec 2004 21:08:20 CET:8998: ------ Process 8998 finished. Total of 1.137655 secs Tue, 28 Dec 2004 21:08:20 CET:9007: (div. info) [b]søkestreng[/b] (div. info) Tue, 28 Dec 2004 21:08:20 CET:9007: (div. info) Tue, 28 Dec 2004 21:08:28 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:38 CET:8980: ------ Process 8980 finished. Total of 27.540371 secs Tue, 28 Dec 2004 21:08:29 CET:9007: (div. info) Tue, 28 Dec 2004 21:08:29 CET:9007: (div. info) Tue, 28 Dec 2004 21:08:29 CET:9007: ------ Process 9007 finished. Total of 9.663025 secs Her innholder både prosess 8980 og 9007 søkestrengen. Ønsket resultat skal er da: Tue, 28 Dec 2004 21:08:11 CET:8980: +++ starting debugging for process 8980 by uid=0 Tue, 28 Dec 2004 21:08:11 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:11 CET:8980: (div. info) [b]søkestreng[/b] (div. info) Tue, 28 Dec 2004 21:08:11 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:18 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:18 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:28 CET:8980: (div. info) Tue, 28 Dec 2004 21:08:38 CET:8980: ------ Process 8980 finished. Total of 27.540371 secs Tue, 28 Dec 2004 21:08:19 CET:9007: +++ starting debugging for process 9007 by uid=0 Tue, 28 Dec 2004 21:08:19 CET:9007: (div. info) Tue, 28 Dec 2004 21:08:20 CET:9007: (div. info) [b]søkestreng[/b] (div. info) Tue, 28 Dec 2004 21:08:20 CET:9007: (div. info) Tue, 28 Dec 2004 21:08:29 CET:9007: (div. info) Tue, 28 Dec 2004 21:08:29 CET:9007: (div. info) Tue, 28 Dec 2004 21:08:29 CET:9007: ------ Process 9007 finished. Total of 9.663025 secs Spørsmålet: Hvordan får man til dette? Endret 27. mai 2005 av petterg Lenke til kommentar
Drømmemannen Skrevet 24. mai 2005 Del Skrevet 24. mai 2005 (endret) Edit: Fjernet, leste problemet ditt feil. Endret 24. mai 2005 av balletryne Lenke til kommentar
Drømmemannen Skrevet 25. mai 2005 Del Skrevet 25. mai 2005 (endret) Forslag i perl: #!/usr/bin/perl ($f = shift and $s = shift) or die "Usage: $0 logfile searchstring\n"; open FILE, $f or die "Unable to open file: $f\n"; for (<FILE>) { /CET:(\d*?):/; $p = $1; ${"l$p"}[${"i$p"}++] = $_; if (/CET:\d*?:.*$s.*/) { $r{"$p"} = 1; } } for (keys %r) { for (@{"l$_"}) { print; } } Edit: liten fiks på koden Edit2: Den er ikke helt patent, da, siden den tar med start- og stopplinjen i søket etter søkestrengen. Endret 25. mai 2005 av balletryne Lenke til kommentar
olajacob Skrevet 25. mai 2005 Del Skrevet 25. mai 2005 (endret) Forslag i sh script "pidsok": #!/bin/sh #Lagre unna alle pid-nummer til tmp fil grep $1 $2 | awk -F: '{print $4}' > /tmp/sok.$$ #Når du har pidnr, så grep på de... while read line do grep $line $2; done < /tmp/sok.$$ Bruken av scriptet, gitt at du har kalt scriptet for "pidsok" og at loggen du skal søke i heter filnavn.log: $ pidsok "sokestreng" filnavn.log Husk chmod 755 pidsok... Endret 25. mai 2005 av olajacob Lenke til kommentar
petterg Skrevet 27. mai 2005 Forfatter Del Skrevet 27. mai 2005 Oi, en post jeg har glemt å si fra at er løst. Ventet vel ikke svar etter nesten 5 mndr. Løsningen jeg brukte var veldig objekt orientert tenkning i et ikke-objektorientert bashscript. Hver linje leses inn hver for seg. Når det kommer en PID som ikke er i cache opprettes et array for denne PID'n i cache. Alle linjer med loggtidspunkt innenfor 10 min etter logtiden til start legges så til i arrayet for denne PID'n. Når den så har gått 10 min lenger frem i loggen (eller kommet til avslutningsstrengen blir hele innholdet av arrayet skrevet til en mysql database. Man kan så søke i databasen for å få ut ønsket info. Scriptet har kjørt som cronjobb hver time siden januar, og funker perfekt. Eneste problemet var ved skifte til sommertid.... jeg tenkte ikke på at tidssone får 4 tegn om sommeren (3 tegn om vinteren) og dermed feilet reg.expr for parsing av PIDnr. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå