Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 堆栈跟踪感知grep_Java_Logging_Grep_Stack Trace - Fatal编程技术网

Java 堆栈跟踪感知grep

Java 堆栈跟踪感知grep,java,logging,grep,stack-trace,Java,Logging,Grep,Stack Trace,是否有任何类似于grep的Unix/Linux命令行工具可以理解日志文件中由log4j或logback打印的Java堆栈跟踪?工具应该理解stacktrace由几行组成 典型的用例是在查看存储到文件中的日志时过滤掉某些异常和相应的堆栈跟踪。我不知道这是否回答了您的问题,但当我想要获取堆栈跟踪时,我使用grep-A来获取我要查找的行后面的行 例如: grep-A 200英寸2014-09-08/12:11:36.110英寸catalina.out 我正在使用以下sed单线程序: sed -nr

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


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

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

例如:

grep-A 200英寸2014-09-08/12:11:36.110英寸catalina.out

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

sed -nr ':main; /^[0-9 :,-]{23} ERROR / { :loop; p; n; /^[0-9 :,-]{23} / b main; b loop}'
第一个
[0-9:,-]{23}
识别日志记录开始。紧接着,在斜杠之前,您可以编写额外的regexp来限制要打印的记录。
{…}
中的表达式在以下行中循环,直到找到新的记录头

我的程序适用于日志记录以以下内容开头的日志:

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
表示:如果当前行与regexp run命令匹配

sed将读取输入行并运行程序。当该行与
/^[0-9:,-]{23}错误/
匹配时,它运行命令块
{…}
,如果自程序结束后没有,sed将不打印要输出的当前行(选项-n),然后sed读取下一行并再次运行程序。此操作将重复,直到输入结束

{…}
说明:

  • p
    -打印当前行
  • n
    -阅读下一行
  • /^[0-9:,-]{23}/b main
    -如果行与regexp匹配,则在标签处继续
    :main
    -有效地在当前行上重新运行整个程序,而不读取下一行-以避免错过下一个可能的异常
  • 继续标签
    :循环
  • 因此,regexp:

  • /^[0-9:,-]{23}错误/
    匹配启动日志记录的行
  • /^[0-9:,-]{23}/
    匹配下一个日志记录的行

  • 既然您提到了
    grep
    ,您是在*nix平台上吗?使用
    sed
    或类似的实用程序应该可以实现您想要的功能,但您需要提供一些示例数据…@devnull:我使用的是Linux。如前所述,一些具有预期输出的示例数据可能会有所帮助。请您详细说明一下,对于我们这些sed方面的非专家,这个命令是如何工作的?我理解“b”命令本质上是指“转到”指定的标签。“p”和“n”命令的作用是什么?我更新了答案,解释了程序。然而,在sed文档中可以很容易地找到
    n
    p
    命令。是否可以将其更新为在
    :main
    循环的迭代之间发出分隔符?尝试添加
    i
    命令,但我的sed印章不够牢固