在Java中解析以下日志条目的最佳方法是什么?

时间:2012-01-19 02:42:41

标签: java parsing logging

我正在处理将解析日志文件的任务。在Java中解析以下日志字符串的最佳方法是什么?

    EMPLOYER  :   NAME      : Company          ID : 23                   TYPE     : Academy
                 FOUNDED    : 2012-01-05 11:01:18.658                    CATEGORY : College
    EMPLOYEE  :   NAME      :  John                                      TIN      : 123456
                 GENDER     :  Male                                      STATUS   : Prob
    COMMENT   : Data sent to 192.168.0.1:8088
    USER DATA : Any string.

我特别关注关键字“雇主”和“员工”(我不需要)以及出现在“成立”和“评论”字段中的冒号(如果我将使用的话)冒号作为分隔符。)

谢谢!

1 个答案:

答案 0 :(得分:2)

没有任何最佳方法可以做到这一点。它显然是一种 ad hoc 格式,没有系统的元结构(例如与XML形成对比......)

你可以尝试正则表达式,但我担心它们会变得过于复杂。

您可以使用解析器生成器,但这可能超出了您当前的功能。 (否则你自己会有这个。)

相反,我建议使用Java的Scanner类来实现解析器。上下文敏感分隔符的问题可以通过更改分隔符正则表达式来解决,具体取决于您期望接下来的内容,或者使用Scanner.nextLine()来获取行的其余部分,而不考虑分隔符。


这类问题的一个问题是您没有明确定义的格式。相反,你刚刚向我们展示了一个简单的例子。此示例可能是典型,但它不处理边缘情况。 (您已经确定了其中至少一个。)这也提出了在不将“业务知识”嵌入解析器的情况下无法解析日志文件条目的可能性;例如日期将始终采用某种格式,或者公司名称永远不会包含冒号。如果你实际上并不知道这些规则是什么(例如因为它们没有在任何地方正确指定)那么你的解析器就会很脆弱。