Forum: PC-Programmierung SCOM und Regexp


von Eric (Gast)


Lesenswert?

Folgender Sachverhalt: SCOM soll ueber seinen Linux Agent eine Logdatei 
ueberwachen. In dieser Logdatei tauchen bei Eingabe eines falschen 
API-Keys Eintraege nach folgendem Muster auf:

belanglosertext HTTP/1.1" 403 48 "-" "belanglosertext"

Im SCOM habe ich daraufhin zunaechst folgende Regexp angegeben:

HTTP\/[\d.]+.\s+(?:403)\s+(4[0-9])\s+

Welche auch wie vorhergesehen den wesentlichen Teil der Fehlermeldung 
erkennt, sofern man sie mittels einem der Zahlreichen Regex-Checker im 
Netz ueberprueft. (der wesentliche Teil lautet HTTP/1.1" 403 {eine 
zweistellige Zahl zwischen 40 und 49})
Auch die Eingabemaske von SCOM bietet eine Moeglichkeit der 
Ueberpruefung an, welche den angegebenen Ausdruck als gueltig erkennt.
Die Logdatei des Linux Agents unter /var/opt/microsoft/scx/log/scx.log 
gibt aber folgende Fehlermeldung aus und das Event wird ignoriert:

SCXLogFileProvider DoInvokeMethod - invalid regexp : 
HTTP\/[\d.]+.\s+(?:403)\s+(4[0-9])\s+

Nun habe ich ein wenig recherchiert und bin auf diese Seite hier 
gestossen:
https://blogs.technet.microsoft.com/systemcenterjp/2018/05/21/scom-linux-monitoring-regex/ 
(nur auf Japanisch)
Welche suggeriert, dass die Ueberpruefung in der Eingabemaske das .NET 
Regex verwendet, der Linux Agent wohl das POSIX BRE.

Wenn ich nun den oeben angegebenen Ausdruck nach POSIX BRE umforme, 
funktioniert es jedoch ebenfalls nicht.

HTTP\/[0-9.]{1,}.:blank:{1,}403:blank:{1,}(4[0-9]):blank:

(Die online Tools kommen damit allerdings auch klar)

Nun meine Frage: Gibt es bei SCOM sonst noch etwas zu beachten wie man 
eine Regexp definieren soll? Da ich selbst aus der Linux/Unix Ecke 
komme, kenne ich mich mit den MS Produkten nur bedingt aus und wuerde 
mich ueber Loesungsansaetze freuen.

von foobar (Gast)


Lesenswert?

> HTTP\/[\d.]+.\s+(?:403)\s+(4[0-9])\s+
>
> die Ueberpruefung in der Eingabemaske das .NET Regex verwendet,
> der Linux Agent wohl das POSIX BRE.

Das "(?:403)" lässt eher PCRE vermuten - ein simples "403" sollte das 
gleiche machen.

von Eric (Gast)


Lesenswert?

foobar schrieb:
> Das "(?:403)" lässt eher PCRE vermuten

Korrekt. Beim ersten Ausdruck handelt es sich tatsaechlich um PCRE.

Die ueberarbeitete Version wurde aufgrund eines Formatierungsfehlers 
dann im Beitrag nicht mehr korrekt dargestellt. Also hier nochmals:
1
HTTP\/[0-9.]{1,}.[[:blank:]]{1,}403[[:blank:]]{1,}(4[0-9])[[:blank:]]

von sid (Gast)


Lesenswert?

Mal ins Blaue...
1
HTTP\/[0-9.]\+.[[:blank:]]\+403[[:blank:]]\+(4[0-9])[[:blank:]]
oder
1
HTTP\/[0-9.]\{1,\}.[[:blank:]]\{1,\}403[[:blank:]]\{1,\}(4[0-9])[[:blank:]]

versuchen
wenn er keinen Fehler verursacht aber nicht "trifft", tausch mal 'blank' 
gegen 'space'

von Eric (Gast)


Lesenswert?

Unter SCOM konnte ich es noch nicht testen aber in der Bash funktioniert 
es nicht. Ich habe die Regexp noch mal ueberarbeitet und nun 
funktioniert sie jedenfalls in der Bash.
1
(HTTP[^"]*" (403)[[:space:]](4[0-9])[[:space:]])

von sid (Gast)


Lesenswert?

Das Problem das ich am häufigsten mit RegExp habe,
ist in der Tat das manches bis zum Exzess escaped werden muss
(in besonders blöden implementationen sogar doppelt)
generell ist "+" ein "1 oder mehr" Quantifizierer,
genau wie "{1,}" beides muss soweit Herr Internetz sagt
in SCOM escaped sein also als "\+" bzw als "\{1,\}"

in der Bash wäre beides falsch da darf es nicht escaped sein,
Dein Ergebniss ist also soweit korrekt bis hier :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.