日志分析想要一个正则

骑猪飙高速 发布于 2019/05/14 15:53
阅读 578
收藏 0

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

日志分析想要一个正则,自己写了一会效果达不到要求,特在这里找答案

[DEBUG][20190513 00:00:00,300][org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl:49][] 任意文本内容

正则 ()()()()()

最终分段结果
$1  DEBUG

$2  20190513 00:00:00

$3  x.x.x.x

$4 49

$5  任意文本内容

 

 

参考示例

# Default Tomcat catalina:
#    30-Oct-2017 10:04:44.671 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.15

[COMMON]
REGULAR=([\d\-a-zA-Z]+)\s([^ ]+)\s([A-Z]+)\s\[([^\]]+)\]\s([^ ]+)\s(.+)

#Date Time Format, now only support these formats:
#   yyyy-MM-dd HH🇲🇲ss.SSS
#   yyyy-MM-dd HH🇲🇲ss
#   HH🇲🇲ss.SSS
#   HH🇲🇲ss

TIME_FORMAT=HH🇲🇲ss.SSS

[REGMAP]
ITEM_TIME=$2
ITEM_LEVEL=$3
ITEM_PID=
ITEM_TID=$4
ITEM_MODULE=$5
ITEM_FUN=
ITEM_LOG=$6

以下是问题补充:

@骑猪飙高速:@沙枣 看图 https://snag.gy/mfERHZ.jpg (2019/05/15 18:16)
加载中
0
crifan
crifan

帮你写好了Python的正则的代码了:


# Version: 20190521
# Function: answer 
#           日志分析想要一个正则 - OSCHINA
#           https://www.oschina.net/question/251973_2306245
# Author: Crifan

import re

gInputLogStrList = [
  "[DEBUG][20190513 00:00:00,300][org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl:49][] 任意文本内容",
  # "[INFO][30-Oct-2017 10:04:44.671][org.apache.catalina.startup.VersionLoggerListener.log Server:51][] Apache Tomcat/8.5.15",
  "[INFO][20190521 16:15:21,528][org.apache.catalina.startup.VersionLoggerListener.log Server:51][] Apache Tomcat/8.5.15",
]

def extractLog():
  for eachLogStr in gInputLogStrList:
    print("eachLogStr=%s" % eachLogStr)

    # foundLog = re.search("\[(?P[A-Z]+)\]", eachLogStr)
    # foundLog = re.search("\[(?P[A-Z]+)\]\s*\[(?P[\w\s\-\.\,\:]+)\]", eachLogStr)
    # foundLog = re.search("\[(?P[A-Z]+)\]\s*\[(?P[^\[\]]+)\]", eachLogStr)
    # foundLog = re.search("\[(?P[A-Z]+)\]\[(?P[^\[\]]+)\]\[(?P[^:]+):(?P\d+)\]", eachLogStr)

    # Named Group = 带 命名组
    # foundLog = re.search("^\[(?P[A-Z]+)\]\[(?P[^\[\]]+)\]\[(?P[^:]+):(?P\d+)\]\[\]\s*(?P.+)$", eachLogStr)
    # 后记:如果确保时间格式是固定的:20190513 00:00:00,300,那么可以改为:
    foundLog = re.search("^\[(?P[A-Z]+)\]\[(?P\d+\s+\d+:\d+:\d+),\d+\]\[(?P[^:]+):(?P\d+)\]\[\]\s*(?P.+)$", eachLogStr)
    if foundLog:
      logLevel = foundLog.group("logLevel")
      logTime = foundLog.group("logTime")
      logModule = foundLog.group("logModule")
      logLineNum = foundLog.group("logLineNum")
      logContent = foundLog.group("logContent")
      print("logLevel=%s, logTime=%s, logModule=%s, logLineNum=%s, logContent=%s" % (logLevel, logTime, logModule, logLineNum, logContent))

    # No Named Group = 不带命名组
    foundLog = re.search("^\[([A-Z]+)\]\[(\d+\s+\d+:\d+:\d+),\d+\]\[([^:]+):(\d+)\]\[\]\s*(.+)$", eachLogStr)
    if foundLog:
      logLevel = foundLog.group(1)
      logTime = foundLog.group(2)
      logModule = foundLog.group(3)
      logLineNum = foundLog.group(4)
      logContent = foundLog.group(5)
      print("logLevel=%s, logTime=%s, logModule=%s, logLineNum=%s, logContent=%s" % (logLevel, logTime, logModule, logLineNum, logContent))

    # Final Result:
    # logLevel=DEBUG, logTime=20190513 00:00:00,300, logModule=org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl, logLineNum=49, logContent=任意文本内容
    # logLevel=INFO, logTime=30-Oct-2017 10:04:44.671, logModule=org.apache.catalina.startup.VersionLoggerListener.log Server, logLineNum=51, logContent=Apache Tomcat/8.5.15

    # logLevel=DEBUG, logTime=20190513 00:00:00, logModule=org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl, logLineNum=49, logContent=任意文本内容
    # logLevel=INFO, logTime=20190521 16:15:21, logModule=org.apache.catalina.startup.VersionLoggerListener.log Server, logLineNum=51, logContent=Apache Tomcat/8.5.15

