是否可以在没有正则表达式的情况下将日志字符串分成所需模式的变量?

时间:2017-08-02 08:44:37

标签: java parsing logging

我在询问是否可以将.log行与变量分开,就像构建.log文件一样。让我解释一下:

如上所示:https://httpd.apache.org/docs/2.4/logs.html

组合日志格式:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined

我必须使用Java:

示例行:

xxx.xxx.xxx.xxx - - [03/Jul/2017:09:05:56 +0000] "GET /index.php?route=journal2/assets/css&j2v=2.7.6 HTTP/1.1" xxx xxx "http://xxxxxxxx.xxx.xxx/index.php?route=product/search&search=asus" "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.90 Safari/537.36 Vivaldi/1.91.867.38"

我需要将此字符串分隔为

  • xxx.xxx.xxx.xxx
  • 短行程
  • 短行程
  • [03 / Jul / 2017:09:05:56 +0000]
  • " GET /index,php?route=journal2/assets/css&j2v=2.7.6 HTTP / 1.1"
  • XXX
  • XXX
  • " xxxxxxxx.xxx.xxx/index.php路线=产品/搜索和安培;搜索=华硕" " Mozilla / 5.0(X11; Fedora; Linux x86_64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 59.0.3071.90 Safari / 537.36 Vivaldi / 1.91.867.38"

知道了吗?如何在没有正则表达式的情况下制作它? 附:它会变成数百行,所以任何想法如何处理它们?

1 个答案:

答案 0 :(得分:0)

字符串类具有indexOf()等方法,您可以使用手动"搜索"特定"分隔符的字符串"。然后使用像substring()这样的方法来获取子串。

换句话说:绝对有可能编写自己非常具体的解析代码,从字符串中提取值。

但这意味着要重新发明现有的车轮;知道你的尝试将耗费大量时间,并且结果很可能是不完整的,并且在您没有预料到的第一个日志行中中断。

当我提出你的问题时,你希望能够提供一个"格式"例如:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""然后以某种方式用于剖析日志行。抱歉 - 这是完全您使用正则表达式的内容。再说一遍:你的方法归结为发明和实现你自己的正则表达式语言和引擎。当然这是可能的,但浪费时间。

除此之外,请将此任务视为非常先进。这是 nothing 一个新手可以想到在合理的时间内做的事情。相反:花费精力学习应用现有的,久经考验,经过良好测试的技术。在这种情况下,这是要走的路(也是从业务的角度来看 - 其他任何东西也是浪费)。

并假设这是为了学习目的而且#34; - 然后第一段告诉你从哪里开始。但除此之外:

  • 您必须先定义自己的"模式语言"
  • 然后你必须为这种格式实现解析器
  • 然后你必须实现一个引擎,它将解析后的格式作为输入并将它们匹配到输入字符串

如上所述:可能,但艰难工作的