【问题标题】:Is there a way to catch rows with no response from a request log file?有没有办法从请求日志文件中捕获没有响应的行?
【发布时间】:2018-02-21 08:56:15
【问题描述】:

我在一台 linux 机器上,并且有一个包含此类条目的日志文件,

...

  • 20170823-164549.475 线程运行
  • 20170823-164550.482 线程运行
  • 20170823-164551.499 LOG_ENTRY_FOR_55897 RequestXML: /* 一些花哨 在此处请求 XML 文本 */
  • 20170823-164552.454 LOG_ENTRY_FOR_55897 ResponseXML /* 和一些花哨 在此处回复文本 */
  • /* 一些线程运行行 */
  • 20170823-165438.766 LOG_ENTRY_FOR_55898 RequestXML:/* 另一个花哨 在此处请求 XML 文本*/
  • 20170823-165439.150 LOG_ENTRY_FOR_55898 ResponseXML /* 另一个花哨 在此处响应 XML 文本 */
  • /* 更多线程运行行 */

但有时服务器死了,没有给我任何响应。

  • 20170824-185023.126 LOG_ENTRY_FOR_56823 RequestXML: /* SOME FANCY 在此处请求 56823 的 XML 文本,但没有响应*/
  • /* 一些线程运行行 */
  • 20170824-185026.421 LOG_ENTRY_FOR_56824 RequestXML: /* 尽你所能 看,这是 56824 的另一个请求,56823 没有响应*/

我必须得到那些没有响应的日志条目。到目前为止,我已经使用了 GREP 命令并创建了一个新的文本文件,其中的行包括“LOG_ENTRY”。 (我的意思是这个文本文件不包括 THREAD RUN 行,只有请求和响应行)。

例子:

  • -req a
  • -req b
  • -req c
  • -分辨率
  • -res c
  • -res b(你可以看到 res b 在 c 之后,因为 c 的响应更快,所以这个日志没有排序)
  • -req d
  • -req e(这里是,e没有响应,只有req)
  • -res d
  • -req f
  • -res f

预期输出:

  • -req e

有没有办法在没有响应的情况下跟踪这些请求?

【问题讨论】:

    标签: linux sorting ubuntu logging grep


    【解决方案1】:

    使用 awk。这期望请求在响应之前出现,但很容易修复:

    $ awk '$3=="RequestXML:"{a[$2]=$0} $3=="ResponseXML"{delete a[$2]} END{for(i in a)print a[i]}' file
    20170824-185023.126 LOG_ENTRY_FOR_56823 RequestXML: /* SOME FANCY REQUEST XML TEXT HERE FOR 56823 BUT THERE IS NO RESPONSE*/
    20170824-185026.421 LOG_ENTRY_FOR_56824 RequestXML: /* AS YOU CAN SEE, HERE IS ANOTHER REQEUST FOR 56824, NO RESPONSE FOR 56823*/
    

    解释:

    $ awk '
    $3=="RequestXML:" {  # request record
        a[$2]=$0         # hash record to a, index with LOG_ENTRY_FOR string
    } 
    $3=="ResponseXML" {  # response record
        delete a[$2]     # delete matching request from a
    } 
    END {                # in the end
        for(i in a)      # loop all remaining  requests
            print a[i]   # and output them
    }' file
    

    我用这个来测试:

    20170823-164549.475 THREAD RUN
    20170823-164550.482 THREAD RUN
    20170823-164551.499 LOG_ENTRY_FOR_55897 RequestXML: /* SOME FANCY REQUEST XML TEXT HERE */
    20170823-164552.454 LOG_ENTRY_FOR_55897 ResponseXML /* AND SOME FANCY RESPONSE TEXT HERE */
    /* SOME THREAD RUN ROWS */
    20170823-165438.766 LOG_ENTRY_FOR_55898 RequestXML: /* ANOTHER FANCY REQUEST XML TEXT HERE*/
    20170823-165439.150 LOG_ENTRY_FOR_55898 ResponseXML /* ANOTHER FANCY RESPONSE XML TEXT HERE */
    /* SOME MORE THREAD RUN ROWS */
    But sometimes the server is dead and sends me no response.
    20170824-185023.126 LOG_ENTRY_FOR_56823 RequestXML: /* SOME FANCY REQUEST XML TEXT HERE FOR 56823 BUT THERE IS NO RESPONSE*/
    /* SOME THREAD RUN ROWS */
    20170824-185026.421 LOG_ENTRY_FOR_56824 RequestXML: /* AS YOU CAN SEE, HERE IS ANOTHER REQEUST FOR 56824, NO RESPONSE FOR 56823*/
    

    编辑:为了修复文本'RequestXML:'和缩短的XML文本没有分开,那里没有空格我们停止精确比较$3=="..."而是使用正则表达式匹配$3~/^.../:

    $ awk '$3~/^RequestXML:/{a[$2]=$0} $3~/^ResponseXML/{delete a[$2]} END{for(i in a)print a[i]}' file
    

    【讨论】:

    • 这是给定文本的完美答案,但我有一个问题,文本 'RequestXML:' 和缩短的 XML 文本没有分开,那里没有空格,我的错。我认为 awk 得到了整个字符串(RequestXML:bla....),如果可以的话,我会尝试一些正则表达式。非常感谢,干得好。
    • 我想我在您快速回复之前已经编辑了上面的评论,但它似乎没有受到影响,所以我在这里添加一条新评论。我花了几秒钟使用 vim 将文件中的 'RequestXML:' 文本替换为 'RequestXML: '(末尾的空格),使其适合您的脚本并且您的脚本运行良好。我没有测试您编辑的答案(现在正在使用正则表达式),但我相信它也会完美运行。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-09-06
    • 2010-11-24
    相关资源
    最近更新 更多