首页 > 解决方案 > Bash 脚本将日志从一个 pod 分离到另一个

问题描述

如何将日志从一个 pod 分离到另一个 pod?以下是我的工作:

CrashLoopBackOff=`for i in $(kubectl get po -n namespace | grep CrashLoopBackOff | awk '{print $1}'); do echo $i; done`
for y in $CrashLoopBackOff; do 
    k8s_logs=`kubectl logs $y -n namespace | tail -10` arr2+="$k8s_logs\n"
done

但是对于 2 个崩溃的 pod 或更多的 pod,输出都是一起的,我无法区分每个 pod 的日志。知道如何在每个 pod 日志之间放置回声或其他内容吗?

2021-03-12 07:30:11.622 [ERROR] [gstp_server_app.cc:4007] Failed to start subscription from SEL
2021-03-12 07:30:11.622 [ERROR] [gstp_server_app.cc:4010] Exception:    0 In order to do catch up, static entity: must have history enabled.

2021-03-12 07:30:11.622 [FATAL] [gstp_server_app.cc:1441] JMS Catchup initialization error.
2021-03-12 07:30:11.622 [FATAL] [gstp_server_app.cc:695] Failed to connect to JMS for data
2021-03-12 07:30:13.188 [INFO ] [jms_server.cc:495] End JMSServer.run
Ending JMSServer::Run
GSTP JMS Server Application Shutting down.
255
2021-03-12 07:31:51.828 [ERROR] [rcltocvll.cc:325] Zero Curve does not exist for DEPOT asof 02/06/12.
2021-03-12 07:31:51.831 [ERROR] [gbdopspec.cc:297] Error Creating Curve List Out Of Risk Class 
2021-03-12 07:31:51.831 [ERROR] [sectheo.cc:705] Error retrieving security curves.
2021-03-12 07:31:51.833 [ERROR] [sectheo.cc:999] Error computing theoretical price for Security 
2021-03-12 07:31:51.833 [ERROR] [rcltocvll.cc:325] Zero Curve does not exist for DEPOT asof 02/06/12.
2021-03-12 07:31:51.833 [ERROR] [gbdopspec.cc:297] Error Creating Curve List Out Of Risk Class List
2021-03-12 07:31:51.833 [ERROR] [sectheo.cc:705] Error retrieving security curves.
2021-03-12 07:31:51.833 [ERROR] [sectheo.cc:999] Error computing theoretical price for Security 
bash: line 1:     6 Killed                  gstp_server_jms -N -LOGGER INFO -CFG 

标签: bashshellkubernetes

解决方案


请不要忘记提供部分kubectl get po -n namespace输出,以供人们了解您正在处理的数据类型。

此外,反引号 ( `) 用于旧式命令替换,例如foo=`command` . 建议使用该foo=$(command)语法。内部的反斜杠处理$()不那么令人惊讶,并且$()更容易嵌套。见http://mywiki.wooledge.org/BashFAQ/082

另请参阅https://mywiki.wooledge.org/BashFAQ/001以了解如何读取输入行

您的其余代码甚至无法正常工作,因此这是基于我对您尝试实现的目标的假设的工作代码:

arr2=()
while read -r crashing_pod _; do
  while IFS= read -r line; do
    arr2+=("$crashing_pod: $line")
    # arr2+=("$line")
  done < <(kubectl logs "$crashing_pod" -n namespace | tail -10)
  # arr2+=('' "end of $crashing_pod 's logs" '')
done < <(kubectl get po -n namespace | grep CrashLoopBackOff)

printf %s\\n "${arr2[@]}"

您会看到我在每一行前面加上了 pod 名称,但如果您希望使用请求的分隔符,则可以使用两个注释大纲。


推荐阅读