Gå til innhold

Anbefalte innlegg

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 av petterg
Lenke til kommentar
  • 4 måneder senere...
Videoannonse
Annonse

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 av balletryne
Lenke til kommentar

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 av olajacob
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...