bash - 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
解决方案
请不要忘记提供部分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 名称,但如果您希望使用请求的分隔符,则可以使用两个注释大纲。
推荐阅读
- javascript - 将 PHP 数组发送到 JSON 时,我应该删除前导“0”吗?
- c++ - 对使用 boost::beast 实现的 http rest 客户端进行单元测试
- excel - Excel VBA 对帐
- asp.net - 错误 CS1061: '列表
' 不包含尝试使用 ModelView 时的定义 - java - 数据库准备好后创建java bean
- unity3d - 为什么这些类会序列化为“{}”的 json
- javascript - 将线条添加到关联数组 Bar
- java - XJC - 具有相同名称元素的 XSD - 已定义错误
- java - SpringMVC 跨服务器上传文件 Handler dispatch failed;嵌套异常是 java.lang.NoClassDefFoundError: javax/ws/rs/ext/Providers
- nginx - 无法将 Http 重定向到 Https nginx