複数のファイルをテーリングし、その出力をSSH接続にパイプする方法

複数のファイルをテーリングし、その出力をSSH接続にパイプする方法

私たちは現在、ほとんど制御できないLinuxボックスでコマンドを実行しています。このコマンドはログファイルを追跡し、結果をサーバーのアウトバウンドSSH接続にパイプし、出力をファイルにリダイレクトします。

これに使用するコマンドは次のとおりです。

sh -c tail -f /var/log/x/a.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

その後、キャプチャされたログセグメントに対して追加の処理を実行できます。

ただし、以下を使用して添付ログファイルのストリーミング出力を渡すことができるはずです。同じSSH接続。

行為

sh -c tail -f /var/log/x/a.log /var/log/x/b.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

うまくいきますが、2つのログファイルを1つにマージします(各行の前にはそのファイルのソースを表すヘッダーが続きます)。

2つの異なるファイルを出力する必要がありますが、ログサーバーからサーバーへの単一のアウトバウンドSSH接続にのみ適用されます。ログサーバーに対するsudoまたは管理者権限がなく、ログサーバーをインストールするために必要なソフトウェアを取得できません。重要な場合、リモートログサーバーはCentOSを実行しており、私たちのサーバーはUbuntuを実行しています。

出力を2つのファイルに分割する方法はありますか?それとも、逆SSH接続を介して複数のコマンドを並列に実行する別の方法はありますか?

答え1

little.control.serverPerlがインストールされている場合は、parallel --embed開発コンピュータで実行してGNU Parallelを使用できます。

parallel --lb --tag tail -f ::: /var/log/x/a.log /var/log/x/b.log |
       ssh [email protected] -T perl -e \''
        $|=1; # if you need less buffering
        open(A, ">", "a.log");open(B, ">", "b.log");
        while(<>) {
           if(s:/var/log/x/a.log\t::) { print A } 
           if(s:/var/log/x/b.log\t::) { print B }
        }'\'

また、ssh -M単一のSSHチャネルで複数のSSHを多重化することも検討してください。

答え2

独自のソリューション:

sh -c tail -f /var/log/x/a.log /var/log/x/b.log | ssh [email protected] -T 'cat - > /media/z/logs/a.log'

必要なすべてのログ情報を、ユーザーが制御する(Ubuntu)サーバーであるログサーバーに送信します。 (ファイルに書いてください。丸太実際には、次のようなファイルを書くので、少し混乱しているようです。a-and-b.log

したがって、考えられる解決策の1つは、生成された単一の結果を読み取るスクリプトを書くことです。a-and-b.logファイルとそのヘッダー行を作成し、2つの別々のログを作成します(ヘッダー行はなく、各ログ行がどのファイルに属しているかを確認するために使用します)。ログサーバーでこのスクリプトを実行すると、準備は完了です。

これが受け入れられる答えですか? SSH では「スマート」な操作は行いません。そうする必要はないようです。 tailは両方のログを見て、ヘッダーを使用して単一のSSH接続を介してすべてのログエントリをログサーバーに送信しました。どのログインですか?から。私の考えでは、ログサーバーから2つのファイルに分割することができます。

関連情報