すべての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
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を使用しています。 2つのスラッシュは「一致するすべての項目を置き換える」を意味し、二重スラッシュは置き換えられたテキストにバックスラッシュを生成することを意味します。j
s//
\\
答え2
これは私にとって効果的です。
oc logs -f "$j" | bunyan -o short -l error | while read line; do echo "$j $line"; done &
しかし、一つの問題は、多くの役に立つターミナルスタイルを失ったことです。制御文字などを保存する方法を知っている人はいますか?