if __name__ == "__main__":
    extractLog()

 

说明:

  • 根据你贴出的“参考示例”,代码中的logLineNum,估计对应的是ITEM_TID,但是你此处明显只是 行号
    • 是你自己搞错了,还是说明有误,需要你自己查证
  • 代码中 包含2套规则,你根据自己情况选择使用
    • 一个是命名的组
    • 一个是 不带命名的组
  • 如果想要把上述python的正则换成其他语言的正则,比如perl,php,java等,适当修改即可得到,我就不赘述了

 

crifan
crifan
回复 @IT小香猪 : 已更新。用 (\d+\s+\d+:\d+:\d+),\d+ 匹配: 20190513 00:00:00 但忽略: ,300
骑猪飙高速
骑猪飙高速
^\[([A-Z]+)\]\[([^\[\]]+)\]\[([^:]+):(\d+)\]\[\]\s*(.+)$ 正确的把我需要的数据分段了 , 唯一有点不足的就是时间 那个地方 20190513 00:00:00,300 要是在精确到 20190513 00:00:00 就非常完美
0
沙枣
沙枣

/\[([^\]]+)\]+/

/
  \[  # 左括号
  (   # 捕获结束
  [^ \]]+ # 不是右括号的所有字符
  )   # 捕获结束
  \]  # 右括号
/

 

骑猪飙高速
骑猪飙高速
你这个不对啊,最起码得有这2 ([\d\A-Za-z])[\d-:\.]
0
ArchitectureMaster
ArchitectureMaster

不知道怎么回事,楼上你写的这个完全不对呀,除了都叫正则之外,和人家问的问题没什么关系吧。

还有楼主的意图也不太清楚,楼主是要把:

[DEBUG][20190513 00:00:00,300][org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl:49][]

这一段内容中的日志类型,日期时间,所属架包,及输出内容抓出来?还是只是把类型为debug的内容抓出来?

你这个明显是tomcat输出日志吧,楼主是要单抓debug还是所有的日志分类抓取出来?

这个意图在下不是很明白,还请说明。

如果只是抓取debug的话,这里就需要使用零宽后向断言,即找出[debug]但不包含

如果需要整块抓取的话则无须断言。

那这时正则也可以这样写:

\[DEBUG\]\[\d{8}\s*\d{2}\:\d{2}\:\d{2},\d{3}\]\[[\w\.]+\:\d{1,5}\]\[[\w]*\]

这个正则也有几个地方要注意:

1.中间以点间隔的是jar包名,这里没有考虑jar名只能以_或字母开首的规定。

2.jar包后则是0-65536,我直接以0-99999为区间,这里需要你一点点的来写,用正则来写数学范围很麻烦。

3.日志内容没有考虑中文,只有a-z数字_这些ascii字符。

骑猪飙高速
骑猪飙高速
回复 @前端大师傅 : 感谢热心解答哈 最终 楼下 这个正则 解析出来了 我要的分段数据 ^\[([A-Z]+)\]\[([^\[\]]+)\]\[([^:]+):(\d+)\]\[\]\s*(.+)$
ArchitectureMaster
ArchitectureMaster
回复 @IT小香猪 : 这个很简单,把正则改一下就可以了: \[\[A-Z]+\]\[\d{8}\s*\d{2}\:\d{2}\:\d{2},\d{3}\]\[[\w\.]+\:\d{1,5}\]\[[\w]*\] 虽然我已经知道输出的日志类型就只有debug,error,info,fatal四种,但为了防止有其它谓语所以使用了A-Z全部大写字母。
骑猪飙高速
骑猪飙高速
需要把 日志类型,日期时间,所属架包,及输出内容抓
0
沙枣
沙枣

先按照方括号拆分数据,然后逐个处理,这样就会简单的多,想一下子解析出,就会分复杂。

0
带带派大星
带带派大星

你好,我想通过java去分析日志,和你上面的需求一样,你还有你当时做的那个demo吗?或者给点意见也行

骑猪飙高速
骑猪飙高速
不是自己写的,我用的第三方的工具,工具 https://github.com/fishjam/LogViewer 教程https://blog.csdn.net/fishjam/article/details/80861529
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部