PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Meldung 1x statt 100x anzeigen lassen


K21
17.04.2002, 08:20
Ich habe hier ein Perl Script und folgendes Problem:
Es wird ein Raidsystem abgefragt und wenn eine bestimmte errormessage von diesem Raidsystem erfolgt soll diese in eine Datei geschrieben werden in einer bestimmten Formatierung.
Dies klappt soweit auch wunderbar.
Nun ist jedoch das Problem dass einige Nachrichten bzw. einige Fehler nicht nur einmal kommen sondern manchmal sogar mehrere hundert Male.
Da diese Datei jedoch von einem Überwachungstool gecheckt wird und bei einer Fehlermeldung bestimmte Anzeigeelemente erscheinen wäre es unvorteilhaft wenn diese ein paar hundertmal erscheinen.
Hat jemand eine Idee / Ansatz wie ich eine Fehlermeldung nur einmal erscheinen lassen kann?
(Sie hat folgendes Format: &quot;datum datum meldung code&quot; <- Datum ist verschieden aber Meldung / Code ist gleich... es ist beabsichtigt dass Datum dabei nicht beachtet werden sollte!)

Gruß,
K21


sami
17.04.2002, 09:07
also es sollen nie 2 gleiche meldungen nacheinander kommen? auch nicht, wenn sie tage auseinander liegen?
dann würd ich die letzte zeile einlesen und prüfen, ob da die selbe meldung steht.
oder dann noch datum dazu nehmen und halt noch prüfen, ob die letzte meldung nicht älter als z.b. 1 stunde ist.

K21
17.04.2002, 09:21
nein es soll nicht 2mal die gleiche meldung kommen.... tage wird sie nicht auseinander liegen denn wenn eine meldung kommt handelt es sich um einen schwerwiegenden fehler der sofort behoben wird und sobald keine fehlermeldung mehr vorliegt wird die datei automatisch überschrieben.
günstig wäre natürlich wenn immer die aktuellste meldung von gleichen meldungen erscheinen würde.. dann würde der check ob z.B. <1h ebenfalls entfallen....
hat wer nen ansatz dafür? n paar befehls-hinweise...
bin noch nicht auf den grünen zweig bekommen beim überlegen.. also letzte zeile einlesen, vergleichen mit der zeile davor (könnte allerdings auch 2 zeilen vorher sein - denn wenn ne zweite fehlermeldung zwischendurch kommt dann kommt natürlich soetwas wie:
Zeile Fehler
1 A
2 A
3 B
4 A
zustande....

sami
17.04.2002, 09:42
ah, die datei wird beim beheben des fehler geleert, gut
ich denk mal, die errorcodes sind eindeutig?
dann kannst ja einfach die datei nach dem errorcode durchsuchen und wenn der schon vorhanden ist, löschst die zeile wo er drin ist und hängst die aktuelle ran.
leider kann ich kein perl, kann dir also kein code geben (aber gibt ja genügend befehlsreferenzen).
die regex zum durchsuchen könnt ich dir machen, muss aber zuerst wissen, in welcher form du die datei einliest (n array wo jedes element ne zeile ist oder die ganze datei als 1 string mit \n drin?)

K21
17.04.2002, 09:52
also das rausfiltern ist kein problem ;) muss es nur nochmal in eine Schleife schmeissen denn jeder fehler soll letztendlich unique sein und die datei mit eigenen errormessages beschreiben.. aber das ist eine andere sache die ich später mache :)
@array=grep(/failed|Err|corrupted|error|Insufficient|disabled|failure|FAILURE/,@array);
auf diese weise werden die einzelen errormessages halt rausgefiltert...
okay die idee mit dem durchsuchen nach dem errorcode ist natürlich nicht schlecht... dann zeile löschen und aktuelle ranhängen.. gute idee nur momentan hab ich nicht so die riesigen einfälle wie ich das realisieren könnte... gehirn mal mehr anstrengen und n paar referrenzen durchforsten ;) (oder vielleicht weiss ja doch wer was ? ;) )

K21
17.04.2002, 10:25
hmmm hab mir das nochmal 1-35 mal durch den kopf gehen lassen... wenn ich - was ich ja eh vorhabe - für jeden fehler einzelnd die errordatei schreiben lasse dann bräuchte ich ja einfach nur die letzte zeile aus dem jeweiligen array in die datei schreiben lassen an statt aller... das dürfte das problem beheben
verdammt warum ist mir das nicht vorher in den kopf gegangen... naja besser spät als nie und drüber reden hilf meistens ;)
thx anyway!

Jonas
17.04.2002, 10:49
Also mir würde folgendes einfallen:

open(ERROR, &quot;<error.log&quot;) || die &quot;Datei nicht gefunden&quot;;
my @errors = <ERROR>;
close(ERROR);

open(ERROR, &quot;>error.log&quot;) || die &quot;Konnte Datei nicht schreiben&quot;;
foreach(@errors) {
if($_ !=~ /$errorcode/) { print ERROR $_; }
}
print ERROR $datum . $errorcode . $errormessage;
close(ERROR);

Ach ja ob das mit dem !=~ funktioniert, keine Ahnung, musst du ausprobiern, ansonsten das print ERROR $_; in den else-Teil schrieben....
Aber ich denke, so könnte das klappen, oder? Die Datei wird einfach jedes mal neu geschrieben....

K21
17.04.2002, 11:21
hmm also
--
open(ERROR, &quot;<error.log&quot;);
my @errors = <ERROR>;
close(ERROR);
--
ist klar... er öffnet die datei error.log und schreibt den inhalt in ein array rein und schließt die datei wieder.
Jedoch beim nächsten Teil habe ich einige Verständnisprobleme scheint mir :(
ich versuche mal aufzuschlüsseln:
--
open(ERROR, &quot;>error.log&quot;);
--
ist klar...
--
foreach(@errors) {
--
Hier wird Zeilenweise entschieden ob
--
if($_ !=~ /$errorcode/) { print ERROR $_; }
}
--
überall wo $errorcode steht wird gleiches in die datei error geschrieben
--
print ERROR $datum . $errorcode . $errormessage;
--
aber
--
close(ERROR);
--
ist ebenfalls logisch ;)

ich hoffe du kannst mir meine unwissenheit etwas geringer machen :)
gruß

K21
17.04.2002, 15:30
okay so gut wie alle probleme sind nun beseitigt... auf jeden fall die hier genannten ;)
jetzt alles zu beschreiben wäre etwas umfangreich - wenn jemand interesse hat könnte ich ihm dateien zukommen lassen (aber war ja eh ein eher situationsspezifisches problem)
nun ja nichtsdestotrotz nocheinmal danke für die hilfeangaben! hat mich doch weitergebracht!

Jonas
17.04.2002, 22:31
ne ich meinte daß auf $errorcode der aktuelle fehler ist, und wenn der in einer zeile vorhanden ist, wird sie _nicht_ geschrieben

und ganz am anfang mit dem array, der liest die datei aus, in den array rein, und nachher schreibt er die datei komplett neu ;)