繁体   English   中英

如何将日志文件的每一行拆分为SQL列? (也许使用正则表达式进行拆分)

[英]How can I split each line of a log file into SQL columns? (maybe using a regex for splitting)

我有一个日志文件,必须将其包括到QlikSense中。 QlikSense读取日志文件的每一行,因此我需要一个表达式以将该行​​拆分为所需的列。

日志文件如下所示(其大小约为250万个条目):

202.32.92.47 - - [01/Jun/1995:00:00:59 -0600] "GET /~scottp/publish.html" 200 271 - -
ix-or7-27.ix.netcom.com RFC-1413 - [01/Jun/1995:00:02:51 -0600] "GET /~ladd/ostriches.html" 200 205908 - "Mozilla/5.0 (X11; U; Linux i686; es-ES;rv:1.7.5)" 
ppp-4.pbmo.net - John Thomas [07/Dec/1995:13:20:28 -0600] "GET /dcs/courses/cai/html/introduction_lesson/index.html HTTP/1.0" 500 - "http://www.wikipedia.org/" "Mozilla/5.0 (X11; U; Linux i686; es-ES;rv:1.7.5)" 
ppp-4.pbmo.net - John Thomas [07/Dec/1995:13:20:37 -0600] "GET /dcs/courses/cai/html/index.html HTTP/1.0" 500 4528 - - 
lbm2.niddk.nih.gov RFC-1413 John Thomas [07/Dec/1995:13:21:03 -0600] "GET /~ladd/vet_libraries.html" 200 11337 "http://www.wikipedia.org/" - 

该日志文件每一行的结构是: IP ID NAME DATETIME TIMEZONE METHOD DIR STATUS MB WEB FROM 因此,我将使用||拆分先前的日志示例。 以获得更好的可视化效果:

|| ix-or7-27.ix.netcom.com || RFC-1413 || - || [01/Jun/1995:00:02:51 || -0600] "GET || /~ladd/ostriches.html" || 200 || 205908 || - || "Mozilla/5.0 (X11; U; Linux i686; es-ES;rv:1.7.5)" ||
|| ppp-4.pbmo.net || - || John Thomas || [07/Dec/1995:13:20:28 || -0600] || "GET || /dcs/courses/cai/html/introduction_lesson/index.html HTTP/1.0" || 500 || - || "http://www.wikipedia.org/" || "Mozilla/5.0 (X11; U; Linux i686; es-ES;rv:1.7.5)" ||
|| ppp-4.pbmo.net || - || John Thomas || [07/Dec/1995:13:20:37 || -0600] || "GET || /dcs/courses/cai/html/index.html HTTP/1.0" || 500 || 4528 || - || - ||
|| lbm2.niddk.nih.gov || RFC-1413 || John Thomas || [07/Dec/1995:13:21:03 || -0600] || "GET || /~ladd/vet_libraries.html" || 200 || 11337 || "http://www.wikipedia.org/" || - ||

因此,例如,对于第一行:

IP = ix-or7-27.ix.netcom.com 
ID = RFC-1413 
NAME = - 
DATETIME = 01/Jun/1995 00:02:51 
TIMEZONE = -0600 
METHOD = GET 
DIR: /~ladd/ostriches.html
STATUS = 200 
MB = 205908 
WEB = -
FROM = Mozilla/5.0 (X11; U; Linux i686; es-ES;rv:1.7.5)

因此,每个字段的值可以是text- 我尝试了很多方法来包含它,但是我没有实现。

我尝试使用空格分隔符分割每行,但是由于每行可以有不同数量的空格,因此无法使用。 也使用- ,...但是由于数据长度是可变的,所以我无法正常工作。

我坚信也许做一个RegEx(一种模式)也许可以解决我的问题,但是我没有关于模式的经验,我也不知道该怎么做。


编辑1:

如果我的问题的解决方案是使用正则表达式模式,则应执行以下操作:

  • 第一个参数:充分利用空间
  • 第二个参数:充分利用空间
  • 第三个参数:全部捕获到[
  • 第四个参数:全力以赴
  • 第五个参数:全部捕获到]
  • 第六个参数:全力以赴
  • 第七个参数:抓住一切
  • Eigth参数:最大限度地利用空间
  • 第九个参数:捕捉所有空间
  • 第十个参数:捕获所有“”或-
  • 第11个参数:捕获所有“”或-

知道我怎么能得到吗?

谢谢。

我曾经不得不解析多个36GB长度不等的日志文件(在空间上分割后)。 尝试过RegExp,它可以工作,但是这里有很大的不同。 您可能只需要执行line.split(" ").length然后检查计数,然后基于该逻辑即可。

    PrintWriter out=new PrintWriter("/directory/log.txt"),errorsOut=new PrintWriter("/directory/log-errors.txt");
    for(String line:lines){
      try{
        if(line.split(" ").length==11){
            String result=line[0]+"|"+line[1]+"|"+line[2]+"|"+line[3]replace("[", "").replaceFirst(":", " ")+"|"+...(etc)...
            out.println(line);
      }catch(Exception e) {
          errorsOut.println(line);
      }
        } else if(line.split(" ").length==14) { ... }
    }

可能不是最有效的,但是对于2.5MB而言,它不会死,它会捕获很多东西,如果有错误,您可以将它们写到一个单独的文件中,以便以后检查。

我也尝试过使用logstash和其他Enterprise日志查看器。 有些是好的,但大多数没有提供“全面”的解决方案。

受到这样的答案的启发,您可以尝试以下正则表达式,然后通过删除结尾的"[]字符对其进行清理。

(.*?)\s(?=(?:[^"]*"[^"]*")*[^"]*\Z)

如果您只想使用正则表达式解决方案,则可以尝试将其插入,以删除那些尾随的字符。 我建议使用https://regex101.com/

此正则表达式的PS组1包含您想要的所有数据。

只需使用SubField函数, https: //help.qlik.com/zh-CN/sense/November2018/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm

例:

加载

文本

,子字段(文本,“ ||”,1)为1_parameter

,subfield(text,'||',2)as 2_parameter

等等...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM