我想要监控 nginx access.log 中是否存在格式错误的请求,并在出现此类情况时通知自己。
为此我写了以下命令:
tail -n0 -f access.log | grep --line-buffered '\{' | xargs sentry-cly -m
但出于某些原因,此解决方案不起作用。如果我删除最后一个管道并仅以 grep 结尾 - 我将看到输出为日志文件获取新记录。
不明白为什么 xargs 没有执行,如果将 sentry-cli 替换为 cat 或者 echo 也是一样的。
你能解释一下我为什么会有这样的行为吗?
答案1
默认情况下,xargs
收集输入,直到它认为可以安全地传递给实用程序的一次调用(在本例中为sentry-cly -m
)。这意味着它会等到看到大量日志消息后才运行sentry-cly -m first message second message third message ... thousandth message ...
。为了避免这种情况,使用xargs -L1 sentry-cly -m
--告诉它对读取的每一行(即每条消息)-L1
运行。sentry-cly -m
(类似地,xargs -L2 sentry-cly -m
会等到它收到 2 条消息然后运行sentry-cly -m "firstmessage" "secondmessage"
,然后等待接下来的两条消息...您可以通过运行xargs -L2 echo
然后在其中输入行并观察何时回显什么来看到这一点。)
答案2
经过进一步调查后,我发现以下解决方案有效:
xargs -L 1
。