سؤال كيفية إضافة طابع زمني لسجل البرنامج النصي باش؟


لدي برنامج نصي يعمل باستمرار ونقوم بإخراجه إلى ملف سجل:

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
للحصول على حل awk / 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 من البرمجة. - Nils
Nils انها ليست تماما الرصاص ، لأن بعض عمليات التنفيذ echo تفسير تسلسل الهروب. اذا أنت هل حقا تريد عدم الفوضى مع المحتوى (بخلاف إضافة التواريخ) ، استبدال echo الأمر مع printf "%s %s\n" "$(date)" "$line" - Gordon Davisson
قد تكون مهتما على متوافق مع ISO-8601 تاريخ / الطابع الزمني: date -u +"%Y-%m-%dT%H:%M:%SZ" أو ربما أكثر جمالا date +"%Y-%m-%d %T". - Pablo Bianchi
بينما يعمل هذا البرنامج النصي كما هو متوقع ، فإنه ينتج عملية جديدة (تنفيذ date) إلى عن على كل خط السجل ، والذي يمكن أن يكون عائقًا هائلاً اعتمادًا على جهازك وكمية السجلات. أود أن أقترح استخدام ts إذا كان متاحًا ، فراجع الإجابة منwillem - Michael Schaefers


انظر "ts" من pk أوبونتو "moreutils":

command | ts

أو ، إذا كان الأمر $ يقوم بالتخزين المؤقت التلقائي (يتطلب pkg المتوقع-dev):

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
يضع ذلك طابعًا زمنيًا قبل إخراج "./script.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



استخدام الأمر date كان نوعًا مما كان يدور في ذهني ، ولكن لا يمكنني إضافة ذلك إلى البرنامج النصي نفسه ، لذا فإن ما أبحث عنه هو طريقة لتغيير هذا السطر: "script.sh >> / var / log / logfile "لإلحاق التاريخ. - 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 '' الخاص بك '' date '' مرة واحدة بالضبط ، على '' source ... / config.sh ''. - clacke


تقصد مثل:

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

5
2018-04-27 16:45



يا إلهي ، أيها الناس ، يقوم الجميع باستبدال القراد ، وتسمية الأنابيب ، وما إلى ذلك. فقط ضع كل من أمر التاريخ والبرنامج النصي في parens! لدى الشخص الذي لديه الوظيفة حالة شرعية إذا كان هناك خرج متعدد الأسطر ، ويحتاج السجل إلى مظهر جميل مع التاريخ على كل سطر ، ولكن معظم هذه الحلول هي مبالغة لا تستخدم دلالات الغلاف. - cjc
سيؤدي ذلك إلى إضافة الطابع الزمني مرة واحدة فقط لكل عملية تنفيذ script.sh. يحتاج OP إلى طابع زمني لكل سطر. - Dave Forgac
على الرغم من أن هذا لا يجيب على سؤال OP ، إلا أنني أجده مفيدًا. - User


جرب هذا

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

استدعاء وظيفة الطابع الزمني هذه في كل أمر echo:

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

3
2017-11-09 22:24



@ shazbot: شكرا للتحرير ، وهذا خطأ مطبعي ، لم ألاحظ. - Sanjay Yadav


الجواب المقبول https://serverfault.com/a/310104 يمكن أن تكون بطيئة بعض الشيء ، إذا كان يجب معالجة الكثير من الخطوط ، مع زيادة الحمل date عملية تسمح حوالي 50 سطر في الثانية في أوبونتو ، وفقط حوالي 10-20 في Cygwin.

متى bash يمكن افتراض أن البديل الأسرع هو printf مدين مع %(...)T محدد التنسيق. قارن

>> while true; do date; done | uniq -c
     47 Wed Nov  9 23:17:18 STD 2016
     56 Wed Nov  9 23:17:19 STD 2016
     55 Wed Nov  9 23:17:20 STD 2016
     51 Wed Nov  9 23:17:21 STD 2016
     50 Wed Nov  9 23:17:22 STD 2016

>> while true; do printf '%(%F %T)T\n'; done | uniq -c
  20300 2016-11-09 23:17:56
  31767 2016-11-09 23:17:57
  32109 2016-11-09 23:17:58
  31036 2016-11-09 23:17:59
  30714 2016-11-09 23:18:00

3
2017-08-26 01:51