web-dev-qa-db-ja.com

ターミナルから実行されるアプリケーションからログまたはエラー出力を取得するにはどうすればよいですか?

プログラムのログファイルを取得する方法を知りたいです。これは、クラッシュしたときにアプリケーションの障害を見つけるのに役立ちます。

つまり、ターミナルを介してアプリケーションを開き、同じでログファイルを書き込みます。

これを行う特別なコマンドはありますか、それともアプリケーションが実行されるたびに自動的に実行されますか?その場合、そのログファイルはどこに保存されますか?

3
user224082

すべてのアプリケーションがログを残すわけではなく、それらの背後にあるコーディングに依存します。複雑なアプリケーションであってもロギング機能がない場合があります。

アプリケーションにデバッグ、詳細、またはログ機能がある場合、そのオプションはそのアプリケーションのmanページで宣言されます。つまり、man sshを使用すると、ssh -vホストへのトンネルを開くと、コマンドがバックグラウンドで実行していることの詳細な出力が得られます、ssh -yは、stderrではなくsyslogに出力されます。

しかし、一部のアプリケーションはその機能でプログラムされていません。これらのstraceはすべてのアプリケーションのデバッグユーティリティとして使用できますが、すべてのシステムコールとシグナルをログに記録します。アプリケーションの実行中にクラッシュや予期しない障害が発生した場合、デバッグやログオプションがコードに組み込まれていないアプリケーション、つまりstrace ls出力:

execve("/usr/bin/ls", ["ls"], [/* 95 vars */]) = 0
brk(0)                                  = 0x20b6000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd7e5ca3000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=118369, ...}) = 0
mmap(NULL, 118369, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd7e5c86000
close(3)                                = 0
open("/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20l\0\0\0\0\0\0"..., 832) = 832
...
...
...

これにより、何が起こっているのか、なぜアプリケーションがコードで停止しないのかを把握できます。

4
Bruno Pereira

あなたが望むのは、ターミナルでテキストを表示し、同時にファイルに書き込むことだけだと思います:

ls -l | tee -a ls.log

これにより、端末とls.logにファイルがリストされます。 -aは、ls.logが存在する場合に上書きする代わりに追加するためのものです。

これは、lesstopなどの端末アプリケーションでは機能しないことに注意してください。

「ログ」にテキストが欠落している場合は、リダイレクトエラーメッセージを標準出力に送信する必要があります。

ls filedoesnotexist_or_whatever_leads_to_an_error 2>&1 | tee -a ls.log
3
not-a-user