Existe uma maneira fácil de inserir dados / hora na frente de um arquivo de log com apenas shell script?

2

Digamos que eu queira monitorar o uso de memória em um processo java durante a noite.

Eu posso fazer algo como

topo | grep java > out.log

Eu vou pegar um arquivo de log com um monte de linhas.

Existe uma maneira fácil de inserir um dado / hora na frente de cada linha?

    
por James Dean 03.11.2010 / 19:55

4 respostas

3

Não reinvente a roda. Escreva as mensagens para o syslog usando o logger (1) , que é suportado em praticamente todos os tipos de Unix. O Syslog cuidará dos timestamps para você. Seus dados de registro serão armazenados em um log do sistema como /var/log/messages (isso é configurável). Você não precisa se preocupar em limpar os arquivos de log mais tarde (especialmente se esse trabalho for executado para sempre), porque os logs do sistema são rotacionados automaticamente pelo logrotate / newsyslog.

top | grep java | logger -t java_cpuhog

Ou, se você realmente quiser escrever no seu próprio arquivo. Mas então você precisa limpar o arquivo depois:

top | grep java | logger -t java_cpuhog -f /var/log/java-top.log
    
por 05.11.2010 / 04:33
2
... | awk -f timetag.awk > ...

timetag.awk:

{
  print "[" strftime() "] " $0
}
    
por 03.11.2010 / 20:11
1

No shell: top | grep java | while read LINE ; do date "+%F %T ${LINE}" ; done

    
por 03.11.2010 / 21:22
0

Você pode criar algo como stamp contendo

#!/usr/bin/perl -p
s/^/localtime()." "/e;

Em seguida, execute

top -b | grep java | stamp > out.log

Não se esqueça de usar top -b se você não estiver usando interativamente. Claro, o top já coloca um timestamp cada vez que é executado. Se você não precisa necessariamente da data em cada linha, apenas use o top por si próprio, já que ele coloca um timestamp em cada iteração. Eu às vezes uso isso para obter 10 segundos amostras por um dia inteiro para revisar mais tarde:

top -b -d 10 -c -n 8640
    
por 03.11.2010 / 21:03