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

标签 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.

我特别关心关键字“Employer”和“Employee”(我不需要)以及出现在“Founded”和“Comment”字段中的冒号(如果万一我会使用冒号作为分隔符)。

谢谢!

最佳答案

对于这样的事情没有任何最好的方法。它显然是一种临时格式,没有系统的元结构(例如与 XML 对比......)

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

您可以使用解析器生成器,但这可能超出您当前的能力。 (否则你自己就会想到这一点。)

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

<小时/>

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

关于java - 在 Java 中解析以下日志条目的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8920414/

相关文章:

java - 如何在循环外使用 for 循环内使用的变量?

java - 静态类与单例的模糊情况

sql - 未知函数 'length' 位于/usr/lib/perl5/site_perl/5.8.5/SQL/Statement.pm 第 88 行

c++ - C++ 解析器的当前技术水平?

java - SoundPool 使应用程序崩溃

java - 如何减少桌面应用程序中的 hibernate 内存使用?

java - 解释对多个 XML 文档应用多个 xpath 查询的规则

java - 仅当 JUnit 测试方法失败时,如何使用 SLF4J 记录 Java 中的语句?

android - 如何调试广播接收器?

linux - 如何禁用 systemd 日志记录到控制台?