Pertanyaan Bagaimana cara menambahkan stempel waktu ke bash log skrip?


Saya memiliki skrip yang terus berjalan yang saya keluaran ke file log:

script.sh >> /var/log/logfile

Saya ingin menambahkan stempel waktu sebelum setiap baris yang ditambahkan ke log. Seperti:

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

Apakah ada jujitsu yang bisa saya gunakan?


77
2017-09-10 21:35




Lihat pencarian ini. serverfault.com/questions/80749/ .... Jawaban pasangan akan berlaku di sini. - Zoredache
Untuk solusi awk / gawk, lihat: stackoverflow.com/questions/21564/… - User


Jawaban:


Anda dapat menyalurkan output skrip melalui loop yang memberi awalan tanggal dan waktu saat ini:

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

Jika Anda akan menggunakan ini banyak, mudah untuk membuat fungsi bash untuk menangani loop:

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, ini adalah trik untuk mencegah read dari pemangkasan spasi di awal dan dan garis. Ini menetapkan IFS (bash's Internal Field Separator, pada dasarnya daftar karakter spasi) kosong untuk read perintah. - Gordon Davisson
... dan -r mengabaikan karakter escape "\". Ini harus benar-benar berfungsi dalam semua kasus - cuplikan skrip yang bagus. - Nils
@Nils itu tidak sepenuhnya antipeluru, karena beberapa implementasi echo menginterpretasikan urutan escape. Jika kamu sangat ingin tidak mengacaukan konten (selain menambahkan tanggal), ganti echo perintah dengan printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
Anda mungkin tertarik pada ISO-8601 compliant tanggal / stempel waktu: date -u +"%Y-%m-%dT%H:%M:%SZ" atau mungkin lebih cantik date +"%Y-%m-%d %T". - Pablo Bianchi
sementara skrip ini bekerja seperti yang diharapkan, ini memunculkan proses baru (eksekusi date) untuk setiap baris log, yang dapat menjadi kerugian besar tergantung pada mesin Anda dan jumlah log. Saya lebih suka menyarankan untuk digunakan ts jika tersedia, lihat jawaban dari @ willem - Michael Schaefers


Lihat "ts" dari pkg Ubuntu "moreutils":

command | ts

Atau, jika $ command melakukan buffering otomatis (membutuhkan pkg harapan-dev):

unbuffer command | ts

41
2017-10-29 15:20





Anda bisa begitu saja gema output perintah ke file log. yaitu,

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

Itu benar-benar berfungsi :)

Contoh:

[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 tidak bekerja untukku. - Antonius Bloch
Apa yang Anda dapatkan ketika Anda menjalankan perintah? - SparX
Itu menempatkan stempel waktu sebelum seluruh hasil dari '' ./script.sh '', tidak sebelum setiap baris. - clacke


Itu tanggal perintah akan memberikan informasi itu

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

jadi kamu bisa

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

apa itu yang kau inginkan?


10
2018-02-03 17:23



Menggunakan perintah tanggal adalah jenis apa yang ada dalam pikiran saya, tetapi saya tidak bisa menambahkannya ke skrip itu sendiri, jadi yang saya cari adalah cara untuk mengubah baris ini: "script.sh >> / var / log / logfile "untuk menambahkan tanggal. - Antonius Bloch
Dalam hal ini, arahkan kembali skrip Anda ke sebuah pipa bernama dan minta daemon mendengarkan keluaran yang mengambil keluaran skrip dan menambahkan tanggal sebelum menulisnya ke file log. Anda mungkin bisa memodifikasi skrip yang saya tulis di sini untuk melakukan ini. Saya akan melakukannya karena itu menarik minat saya tetapi sudah terlambat di Inggris dan saya memiliki lebih awal besok. - Iain


Membuat config.sh mengajukan

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

Ketika Anda perlu mengirim ke penggunaan file log

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

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

do_what_you_want >> $LOGFILE

File log akan terlihat seperti

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

Jadi akan mudah untuk mengurutkan berdasarkan tanggal


7
2017-09-12 20:34



'' Config.sh '' Anda akan menjalankan '' date '' tepat satu kali, pada '' source ... / config.sh ''. - clacke


Maksud Anda seperti:

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

5
2018-04-27 16:45



Ya Tuhan, orang-orang, semua orang melakukan penggantian tick kembali, bernama pipa, dll. Cukup lampirkan perintah tanggal dan skrip di parens! Orang yang memiliki fungsi memiliki kasus yang sah jika ada output multi-baris dan log harus terlihat cantik dengan tanggal pada setiap baris, tetapi sebagian besar solusi ini berlebihan yang tidak menggunakan semantik shell. - cjc
Itu hanya akan menambahkan stempel waktu sekali per eksekusi script.sh. OP membutuhkan stempel waktu per baris. - Dave Forgac
meskipun ini tidak menjawab pertanyaan OP, saya masih menemukan informasi yang berguna. - User


Coba ini

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

Panggil fungsi stempel waktu ini di setiap perintah echo:

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

3
2017-11-09 22:24



@ shazbot: Terima kasih telah mengedit, itu adalah kesalahan ketik, saya tidak memperhatikan. - Sanjay Yadav