プログラムのログファイルを取得する方法を知りたいです。これは、クラッシュしたときにアプリケーションの障害を見つけるのに役立ちます。
つまり、ターミナルを介してアプリケーションを開き、同じでログファイルを書き込みます。
これを行う特別なコマンドはありますか、それともアプリケーションが実行されるたびに自動的に実行されますか?その場合、そのログファイルはどこに保存されますか?
すべてのアプリケーションがログを残すわけではなく、それらの背後にあるコーディングに依存します。複雑なアプリケーションであってもロギング機能がない場合があります。
アプリケーションにデバッグ、詳細、またはログ機能がある場合、そのオプションはそのアプリケーションの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
...
...
...
これにより、何が起こっているのか、なぜアプリケーションがコードで停止しないのかを把握できます。
あなたが望むのは、ターミナルでテキストを表示し、同時にファイルに書き込むことだけだと思います:
ls -l | tee -a ls.log
これにより、端末とls.log
にファイルがリストされます。 -a
は、ls.log
が存在する場合に上書きする代わりに追加するためのものです。
これは、less
やtop
などの端末アプリケーションでは機能しないことに注意してください。
「ログ」にテキストが欠落している場合は、リダイレクトエラーメッセージを標準出力に送信する必要があります。
ls filedoesnotexist_or_whatever_leads_to_an_error 2>&1 | tee -a ls.log