【问题标题】:Writing a bash script to get a specific line from Stackdriver monitoring编写 bash 脚本以从 Stackdriver 监控中获取特定行
【发布时间】:2019-09-30 15:37:40
【问题描述】:

我正在尝试运行 bash 脚本以从 Stackdriver 日志中获取特定行,如果找到则应该退出,或者休眠 5 分钟,然后通过从 环境变量 然后应用它,如果在第二次尝试时没有找到,那么它应该会失败。

指定一个环境变量来获取当前时间戳,以便我可以传递到日志中。

CHIEF=$(date +%Y-%m-%dT%H:%M:%S.000Z)

我用来流式传输日志的命令是

gcloud 日志读取 "logName=projects/testing1/logs/syslog timestamp>=\"2019-09-25T10:55:56.992Z\" AND timestamp<=\"$CHIEF\""

假设我想提取日志“拒绝访问”,请问我该如何构造这个 bash 脚本?

谢谢

【问题讨论】:

  • 你不是getting current date from environment variable。您从系统时钟中获取它并将其分配给一个变量。您分配给它的变量没有被放入环境中。 (仅仅用全大写命名变量并不能使其成为环境变量。)
  • 您可能想要使用的一般模式是:cmd | if grep -q pattern; then ...; else ...; fi

标签: bash logging scripting environment-variables gcloud


【解决方案1】:

查看 Stackdriver Logging 文档,它很不错: https://cloud.google.com/logging/docs/view/overview

我建议您使用 Google Cloud Logging 查看器尝试查询: https://console.cloud.google.com/logs/viewer

将查询切换到高级模式。这将有助于产生您想要的过滤器。

您的过滤器不仅需要将日志限制为日志和时间戳,还需要限制为特定值Access Denied。我不清楚这将出现在您的系统日志中的什么位置,但日志查看器应该可以帮助您缩小范围。

然后您可以应用一种格式,无论是 gcloud 的内置 --format=... 还是更通用的 --format=json,然后将结果通过管道传输到例如jq.

这是解决问题的一种方法。我不保证这是最好的方法;-)

FILTER="logName=\"projects/testing1/logs/syslog\" "\
"jsonPayload.message:\"Access Denied\" "\
"timestamp>=\"2019-09-25T10:55:56.992Z\" "

for LOOP in first second;
do
  CHIEF=$(date +%Y-%m-%dT%H:%M:%S.000Z)
  MESSAGE=$(\
    gcloud logging read "${FILTER} AND timestamp<=\"$CHIEF\""" \
    --format="value(jsonPayload.message)")
  if [ "${MESSAGE}" == "Access Denied" ]; then
    echo ${MESSAGE}
    break
  fi
  sleep 5m;
done

**NB*

  • FOR loop in first second 很麻烦,但是可以用
  • 连接过滤器字符串时要注意,这会变得混乱。
  • 您应该(!?)能够使用CHIEF=$(date --rfc-3339=s)
  • 我使用jsonPayload.message:(包含|有)作为值
  • 我正在使用--format=value(...),但还有其他方法可以使用format
  • 这假定jsonPayload.message 只是Access Denied。这不太可能,你应该做一些正则表达式或子字符串检查

HTH!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2021-03-20
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多