iex
でアプリを起動すると、アプリのログステートメントがコンソールに表示されます。iexで始まったかのように、ノードにremshしてI/Oをキャプチャするにはどうすればよいですか?
アプリをデタッチしてからremsh
を入力すると、同じ出力が表示されます。
iex
でアプリを起動すると、アプリのログステートメントがコンソールに表示されます。iexで始まったかのように、ノードにremshしてI/Oをキャプチャするにはどうすればよいですか?
アプリをデタッチしてからremsh
を入力すると、同じ出力が表示されます。
デフォルトでは、リモートシェルから実行するものは、グループリーダーがシェルのグループリーダーに設定されているため、I/Oは期待通りに機能します。
メインノードから開始されたプロセスの場合、そのグループリーダーはすでに設定されているため、I/Oはリモートシェルにリダイレクトされません。プロセスのグループリーダーをProcess.group_leader/2
と設定することができます。たとえば、Process.group_leader(pid, Process.group_leader())
となります。これは、グループリーダーをpid
に設定し、現在のプロセスのグループリーダーに設定します。 LoggerがLogger.configure_backend(:console, [device: Process.group_leader()])
でシェルにリダイレクトするように、:console
バックエンドを設定することもできます。その後、すべてのコンソールLogger出力をリモートシェルに転送する必要があります。
これには十分注意してください。多くの出力を生成するアプリケーションでこれを行うと、グループリーダーに過負荷がかかり、クラッシュする可能性があり、書き込みしようとするものが発生する可能性があります。リモートノード上にグループリーダーを割り当てる。私はこれを試しているとき、あるいは開発中にこれを行うことをお勧めします。プロダクションでは、とにかくログにファイルを書き込むべきでしょうし、ロガーのグループリーダーをリモートシェルに変更するよりも、SSH経由でこれらのログをパッシブにテールする方が安全です。特に、グループリーダーを変更せずにシェルをkillするバック;これにより、グループリーダーに書き込もうとするプロセスがクラッシュする原因となります。また、プロセスのグループリーダーを変更する前に保管しておくことを忘れないようにして、正しいプロセスに戻すようにする必要があります。
ああ、最後に私が思っていなかったいくつかの素晴らしいメモがあります。 –