Um die Teile vielseitig zu machen, verwenden wir manchmal reguläre Ausdrücke in Eigenschaftendateien.
Wenn Sie beispielsweise für jedes Element ein Protokoll der Form "time [thread name] error level class name --message" extrahieren möchten, können Sie wie folgt schreiben.
log.pattern=(.+?) \[(.+?)\](ERROR|INFO|DEBUG) (.*?) - (.*?)
String log = "22:22:50.324 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - Included patterns for restart : []";
String patternString = getProperty("log.pattern");
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(log);
if (matcher.matches()) {
String time = matcher.group(1);
String thread = matcher.group(2);
String level = matcher.group(3);
String className = matcher.group(4);
String message = matcher.group(5);
・ ・ ・
}
Auf den ersten Blick sieht es vielseitig aus, aber diese Technik hat große Schwächen. Das heißt, die Reihenfolge der Gruppen kann nicht geändert werden. Dies liegt daran, dass der Java-Code die Reihenfolge der Gruppen angibt, in der die Werte der Gruppen abgerufen werden sollen.
Beispielsweise wird der Code unterbrochen, sobald der Threadname und die Reihenfolge der Fehlerstufen wie unten gezeigt geändert werden. Ich wollte es allgemein machen.
22:22:50.324 DEBUG [main] org.springframework.boot.devtools.settings.DevToolsSettings - Included patterns for restart : []
Ab Java 1.7 ist "Named Forward Lookup-Gruppe für reguläre Ausdrücke" verfügbar.
Sie können eine Gruppe regulärer Ausdrücke benennen, indem Sie "(?
Wenden wir es auf den regulären Ausdruck an.
log.pattern=(?<time>.+?) \[(?<thread>.+?)\](?<level>ERROR|INFO|DEBUG) (?<className>.*?) - (?<message>.*?)
Um dies abzurufen, verwenden Sie "Matcher # group (String name)"
String time = matcher.group("time");
String thread = matcher.group("thread");
String level = matcher.group("level");
String className = matcher.group("className");
String message = matcher.group("message");
Da es nach Namen erfasst wird, kann es auch durch Ändern des regulären Ausdrucks behandelt werden, selbst wenn der Threadname und die Reihenfolge der Fehlerebenen geändert werden.
log.pattern=(?<time>.+?) (?<level>ERROR|INFO|DEBUG) \[(?<thread>.+?)\](?<className>.*?) - (?<message>.*?)
Es ist eine einfache, aber bequeme Funktion.
Recommended Posts