日志分析想要一个正则

发布于 2022-01-01 23:51:48 字数 722 浏览 758 评论 12

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

[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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

疾风者 2022-01-07 20:50:39

不是自己写的,我用的第三方的工具,工具 https://github.com/fishjam/LogViewer 教程https://blog.csdn.net/fishjam/article/details/80861529

秋意浓 2022-01-07 20:50:10

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

柳絮泡泡 2022-01-07 20:48:23

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

高跟鞋的旋律 2022-01-07 20:43:40

需要把 日志类型,日期时间,所属架包,及输出内容抓

左岸枫 2022-01-07 20:35:21

回复
@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全部大写字母。

居里长安 2022-01-07 20:10:53

回复
@前端大师傅 : 感谢热心解答哈 最终 楼下 这个正则 解析出来了 我要的分段数据 ^[([A-Z]+)][([^[]]+)][([^:]+):(d+)][]s*(.+)$

私藏温柔 2022-01-07 20:03:24

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

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

[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字符。

掩饰不了的爱 2022-01-07 19:16:13

你这个不对啊,最起码得有这2 ([dA-Za-z])[d-:.]

彼岸花ソ最美的依靠 2022-01-07 14:24:43

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

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

 

醉生梦死 2022-01-07 03:09:52

^[([A-Z]+)][([^[]]+)][([^:]+):(d+)][]s*(.+)$ 正确的把我需要的数据分段了 , 唯一有点不足的就是时间 那个地方 20190513 00:00:00,300 要是在精确到 20190513 00:00:00 就非常完美

悲喜皆因你 2022-01-05 18:39:53

回复
@IT小香猪 : 已更新。用 (d+s+d+:d+:d+),d+ 匹配: 20190513 00:00:00 但忽略: ,300

离不开的别离 2022-01-02 10:27:32

帮你写好了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[ws-.,:]+)]", eachLogStr)
    # foundLog = re.search("[(?P[A-Z]+)]s*[(?P[^[]]+)]", eachLogStr)
    # foundLog = re.search("[(?P[A-Z]+)][(?P[^[]]+)][(?P[^:]+):(?Pd+)]", eachLogStr)

    # Named Group = 带 命名组
    # foundLog = re.search("^[(?P[A-Z]+)][(?P[^[]]+)][(?P[^:]+):(?Pd+)][]s*(?P.+)$", eachLogStr)
    # 后记:如果确保时间格式是固定的:20190513 00:00:00,300,那么可以改为:
    foundLog = re.search("^[(?P[A-Z]+)][(?Pd+s+d+:d+:d+),d+][(?P[^:]+):(?Pd+)][]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等,适当修改即可得到,我就不赘述了

 

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文