2

我正在尝试找出如何使用 awk、sed 或其他工具过滤 heroku 日志排放。正如您在下面的示例中看到的那样,该命令过滤与唯一grep相关的行router。但我不知道如何过滤其余部分。

heroku logs -t | grep router | ???

2013-07-20T20:44:40.855998+00:00 heroku[路由器]: at=info method=GET path=/oauth2/callback?error=access_denied host=app.herokuapp.com fwd="123.234.456.78" dyno= web.5 连接=1ms 服务=55ms 状态=302 字节=5

2013-07-20T20:44:40.855998+00:00 heroku[路由器]: at=info method=GET path=/oauth2/callback/succesuser=%7B%22user%3Aexample%40example.com%22%2C%22force% 22%3Afalse%7D 主机=app.herokuapp.com fwd="123.234.456.78" dyno=web.5 连接=1ms 服务=312ms 状态=302 字节=5

问题 1)有一部分在日志行中提供了有关服务时间的详细信息:(service=55ms以及service=312ms从示例中)假设我只想查看服务时间超过 300 毫秒的部分。我怎样才能做到这一点?

可选问题)我有没有机会像这样格式化这些行逗号分隔:timestamp,path,service

可选问题的示例输出:

2013-07-20 20:44:40,/oauth2/callback?error=access_denied,55`

2013-07-20 20:44:40,/oauth2/callback/succesuser=%7B%22user%3Aexample%40example.com%22%2C%22force%22%3Afalse%7D,312`

4

2 回答 2

1

使用 awk。把它放在一个文件 awk0 中:

开始 {OFS = ","}

            {拆分($10,arr,"\="); 时间 = arr[2] + 0}

时间 > 300 {打印 $1, $5, time}

那么这应该工作:

heroku logs -t | grep router | awk -f awk0

祝你好运!

于 2013-07-31T11:03:55.787 回答
1

看看这个 sed 表达式是否有用:

sed '/[3-9][0-9][0-9][m][s]/!d'
sed '/[3-9][0-9][0-9][m][s]/!d

这是一个例子:

printf '301ms\n300ms\n302ms\n200ms\n40ms' | sed '/[3-9][0-9][0-9][m][s]/!d'

=> 301ms
=> 300ms
=> 302ms

要仅获取超过 300 毫秒的行请改用:

sed '/[3-9][0-9][1-9]/!d'  

另一个例子:

printf '301ms\n300ms\n302ms\n200ms\n40ms' | sed '/[3-9][0-9][1-9][m][s]/!d'

=> 301ms
=> 302ms

上面的原因——这个——/[3-9][0-9][1-9]/!d也过滤掉小于 300 的数字,是因为标志性的!东西——它告诉 sed 删除所有与模式不匹配的行[3-9][0-9][1-9][m][s]

于 2013-07-30T21:11:59.990 回答