Vraag Hoe een tijdstempel toevoegen aan bash script log?


Ik heb een constant lopend script dat ik uitvoer naar een logbestand:

script.sh >> /var/log/logfile

Ik wil graag een tijdstempel toevoegen voor elke regel die aan het logboek is toegevoegd. Net zoals:

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

Is er een jujitsu die ik kan gebruiken?


77
2017-09-10 21:35


oorsprong


Zie deze questin. serverfault.com/questions/80749/.... Een paar antwoorden zou hier van toepassing zijn. - Zoredache
Zie voor een awk / gawk-oplossing: stackoverflow.com/questions/21564/... - User


antwoorden:


U kunt de uitvoer van het script doorsturen via een lus die de huidige datum en tijd als voorvoegsel bevat:

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

Als je dit veel gebruikt, kun je eenvoudig een bash-functie maken om de lus te verwerken:

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 het is een truc om te voorkomen read van het trimmen van witruimte aan het begin en en van de lijn. Het stelt IFS in (bash's Internal Field Separator, in feite een lijst met witruimtetekens) om te legen voor de read commando. - Gordon Davisson
... en -r negeert het escape-teken "\". Dit zou in alle gevallen echt moeten werken - geweldige pogingen om te scripten. - Nils
@Nils het is niet volledig kogelvrij, omdat sommige implementaties van echo interpreteer escape-sequences. als jij werkelijk wil dat het niet knoeit met de inhoud (behalve het toevoegen van datums), vervang de echo commando met printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
Misschien bent u geïnteresseerd in a Voldoet aan ISO-8601 date / timestamp: date -u +"%Y-%m-%dT%H:%M:%SZ" of misschien mooier date +"%Y-%m-%d %T". - Pablo Bianchi
terwijl dit script werkt zoals verwacht, wordt een nieuw proces (execute) uitgevoerd date) voor elk log line, wat een groot nadeel kan zijn, afhankelijk van uw machine en de hoeveelheid logs. Ik zou eerder willen voorstellen om te gebruiken ts indien beschikbaar, zie het antwoord van @willem - Michael Schaefers


Zie "ts" van de Ubuntu "meerutils" pkg:

command | ts

Of, als $ command automatisch bufferen gebruikt (vereist-devk-pkg):

unbuffer command | ts

41
2017-10-29 15:20





Je kunt gewoon echo de opdracht wordt naar het logbestand uitgevoerd. d.w.z,

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

Het werkt echt :)

Voorbeeld:

[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 werkt niet voor mij. - Antonius Bloch
Wat krijg je als je het commando uitvoert? - SparX
Dat plaatst een tijdstempel vóór de volledige uitvoer van '' ./script.sh '', niet vóór elke regel. - clacke


De datum commando geeft die informatie

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

dus je kunt het

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

is dat wat je wilde?


10
2018-02-03 17:23



Het gebruik van de date-opdracht was een beetje wat ik in gedachten had, maar ik kan dat niet echt toevoegen aan het script zelf, dus wat ik zoek is een manier om deze regel te veranderen: "script.sh >> / var / log / logfile "om de datum toe te voegen. - Antonius Bloch
In dat geval leid je de uitvoer van je script door naar een named pipe en laat je een daemon luisteren naar uitvoer die de scriptuitvoer neemt en een datum toevoegt voordat deze naar een logbestand wordt geschreven. U kunt waarschijnlijk het script dat ik schreef hier om dit te doen. Ik zou het doen omdat het me interesseert, maar het is laat in het VK en ik heb morgen een vroege start. - Iain


Maak een config.sh het dossier

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

Wanneer u het gebruik van het logbestand moet verzenden

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

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

do_what_you_want >> $LOGFILE

Logbestand ziet eruit als

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

Het is dus gemakkelijk om op datum te sorteren


7
2017-09-12 20:34



Uw '' config.sh '' zal '' date '' precies één keer uitvoeren, op '' source ... / config.sh ''. - clacke


Je bedoelt zoals:

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

5
2018-04-27 16:45



Mijn god, mensen, iedereen is terug aan het vervangen van vinkjes, pijpen genaamd, etc. Sluit zowel het datumcommando als het script in paren in! Degene die de functie heeft, heeft een legitiem geval als er multi-line uitvoer is en het log moet er mooi uitzien met de datum op elke regel, maar de meeste van deze oplossingen zijn overkill die geen shell-semantiek gebruikt. - cjc
Dat voegt alleen de tijdstempel eenmaal toe per uitvoering van script.sh. Het OP heeft een tijdstempel per regel nodig. - Dave Forgac
hoewel dit de OP-vraag niet beantwoordt, vond ik het nog steeds nuttige informatie. - User


Probeer dit

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

Roep deze tijdstempelfunctie op in elke echo-opdracht:

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

3
2017-11-09 22:24



@ shazbot: Bedankt voor het bewerken, dat was een typefout, ik merkte het niet op. - Sanjay Yadav


Het geaccepteerde antwoord https://serverfault.com/a/310104 kan een beetje traag zijn, als er veel regels moeten worden verwerkt, met de overhead van het starten van de date proces dat ongeveer 50 lijnen per seconde toestaat in Ubuntu, en slechts ongeveer 10-20 in Cygwin.

Wanneer bash kan worden aangenomen dat een sneller alternatief de printf gebouwd met zijn %(...)T formaat specificatie. Vergelijken

>> 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





Het onderstaande is de inhoud van mijn logbestand

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

sommige van mijn shell-inhoud is zoals hieronder

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





Een andere optie is om een ​​functie in te stellen voor elke keer dat u gegevens in uw code wilt uitvoeren:

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

Telkens in uw code wilt u deze naar de logbestandoproep verzenden

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

Makkelijk....


1
2018-03-25 11:15





Pijp een "sed":

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

0
2018-03-01 00:58