Pregunta ¿Cómo agregar una marca de tiempo para bash script log?


Tengo una secuencia de comandos en ejecución constante que imprimo en un archivo de registro:

script.sh >> /var/log/logfile

Me gustaría agregar una marca de tiempo antes de cada línea que se adjunta al registro. Me gusta:

Sat Sep 10 21:33:06 UTC 2011 The server has booted up.  Hmmph.

¿Hay algún jujitsu que pueda usar?


77
2017-09-10 21:35


origen


Ver esta questin serverfault.com/questions/80749/…. Una respuesta de pareja se aplicaría aquí. - Zoredache
Para una solución awk / gawk ver: stackoverflow.com/questions/21564/… - User


Respuestas:


Puede canalizar la salida del script a través de un bucle que prefija la fecha y hora actuales:

./script.sh | while IFS= read -r line; do echo "$(date) $line"; done >>/var/log/logfile

Si vas a usar esto mucho, es fácil hacer una función de bash para manejar el bucle:

adddate() {
    while IFS= read -r line; do
        echo "$(date) $line"
    done
}

./thisscript.sh | adddate >>/var/log/logfile
./thatscript.sh | adddate >>/var/log/logfile
./theotherscript.sh | adddate >>/var/log/logfile

78
2017-09-10 21:58



@Nils es un truco para prevenir read De recorte de espacios en blanco al principio y de la línea. Establece IFS (Separador de campo interno de bash, básicamente una lista de caracteres de espacio en blanco) en vacío para el read mando. - Gordon Davisson
... y -r ignora el carácter de escape "\". Esto debería funcionar realmente en todos los casos, un gran pice de scripting. - Nils
@Nils no es completamente a prueba de balas, ya que algunas implementaciones de echo interpretar secuencias de escape. Si tu De Verdad desea que no se meta con el contenido (aparte de agregar fechas), reemplaza el echo comando con printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
Usted podría estar interesado en una Cumple con la norma ISO-8601 fecha / marca de tiempo date -u +"%Y-%m-%dT%H:%M:%SZ" o tal vez más bonita date +"%Y-%m-%d %T". - Pablo Bianchi
mientras que este script funciona como se espera, genera un nuevo proceso (ejecute date) para cada línea de registro, que puede ser un inconveniente enorme dependiendo de su máquina y la cantidad de registros. Prefiero sugerir usar ts Si está disponible, vea la respuesta de @willem - Michael Schaefers


Ver "ts" de Ubuntu "moreutils" pkg:

command | ts

O, si $ command realiza un búfer automático (requiere expect-dev pkg):

unbuffer command | ts

41
2017-10-29 15:20





Usted puede simplemente eco el comando da salida al archivo de registro. es decir,

echo "`date -u` `./script.sh`" >> /var/log/logfile

Realmente funciona :)

Ejemplo:

[sparx@E1]$ ./script.sh 
Hello Worldy
[sparx@E1]$ echo "`date -u` `./script.sh`" >> logfile.txt
[sparx@E1]$ cat logfile.txt 
Mon Sep 12 20:18:28 UTC 2011 Hello Worldy
[sparx@E1]$ 

11
2017-09-10 22:03



Hmm no está funcionando para mí. - Antonius Bloch
¿Qué obtienes cuando ejecutas el comando? - SparX
Eso coloca una marca de tiempo antes de toda la salida de '' ./script.sh '', no antes de cada línea. - clacke


los fecha comando proporcionará esa información

date -u
Sat Sep 10 22:39:24 UTC 2011

así que puedes

echo $(date -u) "Some message or other"

Es eso lo que querías ?


10
2018-02-03 17:23



El uso del comando date fue algo así como lo que tenía en mente, pero realmente no puedo agregarlo al script, así que lo que busco es una forma de cambiar esta línea: "script.sh >> / var / log / logfile "para anexar la fecha. - Antonius Bloch
En ese caso, redirija la salida de su secuencia de comandos a una canalización con nombre y haga que un daemon escuche la salida que toma la salida de la secuencia de comandos y agrega una fecha antes de escribirla en un archivo de registro. Probablemente puedas modificar el guión que escribí aqui para hacer esto Lo haría porque me interesa, pero es tarde en el Reino Unido y mañana tengo un comienzo temprano. - Iain


