Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use template engine to parse multi-line log file in Java

I'd like to simplify my log file parser and replace complex regular expressions with a templates engine. The idea is to reverse the process of a template engine and give as an input the template description and a valid result file. The multi-line log files look like:

*** ID: X821 ***
- type: B5
- time-stamp: 20160202T01:11:01.2991

* Device: XKK-255141

All of them have the same structure and can be described in a pseudo template language:

*** ID: {{string}} ***
- type: {{string}}
- time-stamp: {{date}}

* Device: XKK-{{integer}}

Is there a template engine which parses a log file, looks-up the structure in the template file and returns content in a HashMap/List/Object?

Note: I'm aware that I could write a simple DSL in ANTLR. But the idea here is to simplify the parsing and accept that only basic multi-line log files without recursions are supported.

like image 393
Sascha Vetter Avatar asked Mar 27 '26 00:03

Sascha Vetter


1 Answers

I am not aware of an existing template engine that does this (they usually work the other way around, filling templates with data).

Why not use something like this:

class ReverseTemplateEngine {
   ArrayList<String> prefixes = new ArrayList();
   ArrayList<String> suffixes = new ArrayList();

   public ReverseTemplateEngine(String... templates) {
     for (String s: templates) {
       int cut = s.indexOf("$");
       suffixes.add(s.substring(0, cut));
       prefixes.add(s.substring(cut + 1);
     }
   }

   public List<String> parse(BufferedReader r) {
     ArrayList<String> result = new ArrayList<>();
     while (true) {
       String line = reader.readLine();
       for (int i = 0; i < prefixes.length; i++) {
         if (line.startsWith(prefixes.get(i)) 
             && line.endsWith(suffixes.get(i)) {
           result.add(line.substring(prefixes.get(i).length(),
                      line.length() - suffixes.get(i).length()));
           break;
         }
       }
     }
     return list;
   }
 }

Usage:

ReverseTemplateEngine rte = new ReverseTemplateEngine(
   "*** ID: $ ***",
   "- type: $",
   "- time-stamp: $",
   "* Device: XKK-$");

List<String> result = rte.parse(new BufferedReader(
     new FileReader("yourfile.txt")));
like image 170
Stefan Haustein Avatar answered Mar 29 '26 13:03

Stefan Haustein



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!