Я хочу знать, как получить файл журнала программы. Это полезно, чтобы найти ошибки в приложении, когда оно падает.
Я имею в виду открытие приложения через терминал и одновременно запись файла журнала.
Существуют ли специальные команды для этого или они выполняются автоматически при каждом запуске приложения? Если да, где хранится этот файл журнала?
Не все приложения оставят журнал, это зависит от кодировки, даже сложные могут не иметь возможности регистрации.
Если приложение имеет возможности отладки, подробного или журнального ввода, эта опция будет объявлена на странице man
этого приложения, то есть: man ssh
покажет вам, что если вы используете ssh -v
, вы получите подробный вывод о том, что команда делает в фоновом режиме при открытии туннеля для хоста, ssh -y
выведет в syslog вместо stderr.
Но некоторые приложения просто не запрограммированы с этой возможностью. Для тех, кто 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