Mam stale działający skrypt, który wypisuję do pliku dziennika:
script.sh >> /var/log/logfile
Chciałbym dodać znacznik czasu przed każdą linią dołączaną do dziennika. Lubić:
Sat Sep 10 21:33:06 UTC 2011 The server has booted up. Hmmph.
Czy mogę użyć jujitsu?
Odpowiedzi:
Możesz przesyłać dane wyjściowe skryptu przez pętlę poprzedzającą bieżącą datę i godzinę:
Jeśli będziesz często tego używać, łatwo jest wykonać funkcję bash do obsługi pętli:
źródło
read
przycinaniu białych znaków na początku i na linii. Ustawia IFS (wewnętrzny separator pól bash, w zasadzie listę białych znaków) na pusty dlaread
polecenia.echo
interpretują sekwencje specjalne. Jeśli naprawdę chcesz, aby nie bałaganił treści (poza dodawaniem dat), zamieńecho
polecenie naprintf "%s %s\n" "$(date)" "$line"
date -u +"%Y-%m-%dT%H:%M:%SZ"
a może ładniejszymdate +"%Y-%m-%d %T"
.date
) dla każdej linii dziennika, co może być ogromną wadą w zależności od komputera i ilości dzienników. Wolę użyć,ts
jeśli jest dostępny, patrz odpowiedź od @willemZobacz
ts
zmoreutils
pakietu Ubuntu :Lub jeśli
$command
automatyczne buforowanie (wymagaexpect-dev
pakietu):źródło
Polecenie date dostarczy te informacje
więc możesz
czy tego właśnie chciałeś?
źródło
Możesz po prostu wysłać dane wyjściowe polecenia do pliku dziennika. to znaczy,
To naprawdę działa :)
Przykład:
źródło
Zrób
config.sh
plikKiedy musisz wysłać do pliku dziennika użyj
Plik dziennika będzie wyglądał
Dzięki temu sortowanie według daty będzie łatwe
źródło
Masz na myśli:
źródło
script.sh
. OP potrzebuje znacznika czasu na linię.Spróbuj tego
Wywołaj tę funkcję znacznika czasu w każdym poleceniu echa:
źródło
Akceptowana odpowiedź https://serverfault.com/a/310104 może być nieco wolna, jeśli trzeba przetworzyć wiele linii, a narzut związany z uruchomieniem
date
procesu pozwala na około 50 linii na sekundę w Ubuntu i tylko około 10 -20 w Cygwin.Gdy
bash
można założyć, szybszą alternatywą byłobyprintf
wbudowanie ze%(...)T
specyfikatorem formatu. Porównaćźródło
Możesz zauważyć, że awk działa szybko,
Ale sed działa znacznie szybciej,
Jednak po bliższym przyjrzeniu się zestaw nie wydaje się zmieniać czasu,
źródło
"s/^/$(date -R) /"
i uruchamia datę raz przed sedem. Sed przechodzi ciąg statyczny.yes | head -5000000 | while read line; do echo $((SECONDS)); done | uniq -c
który jest znacznie wolniejszy niż gawk.ts
narzędzie ma podobną wydajność jak pętla bash.yes |head -5000000 |perl -ne 'print localtime."\t".$_' |uniq -c
który jest nieco wolniejszy niż awk.Poniżej znajduje się zawartość mojego pliku dziennika
część mojej zawartości powłoki jest jak poniżej
źródło
Ten skrypt drukuje dane wyjściowe w terminalu, a także zapisuje w pliku dziennika.
Przykładowe dane wyjściowe:
źródło
Inną opcją jest ustawienie funkcji wywoływania za każdym razem, gdy chcesz wyprowadzać dane w kodzie:
Następnie za każdym razem w kodzie chcesz wysłać go do wywołania pliku dziennika
Bułka z masłem....
źródło
Potok „sed”:
źródło