【问题标题】:Stacktrace aware grepStacktrace 感知 grep
【发布时间】:2014-01-22 13:30:04
【问题描述】:

是否有任何类似 grep 的 Unix/Linux 命令行工具可以理解由 log4j 或 logback 打印的日志文件中的 Java 堆栈跟踪?该工具应该了解堆栈跟踪由几行组成。

典型的用例是在查看存储到文件的日志时过滤掉某些异常和相应的堆栈跟踪。

【问题讨论】:

  • 既然你提到grep,你是在*nix平台上吗?
  • 使用sed 或类似实用程序应该可以实现您想要的,但您需要提供一些示例数据...
  • @devnull:我使用的是 Linux。
  • 如前所述,一些具有预期输出的示例数据可能会有所帮助。

标签: java logging grep stack-trace


【解决方案1】:

我正在使用以下 sed 单行程序:

sed -nr ':main; /^[0-9 :,-]{23} ERROR / { :loop; p; n; /^[0-9 :,-]{23} / b main; b loop}'

第一个[0-9 :,-]{23} 识别日志记录开始。在它之后,在斜线之前,您可以编写额外的正则表达式来限制要打印的记录。 {...} 中的表达式循环遍历以下行,直到找到新的记录头。

我的程序适用于日志记录开头的日志:

2015-08-25 12:49:34,906 ...

并打印所有在记录开始后出现错误的堆栈跟踪记录。示例:

2015-08-25 12:49:34,906 ERROR [http-8080-89] [Error@112] NullPointerException:
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
...

sed程序说明

sed程序表达式/regexp/ command表示:如果当前行匹配正则表达式运行命令。

sed 将读取输入行并运行程序。当该行匹配/^[0-9 :,-]{23} ERROR / 时,它运行命令块{...},如果不是,则程序结束后,sed 将不会将当前行打印到输出(选项-n),然后sed 读取下一行并再次运行程序。这会重复直到输入结束。

{...}解释:

  1. p - 打印当前行
  2. n - 阅读下一行
  3. /^[0-9 :,-]{23} / b main - 如果该行与正则表达式匹配,则在标签处继续 :main - 在当前行有效地重新运行整个程序而不读取下一行 - 不会错过下一个可能的异常
  4. 继续标签:loop

所以正则表达式:

  1. /^[0-9 :,-]{23} ERROR / 匹配开始日志记录的行
  2. /^[0-9 :,-]{23} / 匹配下一条日志记录的行

【讨论】:

  • 您能否详细说明一下这个命令对于我们这些不是 sed 专家的人是如何工作的?我理解“b”命令本质上意味着“转到”指定的标签。 “p”和“n”命令有什么作用?
  • 我用程序的解释更新了答案。然而,np 命令可以在 sed 文档中轻松找到。
  • 是否可以更新它以在 :main 循环的迭代之间发出分隔符?尝试添加 i 命令,但我的 sed 排骨不够强
【解决方案2】:

我不知道这是否回答了您的问题,但是当我想获取堆栈跟踪时,我使用grep -A 来获取我正在寻找的行之后的行。

例如: grep -A 200 "2014-09-08/12:11:36.110" catalina.out

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2011-11-12
    • 2021-03-11
    • 2015-02-18
    • 2015-08-14
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多