모든 Kubernetes 포드의 로그를 stdout으로 보내는 스크립트가 있습니다.
#!/usr/bin/env bash
set -e;
oc project cdt-dev
pods=$(oc get pods --show-all=false -o name)
for j in ${pods}; do
oc logs -f "$j" | bunyan -o short -l error &
done
wait;
내가 원하는 것은 다음과 같이 로그 앞에 포드 이름을 추가하는 것입니다.
#!/usr/bin/env bash
# ...
for j in ${pods}; do
oc logs -f "$j" | bunyan -o short -l error | echo "$j => $stdin" &
done
wait
제가 하려는 것이 무엇인지 아시리라 생각합니다. 로그를 해석하는 Bunyan이라는 프로그램을 통해 로그를 스트리밍하고 있으며, 그런 다음 각 줄 앞에 포드 이름($j)을 추가하고 싶습니다. 그러나 위의 진술은 정확할 수 없습니다. 평범한 오래된 bash로 이것을 할 수 있는 방법이 있나요?
$stdin은 stdin 행을 나타내는 더미 변수일 뿐이며 실제로 여기에는 존재하지 않습니다.
답변1
한 가지 옵션은 다음과 같습니다 awk
.
for j in ...; do
oc ... | bunyan --color ... | awk -v node="$j" '{print node " " $0}'
done
예제를 실행하세요:
$ for j in node1 node2 node3
> do
> echo stuff | awk -v node="$j" '{print node " " $0}'
> done
node1 stuff
node2 stuff
node3 stuff
또 다른 옵션은 다음과 같습니다 sed
.
for j in node1 node2 node3; do
j=${j////\\/}
j=${j//&/\\&}
oc ... | bunyan --color ... | sed "s/^/$j /"
done
sed가 명령의 내용을 구체적으로 해석하므로 슬래시나 &
in을 피하도록 주의합니다. 매개변수 확장 시 검색 및 교체를 수행하기 위해 bash-ism을 사용하고 있습니다. 두 개의 슬래시는 "일치하는 모든 항목 바꾸기"를 의미하고 이중 슬래시는 대체된 텍스트에 백슬래시를 생성한다는 의미입니다.j
s//
\\
답변2
이것은 나에게 효과적입니다.
oc logs -f "$j" | bunyan -o short -l error | while read line; do echo "$j $line"; done &
하지만 한 가지 문제는 많은 도움이 되는 터미널 스타일을 잃어버렸다는 것입니다. 제어 문자 등을 보존하는 방법을 아는 사람이 있습니까?