सवाल बैश स्क्रिप्ट लॉग में टाइमस्टैम्प कैसे जोड़ें?


मेरे पास लगातार चल रही स्क्रिप्ट है जो मैं लॉग फ़ाइल में आउटपुट करता हूं:

script.sh >> /var/log/logfile

मैं लॉग में संलग्न प्रत्येक पंक्ति से पहले एक टाइमस्टैम्प जोड़ना चाहता हूं। पसंद:

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

क्या कोई जुजित्सु मैं उपयोग कर सकता हूं?


77
2017-09-10 21:35


मूल


इस questin देखें। serverfault.com/questions/80749/...। एक दो उत्तर यहां लागू होगा। - Zoredache
एक अजीब / गॉक समाधान के लिए देखें: stackoverflow.com/questions/21564/... - User


जवाब:


आप स्क्रिप्ट के आउटपुट को उस लूप के माध्यम से पाइप कर सकते हैं जो वर्तमान दिनांक और समय को उपसर्ग करता है:

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

यदि आप इसका बहुत उपयोग करेंगे, तो लूप को संभालने के लिए बैश फ़ंक्शन बनाना आसान है:

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 यह रोकने के लिए एक चाल है read शुरुआत और लाइन के whitespace trimming से। यह आईएफएस (बैश का आंतरिक क्षेत्र विभाजक, मूल रूप से व्हाइटस्पेस वर्णों की एक सूची) को सेट करने के लिए सेट करता है read आदेश। - Gordon Davisson
... और -r भागने-चरित्र "\" को अनदेखा करता है। यह वास्तव में सभी मामलों में काम करना चाहिए - स्क्रिप्टिंग का महान पासा। - Nils
@ नील्स यह पूरी तरह से बुलेटप्रूफ नहीं है, क्योंकि कुछ कार्यान्वयन echo भागने के दृश्यों की व्याख्या करें। अगर तुम वास्तव में चाहते हैं कि यह सामग्री के साथ गड़बड़ न करें (तिथियां जोड़ने के अलावा), प्रतिस्थापित करें echo के साथ आदेश printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
आप पर रुचि हो सकती है आईएसओ -8601 अनुपालन तारीख / टाइमस्टैम्प: date -u +"%Y-%m-%dT%H:%M:%SZ" या शायद अधिक सुंदर date +"%Y-%m-%d %T"। - Pablo Bianchi
जबकि यह स्क्रिप्ट अपेक्षित काम करती है, यह एक नई प्रक्रिया उत्पन्न करती है (निष्पादित करें date) के लिये से प्रत्येक लॉग लाइन, जो आपकी मशीन और लॉग की मात्रा के आधार पर भारी कमी हो सकती है। मैं बजाय उपयोग करने का सुझाव देना चाहूंगा ts यदि उपलब्ध हो, तो @ विलेम से जवाब देखें - Michael Schaefers


उबंटू "moreutils" से "ts" देखें pkg:

command | ts

या, यदि $ कमांड स्वचालित बफरिंग करता है (अपेक्षित-dev pkg की आवश्यकता है):

unbuffer command | ts

41
2017-10-29 15:20





आप बस कर सकते हैं गूंज आदेश लॉगफाइल को आउटपुट करता है। अर्थात,

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

यह सचमुच काम करता है :)

उदाहरण:

[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



हम्म मेरे लिए काम नहीं कर रहा है। - Antonius Bloch
जब आप कमांड निष्पादित करते हैं तो आप क्या प्राप्त कर रहे हैं? - SparX
यह प्रत्येक पंक्ति से पहले नहीं, '.sscript.sh' 'के पूरे आउटपुट से पहले टाइमस्टैंप रखता है। - clacke


दिनांक आदेश उस जानकारी प्रदान करेगा

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

तो तुम कर सकते हो

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

क्या आप यही चाहते थे?


10
2018-02-03 17:23



दिनांक कमांड का उपयोग करना मेरे मन में था, लेकिन मैं वास्तव में इसे स्क्रिप्ट में नहीं जोड़ सकता, इसलिए जो मैं खोज रहा हूं वह इस पंक्ति को बदलने का एक तरीका है: "script.sh >> / var / लॉग / लॉगफाइल "तिथि जोड़ने के लिए। - Antonius Bloch
उस स्थिति में अपनी स्क्रिप्ट के आउटपुट को एक नामित पाइप पर रीडायरेक्ट करें और आउटपुट के लिए एक डेमॉन सुनना है जो स्क्रिप्ट आउटपुट लेता है और इसे लॉग फ़ाइल में लिखने से पहले एक तिथि जोड़ता है। आप शायद संशोधित कर सकते हैं लिपि मैंने लिखा था ऐसा करने के लिए यहाँ। मैं ऐसा इसलिए करूँगा क्योंकि यह मेरी रूचि रखता है लेकिन ब्रिटेन में देर हो चुकी है और कल मेरी शुरुआत हुई है। - Iain


एक बनाओ config.sh फ़ाइल

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

जब आपको लॉग फ़ाइल उपयोग को भेजने की आवश्यकता होती है

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

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

do_what_you_want >> $LOGFILE

लॉग फ़ाइल की तरह दिखता है

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

तो तिथि से सॉर्ट करना आसान होगा


7
2017-09-12 20:34



आपका 'config.sh' '' स्रोत '... / config.sh' पर बिल्कुल एक बार "दिनांक" चलाएगा। - clacke


आपका मतलब है जैसे:

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

5
2018-04-27 16:45



मेरे भगवान, लोग, हर कोई टिक प्रतिस्थापन, नामित पाइप इत्यादि कर रहा है। बस डेट कमांड और स्क्रिप्ट दोनों माता-पिता में संलग्न करें! जिस व्यक्ति के पास फ़ंक्शन है, उसके पास एक कानूनी मामला है यदि बहु-लाइन आउटपुट है और लॉग को प्रत्येक पंक्ति पर दिनांक के साथ सुंदर दिखने की ज़रूरत है, लेकिन इनमें से अधिकतर समाधान ओवरकिल हैं जो शैल सेमेटिक्स का उपयोग नहीं करते हैं। - cjc
यह केवल एक बार निष्पादन के बाद टाइमस्टैंप जोड़ देगा script.sh। ओपी प्रति लाइन एक टाइमस्टैम्प की जरूरत है। - Dave Forgac
हालांकि यह ओपी प्रश्न का उत्तर नहीं देता है, फिर भी मुझे यह उपयोगी जानकारी मिली है। - User


इसे इस्तेमाल करे

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

प्रत्येक गूंज कमांड में इस टाइमस्टैम्प फ़ंक्शन को कॉल करें:

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

3
2017-11-09 22:24



@ शाजबॉट: संपादन के लिए धन्यवाद, यह एक टाइपो त्रुटि थी, मैंने नोटिस नहीं किया था। - Sanjay Yadav