执行命令从 Unix 服务器读取日志文件

时间:2021-03-01 14:30:42

标签: shell unix

我正在尝试读取日志文件以提取在特定时间生成的异常。 我已经执行了下面提到的命令来提取异常,但它会获取一半异常字符串,因为 ThreadPool.java:1593) 文本在该字符串中包含 2 次。

awk -v from='09/02/21 06:41:15:738' -v to='ThreadPool.java:1593)' '$0 ~ from ,$0 ~ to  {print $0}' mylog.log

示例日志文件。

  [09/02/21 06:41:15:738 IST] ERROR root - Error creating request
            org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
            org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
            at com.abc.tx.util.ThreadPool$Worker.run(ThreadPool.java:1593)      Caused by :             org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
            org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
            at com.abc.tx.util.ThreadPool$Worker.run(ThreadPool.java:1593)

从命令接收到的输出

[09/02/21 06:41:15:738 IST] ERROR root - Error creating request
            org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
            org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
            at com.abc.tx.util.ThreadPool$Worker.run(ThreadPool.java:1593)

给定的命令跳过日志下方

Caused by :             org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
            org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
            at com.abc.tx.util.ThreadPool$Worker.run(ThreadPool.java:1593)

需要帮助从日志文件中提取完整的轨迹。

提前致谢

1 个答案:

答案 0 :(得分:0)

我会尝试一些更通用的东西:

void Process<TKey>(TKey[] keys)
{
    var dict = new Dictionary<ValueTuple<TKey>, Something>();
    var firstKey = ValueTuple.Create(keys[0]);
    dict[firstKey] = new Something();
    ...
}

示例awk \ -v from='09/02/21 06:41:15:738' \ -v to='^( |(Caused by))' '$0 ~ from , $0 !~ from && $0 !~ to {print $0}' \ mylog.log \ | sed '$d'

mylog.log

GNU awk 输出:

AAA TEST AAA
BBB TEST BBB
[09/02/21 06:41:15:738 IST] ERROR root - Error creating request
            org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
            org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
            at com.abc.tx.util.ThreadPool$Worker.run(ThreadPool.java:1593)
Caused by :             org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
            org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
            javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
            at com.abc.tx.util.ThreadPool$Worker.run(ThreadPool.java:1593)
CCC TEST CCC
DDD TEST DDD

说明:

我们假设堆栈跟踪的所有连续行都以空格开头(如果需要,我们可以概括并使用 $ awk \ -v from='09/02/21 06:41:15:738' \ -v to='^( |(Caused by))' '$0 ~ from , $0 !~ from && $0 !~ to {print $0}' \ mylog.log \ | sed '$d' [09/02/21 06:41:15:738 IST] ERROR root - Error creating request org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at com.abc.tx.util.ThreadPool$Worker.run(ThreadPool.java:1593) Caused by : org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at com.abc.tx.util.ThreadPool$Worker.run(ThreadPool.java:1593) ),而不是寻找异常的特定结尾,因此我们设置 {{1} } 正则表达式的值,用于查找以短语 [:space:] 的空格开头的行。

然后我们告诉 awk 结束模式是 to,这意味着任何看起来不像我们的 Caused by 的东西,或者它以空格开头,或者它以 {{1} 开头}.

这也将导致 awk 打印与结束模式匹配的行,即我们想要的第一行,因此我们用 $0 !~ from && $0 !~ to 删除最后一行。