שאלה כיצד להוסיף חותמת כדי לרשום את התסריט?


יש לי סקריפט פועל כל הזמן שאני פלט לקובץ יומן:

script.sh >> /var/log/logfile

אני רוצה להוסיף חותמת לפני כל שורה שנוספת ליומן. כמו:

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

האם יש jujitsu ניתן להשתמש?


77
2017-09-10 21:35




לראות את זה questin. serverfault.com/questions/80749/.... תשובה שכזאת היתה חלה כאן. - Zoredache
לקבלת פתרון אווק / gawk ראה: stackoverflow.com/questions/21564/... - User


תשובות:


אתה יכול צינור הצינור של הפלט באמצעות לולאה כי תחילית את התאריך והשעה הנוכחיים:

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

אם אתה משתמש זה הרבה, זה קל לעשות פונקציה bash לטפל הלולאה:

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 מ זמירה רווח לבן בתחילת ו של הקו. זה קובע IFS (מפריד שדה פנימי של bash, בעצם רשימה של תווים לבנים) לרוקן את read פקודה. - Gordon Davisson
... ו- -R מתעלם מאופי הבריחה "\". זה באמת צריך לעבוד בכל המקרים - גדול של pice scripting. - Nils
@Nils זה לא לגמרי משוריינת, שכן כמה יישומים של echo לפרש רצפי מילוט. אם אתה באמת רוצה שזה לא להתעסק עם התוכן (מלבד הוספת תאריכים), להחליף את echo הפקודה printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
אתה עשוי להיות מעוניין ב ISO-8601 תואם תאריך / timestamp: date -u +"%Y-%m-%dT%H:%M:%SZ" או אולי יותר יפה date +"%Y-%m-%d %T". - Pablo Bianchi
בעוד סקריפט זה עובד כצפוי, זה spawns תהליך חדש (לבצע date) ל כל אחד קו יומן, אשר יכול להיות חיסרון מסיבי בהתאם למכשיר שלך ואת כמות היומנים. אני מעדיף להציע להשתמש ts אם זמין, ראה את התשובה מ @willem - Michael Schaefers


ראה "ts" מן אובונטו "moreutils" pkg:

command | ts

לחלופין, אם הפקודה $ עושה איחוי אוטומטי (דורש תצוגת dev-pkg):

unbuffer command | ts

41
2017-10-29 15:20





אתה יכול פשוט הד את הפלט פקודות logfile. כלומר,

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
זה מכניס חותמת לפני כל הפלט של ''. / Script.sht '', לא לפני כל שורה. - 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 / log / logfile "כדי לצרף את התאריך. - Antonius Bloch
במקרה זה לנתב מחדש את הפלט של התסריט שלך אל צינור בשם יש daemon מקשיב פלט אשר לוקח את הפלט סקריפט ומוסיף תאריך לפני כתיבתו קובץ יומן. אתה יכול כנראה לשנות את תסריט שכתבתי כאן כדי לעשות זאת. הייתי עושה את זה כי זה מעניין אותי אבל זה מאוחר בבריטניה ויש לי התחלה מוקדמת מחר. - 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



אלוהים, אנשים, כולם עושים חזרה תחליף טיק, בשם צינורות, וכו 'רק להקיף גם את תאריך הפקודה ואת התסריט ב parens! הבחור שיש לו את הפונקציה יש מקרה לגיטימי אם יש פלט רב קו ואת יומן צריך להיראות יפה עם התאריך על כל שורה, אבל רוב הפתרונות הללו הם overkill כי אינו משתמש סמנטיקה פגז. - cjc
זה רק להוסיף את חותמת פעם אחת לביצוע script.sh. OP צריך חותמת לכל שורה. - Dave Forgac
אם כי זה לא עונה על השאלה OP עדיין מצאתי את זה מידע שימושי. - User


נסה את זה

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

התקשר לפונקציה זו של חותמת הזמן בכל פקודת הד:

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

3
2017-11-09 22:24



@ shazbot: תודה על עריכת, זה היה טעות הקלדה, אני לא שם לב. - Sanjay Yadav