Hacer una config.sh expediente

#!/usr/bin/env bash
LOGFILE="/path/to/log.log"
TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`

Cuando necesites enviar para usar el archivo de registro

#!/usr/bin/env bash
source /path/to/config.sh

echo "$TIMESTAMP Say what you are doing" >> $LOGFILE

do_what_you_want >> $LOGFILE

El archivo de registro se verá como

2013-02-03 18:22:30 Say what you are doing

Así que será fácil de ordenar por fecha.


7
2017-09-12 20:34



Su '' config.sh '' ejecutará '' fecha '' exactamente una vez, en '' source ... / config.sh ''. - clacke


Te refieres a:

(date && script.sh) >> /var/log/logfile

5
2018-04-27 16:45



Dios mío, gente, todo el mundo está haciendo un reemplazo de marca anterior, tuberías con nombre, etc. ¡Simplemente incluya el comando date y el script en parens! El tipo que tiene la función tiene un caso legítimo si hay una salida de varias líneas y el registro debe verse bonito con la fecha en cada línea, pero la mayoría de estas soluciones son excesivas que no usan semántica de shell. - cjc
Eso solo agregará la marca de tiempo una vez por ejecución de script.sh. El OP necesita una marca de tiempo por línea. - Dave Forgac
Aunque esto no responde a la pregunta de OP, todavía la encuentro información útil. - User


Prueba esto

timestamp()
{
 date +"%Y-%m-%d %T"
}

Llame a esta función de marca de tiempo en cada comando de eco:

echo "$(timestamp): write your log here" >> /var/log/<logfile>.log

3
2017-11-09 22:24



@ shazbot: Gracias por editar, fue un error tipográfico, no me di cuenta. - Sanjay Yadav


La respuesta aceptada https://serverfault.com/a/310104 puede ser un poco lento, si se deben procesar muchas líneas, con la sobrecarga de iniciar el date proceso que permite aproximadamente 50 líneas por segundo en Ubuntu y solo 10-20 en Cygwin.

Cuando bash Se puede asumir una alternativa más rápida sería la printf construido con su %(...)T especificador de formato. Comparar

>> while true; do date; done | uniq -c
     47 Wed Nov  9 23:17:18 STD 2016
     56 Wed Nov  9 23:17:19 STD 2016
     55 Wed Nov  9 23:17:20 STD 2016
     51 Wed Nov  9 23:17:21 STD 2016
     50 Wed Nov  9 23:17:22 STD 2016

>> while true; do printf '%(%F %T)T\n'; done | uniq -c
  20300 2016-11-09 23:17:56
  31767 2016-11-09 23:17:57
  32109 2016-11-09 23:17:58
  31036 2016-11-09 23:17:59
  30714 2016-11-09 23:18:00

3
2017-08-26 01:51





El siguiente es el contenido de mi archivo de registro

xiongyu@ubuntu:~/search_start_sh$ tail restart_scrape.log 

2017-08-25 21:10:09 scrape_yy_news_main.py got down, now I will restart it

2017-08-25 21:10:09 check_yy_news_warn.py got down, now I will restart it

2017-08-25 21:14:53 scrape_yy_news_main.py got down, now I will restart it

Algunos de mis contenidos de shell son los siguientes

log_file="restart_scrape.log"
TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
echo "$TIMESTAMP $search_py_file got down, now I will restart it" | tee -a $log_file 

1
2018-03-30 13:48





Otra opción es configurar una función para llamar cada vez que desee generar datos en su código:

PrintLog(){
  information=$1
  logFile=$2
  echo "$(date +'%Y-%m-%d %H:%M:%S" $information} >> $logFile
}

Luego, cada vez que ingrese su código, desea enviarlo a la llamada del archivo de registro.

PrintLog "Stuff you want to add..." ${LogFileVariable}

Pan comido....


1
2018-03-25 11:15





Canalizar un "sed":

script.sh | sed "s|^|$('date') :: |" >> /var/log/logfile

0
2018-03-01 00:58