Como obtenho um log ou uma saída de erro de qualquer aplicativo executado a partir do terminal?

3

Eu quero saber como obter um arquivo de log de um programa. Isso é útil para encontrar as falhas em um aplicativo quando ele falha.

Quero dizer, abrir o aplicativo através do terminal e ao mesmo tempo gravando um arquivo de log.

Existem comandos especiais para isso, ou é feito automaticamente sempre que um aplicativo é executado? Se sim, onde está esse arquivo de log armazenado?

    
por Braiam 14.11.2013 / 10:32

2 respostas

4

Nem todos os aplicativos deixam um log para trás, isso depende da codificação por trás deles, mesmo os mais complexos podem não ter recursos de registro.

Se um aplicativo tiver recursos de depuração, detalhados ou de log, essa opção será declarada na página man desse aplicativo, ou seja: man ssh mostrará que, se você usar ssh -v , obterá uma saída detalhada do que o comando está fazendo em segundo plano ao abrir um túnel para um host, ssh -y será enviado para o syslog em vez de stderr.

Mas alguns aplicativos simplesmente não são programados com essa capacidade. Para aqueles strace pode ser usado como um utilitário de depuração para qualquer aplicativo, ele registra todas as chamadas e sinais do sistema, eu acho que é útil quando eu tenho quaisquer falhas inesperadas durante a execução de um aplicativo, e na maioria das vezes isso me ajuda problemas de classificação com aplicativos que não possuem uma opção de depuração ou de registro incorporada ao código, ou seja, strace ls outputs:

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, "7ELF
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, "7ELF%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%l%pre%%pre%%pre%%pre%%pre%%pre%"..., 832) = 832
...
...
...
%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%>%pre%%pre%%pre%%pre%l%pre%%pre%%pre%%pre%%pre%%pre%"..., 832) = 832 ... ... ...

Isso permite que você tenha uma ideia do que está acontecendo e por que um aplicativo não consegue parar em seu código.

    
por Bruno Pereira 14.11.2013 / 11:10
3

Acho que tudo o que você quer é ver o texto no terminal e, ao mesmo tempo, gravá-lo em um arquivo:

ls -l | tee -a ls.log

Isto lista seus arquivos para o terminal e para ls.log . O -a é para anexar em vez de sobrescrever no caso de ls.log existir.

Observe que isso não funciona para aplicativos de terminal, como less ou top ou qualquer coisa que tenha menus e pergaminhos.

Se algum texto estiver faltando no "log", você deve redirecionar as mensagens de erro para a saída padrão:

ls filedoesnotexist_or_whatever_leads_to_an_error 2>&1 | tee -a ls.log
    
por not-a-user 14.11.2013 / 19:21