首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用模板引擎解析Java中的多行日志文件

使用模板引擎解析Java中的多行日志文件
EN

Stack Overflow用户
提问于 2016-04-13 00:02:37
回答 3查看 963关注 0票数 3

我想简化我的日志文件解析器,用模板引擎替换复杂的正则表达式。其思想是逆转模板引擎的过程,并给出模板描述和有效的结果文件作为输入。多行日志文件如下所示:

代码语言:javascript
复制
*** ID: X821 ***
- type: B5
- time-stamp: 20160202T01:11:01.2991

* Device: XKK-255141

它们都具有相同的结构,可以用伪模板语言描述:

代码语言:javascript
复制
*** ID: {{string}} ***
- type: {{string}}
- time-stamp: {{date}}

* Device: XKK-{{integer}}

是否有一个模板引擎可以解析日志文件、查找模板文件中的结构并返回HashMap/List/Object中的内容?

注意:我知道我可以用编写一个简单的DSL。但是这里的想法是简化解析,并接受只支持基本的多行日志文件而不支持递归。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-13 01:04:47

我不知道现有的模板引擎会这样做(它们通常反过来工作,用数据填充模板)。

为什么不用这样的方法:

代码语言:javascript
复制
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;
   }
 }

用法:

代码语言:javascript
复制
ReverseTemplateEngine rte = new ReverseTemplateEngine(
   "*** ID: $ ***",
   "- type: $",
   "- time-stamp: $",
   "* Device: XKK-$");

List<String> result = rte.parse(new BufferedReader(
     new FileReader("yourfile.txt")));
票数 1
EN

Stack Overflow用户

发布于 2016-04-15 18:45:08

一个“简单的”多线Regex怎么样?

代码语言:javascript
复制
String test = 
  "*** ID: X821 ***\n" + 
  "- type: B5\n" + 
  "- time-stamp: 20160202T01:11:01.2991";

java.util.regex.Pattern p = java.util.regex.Pattern.compile(
  "^\\*\\*\\* ID: (\\S+) \\*\\*\\*\\s+" + 
  "- type: (\\S+)\\s+" + 
  "- time-stamp: (\\S+)", 
  java.util.regex.Pattern.MULTILINE);

java.util.regex.Matcher m = p.matcher(test);
if(m.find()) {
    System.out.println("ID = " + m.group(1));
    System.out.println("type = " + m.group(2));
    System.out.println("time = " + m.group(3));
}

写起来有点乱,因为反斜杠和通配符逃跑了,但它确实有作用.(在这个逻辑的基础上,您可以轻松地编写一个字符串转换,如果您愿意,可以将模板匹配的字符串映射到regex )。

票数 1
EN

Stack Overflow用户

发布于 2016-04-13 00:44:07

他们有很多。

看看YAMLJSON。它们真的很容易使用。

唯一的问题是,您必须遵循每种模板语言的格式。

下面是用这些语言编写文件的方式。

YAML

代码语言:javascript
复制
-- YAML
ID : X821
type : B5
time-stamp : 2016-02-02 01:11:01.2991
Device :
 - XKK : 255141

JSON

代码语言:javascript
复制
{
    "__comment" : "JSON",
    "ID": "X821",
    "type": "B5",
    "time-stamp": 20160202T01:11:01.2991,
    "Device": {
        "XKK": 255141
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36586199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档