Soru Betik günlük kaydı için zaman damgası nasıl eklenir?


Günlük dosyasına gönderdiğim sürekli bir komut dosyası var:

script.sh >> /var/log/logfile

Günlüğe eklenen her satırın önüne bir zaman damgası eklemek istiyorum. Sevmek:

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

Kullanabileceğim bir jujitsu var mı?


77
2017-09-10 21:35


Menşei


Bu maceraya bakın. serverfault.com/questions/80749/.... Burada birkaç cevap geçerli olur. - Zoredache
Bir awk / gawk çözümü için bkz: stackoverflow.com/questions/21564/... - User


Cevaplar:


Komut dosyasının çıktısını geçerli tarih ve saati önekleyen bir döngüden geçirebilirsiniz:

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

Bunu çok kullanacaksanız, döngüyü işlemek için bir bash işlevi yapmak kolaydır:

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

79
2017-09-10 21:58



@Nils önlemek için bir hile read Başlangıçta ve çizgideki boşlukları kırpmadan. IFS'yi (temelde İç Saha Ayırıcısı, temel olarak bir boşluk karakterleri listesi) ayarlar. read Komut. - Gordon Davisson
... ve -r kaçış karakterini "\" yoksayar. Bu gerçekten her durumda çalışmalıdır - harika bir komut dosyası. - Nils
@Nils tamamen kurşun geçirmez değildir, çünkü bazı uygulamalar echo kaçış dizilerini yorumlar. Eğer sen Gerçekten mi içeriği (tarih eklemek dışında) karıştırmamak için echo ile komuta etmek printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
İlginizi çekebilir ISO-8601 uyumlu tarih / zaman damgası: date -u +"%Y-%m-%dT%H:%M:%SZ" ya da belki daha güzel date +"%Y-%m-%d %T". - Pablo Bianchi
bu betik beklendiği gibi çalışır, yeni bir süreç oluşturur (yürütmek date) için her Makinenize ve günlük miktarına bağlı olarak büyük bir dezavantaja sahip olabilir. Kullanmayı tercih ederim ts eğer varsa, @willem - Michael Schaefers


Ubuntu "daha fazla" pkg "ts" bakın:

command | ts

Ya da, $ komutu otomatik arabelleğe alırsa (bekle-dev pkg gerektirir):

unbuffer command | ts

41
2017-10-29 15:20





Sadece yapabilirsiniz Eko komut, günlük dosyasına çıktı verir. yani

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

Gerçekten çalışıyor :)

Örnek:

[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 benim için çalışmıyor. - Antonius Bloch
Komutu yürüttüğünüzde ne yapıyorsunuz? - SparX
Bu, her satırın öncesinde değil, '' ./script.sh '' çıktısından önce bir zaman damgası koyar. - clacke


tarih komut bu bilgiyi verecek

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

Böylece yapabilirsiniz

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

İstediğin bu muydu ?


10
2018-02-03 17:23



Tarih komutunu kullanmak aklımdaki gibi bir şeydi, ama ben gerçekten bu betiği kendime ekleyemiyorum, bu yüzden aradığım şey bu satırı değiştirmenin bir yoludur: "script.sh >> / var / tarih eklemek için "log / logfile". - Antonius Bloch
Bu durumda betiğinizin çıkışını adlandırılmış bir boruya yönlendirin ve çıktıyı dinleyen bir programa sahip olacaksınız ve bu da betik çıktısını alıp bir günlük dosyasına yazmadan önce bir tarih ekleyecektir. Muhtemelen değiştirebilirsiniz ben yazdım Bunu yapmak için burada. Bunu yapardım çünkü beni ilgilendirir ama İngiltere'de geç kaldı ve yarın erken bir başlangıç ​​yapacağım. - Iain


Yapmak config.sh dosya

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

Günlük dosyası kullanımına göndermek istediğinizde

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

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

do_what_you_want >> $LOGFILE

Günlük dosyası gibi görünecek

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

Yani tarihe göre sıralamak kolay olacak


7
2017-09-12 20:34



'' Config.sh '' '' date '' tam olarak bir kez, '' source ... / config.sh '' üzerinde çalışır. - clacke


Demek istediğin gibi:

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

5
2018-04-27 16:45



Tanrım, millet, herkes geri teneke değişimi yapıyor, pipolar, vb. Diye yazıyor. Sadece tarih komutunu ve senaryonun parantez içinde olmasını sağla! Çok satırlı çıktı varsa ve her satırdaki tarihle güzel görünmesi gerekiyorsa, işleve sahip olan kişinin yasal bir durumu vardır, ancak bu çözümlerin çoğu kabuk semantiği kullanmayan fazladır. - cjc
Bu, yalnızca yürütme başına bir kez damgası ekleyecektir script.sh. OP'nin satır başına bir zaman damgası gerekiyor. - Dave Forgac
Bu OP sorusuna cevap vermiyor olsa da, hala yararlı bilgiler buldum. - User


Bunu dene

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

Her echo komutunda bu zaman damgası işlevini çağırın:

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

3
2017-11-09 22:24



@ shazbot: Düzenleme için teşekkürler, bir yazım hatası oldu, farketmedim. - Sanjay Yadav