স্ক্রিপ্ট লগ এড়াতে কীভাবে টাইমস্ট্যাম্প যুক্ত করবেন?


94

আমার একটি ক্রমাগত চলমান স্ক্রিপ্ট রয়েছে যা আমি লগ ফাইলে আউটপুট করি:

script.sh >> /var/log/logfile

লগে যুক্ত হওয়া প্রতিটি লাইনের আগে আমি একটি টাইমস্ট্যাম্প যুক্ত করতে চাই। ভালো লেগেছে:

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

আমি কি কোন জুজিৎসু ব্যবহার করতে পারি?


2
এই কোয়েস্টিন দেখুন। সার্ভারফল্ট.কোয়েশনস / 74৮74৯৯/… । একটি দম্পতি উত্তর এখানে প্রয়োগ করা হবে।
জোড়াদেচি

একটি awk / গাওক সমাধানের জন্য দেখুন: stackoverflow.com/questions/21564/…
ব্যবহারকারী

উত্তর:


88

আপনি স্ক্রিপ্টের আউটপুটটি এমন লুপের মাধ্যমে পাইপ করতে পারেন যা বর্তমান তারিখ এবং সময়কে উপস্থাপন করে:

./script.sh | while IFS= read -r line; do printf '%s %s\n' "$(date)" "$line"; done >>/var/log/logfile

আপনি যদি এটি ব্যবহার করছেন তবে লুপটি পরিচালনা করতে ব্যাশ ফাংশন করা সহজ:

adddate() {
    while IFS= read -r line; do
        printf '%s %s\n' "$(date)" "$line";
    done
}

./thisscript.sh | adddate >>/var/log/logfile
./thatscript.sh | adddate >>/var/log/logfile
./theotherscript.sh | adddate >>/var/log/logfile

3
@ নীল এটি readশুরুর দিকে এবং লাইনের শ্বেত স্পেস ছাঁটা থেকে বিরত করার কৌশল । readকমান্ডের জন্য খালি রাখতে এটি আইএফএস (বাশের অভ্যন্তরীণ ক্ষেত্র বিভাজক, মূলত হোয়াইটস্পেস অক্ষরের একটি তালিকা) সেট করে ।
গর্ডন ডেভিসন

2
... এবং -র পালাবার চরিত্র "\" উপেক্ষা করে। এটি সমস্ত ক্ষেত্রে সত্যই কাজ করা উচিত - স্ক্রিপ্টিংয়ের দুর্দান্ত পাইস।
নিলস

7
নিলগুলি @ নিলগুলি সম্পূর্ণরূপে বুলেটপ্রুফ নয়, যেহেতু echoপালানোর ক্রমগুলি ব্যাখ্যা করার কিছু প্রয়োগ রয়েছে । আপনি যদি সত্যিই বিষয়বস্তুতে (খেজুর যোগ করা ব্যতীত) echoprintf "%s %s\n" "$(date)" "$line"
গোলযোগ

4
আপনি কোনও আইএসও -8601 অনুমানের তারিখ / টাইমস্ট্যাম্প: date -u +"%Y-%m-%dT%H:%M:%SZ"বা আরও সুন্দর হতে আগ্রহী date +"%Y-%m-%d %T"
পাবলো এ

1
এই স্ক্রিপ্টটি প্রত্যাশার মতো কাজ করার সময়, এটি প্রতিটি লগ লাইনের dateজন্য একটি নতুন প্রক্রিয়া (সম্পাদন ) তৈরি করে , যা আপনার মেশিন এবং লগগুলির পরিমাণের উপর নির্ভর করে একটি বিশাল অপূর্ণতা হতে পারে। পরিবর্তে tsউপলভ্য হলে আমি ব্যবহার করার পরামর্শ দিচ্ছি , @ উইলিয়ামের উত্তরটি দেখুন
মাইকেল

56

tsউবুন্টু moreutilsপ্যাকেজ থেকে দেখুন :

command | ts

অথবা, যদি $commandস্বয়ংক্রিয়ভাবে বাফারিং হয় ( expect-devপ্যাকেজের প্রয়োজন ):

unbuffer command | ts

18

তারিখ কমান্ড যে তথ্য প্রদান করবে

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

তাই আপনি যা করতে পারেন

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

আপনি চেয়েছিলেন কি হল ?


ডেট কমান্ডটি ব্যবহার করা আমার মনে যা ছিল তা ছিল তবে আমি নিজেই এটি স্ক্রিপ্টে যোগ করতে পারি না, তাই আমি যা খুঁজছি তা এই লাইনটি পরিবর্তন করার একটি উপায়: "স্ক্রিপ্ট.শ >> / ভার / লগ / লগফিল "তারিখ সংযোজন করতে।
অ্যান্টোনিয়াস ব্লচ

সেক্ষেত্রে আপনার স্ক্রিপ্টের আউটপুটটিকে একটি নামযুক্ত পাইপে পুনঃনির্দেশ করুন এবং আউটপুট শোনার জন্য ডিমন শুনুন যা স্ক্রিপ্ট আউটপুট নেয় এবং লগ ফাইলটিতে লেখার আগে একটি তারিখ যুক্ত করে। এটি করার জন্য আপনি সম্ভবত এখানে লিখিত স্ক্রিপ্টটি পরিবর্তন করতে পারেন । আমি এটি করব কারণ এটি আমার আগ্রহী তবে ইউকেতে দেরি হয়ে গেছে এবং আগামীকালই আমার একটি সূচনা শুরু হয়েছে।
ব্যবহারকারী 9517

12

আপনি কেবল লগফাইলে আউটপুট কমান্ড প্রতিধ্বনি করতে পারেন । অর্থাত,

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]$ 

হুম আমার পক্ষে কাজ করছে না।
আন্তনিয়াস ব্লচ

কমান্ডটি কার্যকর করার সময় আপনি কী পাচ্ছেন?
স্পারএক্স

8
এটি '' ./script.sh '' এর সম্পূর্ণ আউটপুটের আগে টাইমস্ট্যাম্প রাখে, প্রতিটি লাইনের আগে নয়।
ক্লেক

8

একটি 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

সুতরাং তারিখ অনুসারে বাছাই করা সহজ হবে


8
আপনার '' config.sh '' 'উত্স ... / config.sh' 'এ ঠিক একবার' 'তারিখ' 'চালাবে।
ক্লেক

5

আপনি যেমন বলতে চাইছেন:

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

আমার godশ্বর, লোকেরা, প্রত্যেকে পাইপ ইত্যাদির নামে টিক রিপ্লেসমেন্ট করছে, ডেট কমান্ড এবং স্ক্রিপ্ট উভয়ই পেরেন্সে সংযুক্ত করুন! যে লোকটির কাছে এই ফাংশনটি রয়েছে তার একটি বৈধ কেস রয়েছে যদি মাল্টি-লাইন আউটপুট থাকে এবং লগকে প্রতিটি লাইনের তারিখের সাথে দেখতে সুন্দর দেখা দরকার তবে এই সমাধানগুলির বেশিরভাগই ওভারকিল যা শেল শব্দার্থ ব্যবহার করে না।
সিজেসি

8
এটি কেবলমাত্র একবার কার্যকর করার সময় টাইমস্ট্যাম্প যুক্ত করবে script.sh। ওপিতে প্রতি লাইনে টাইমস্ট্যাম্প দরকার।
ডেভ ভুলেজ

1
যদিও এটি ওপি প্রশ্নের উত্তর দেয় না আমি এখনও এটি দরকারী তথ্য পেয়েছি।
ব্যবহারকারী

4

এটা চেষ্টা কর

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

প্রতি ইকো কমান্ডে এই টাইমস্ট্যাম্প ফাংশনটি কল করুন:

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

@ শ্যাজবট: সম্পাদনার জন্য ধন্যবাদ, এটি টাইপোর ত্রুটি ছিল, আমি খেয়াল করিনি।
সঞ্জয় যাদব

4

গৃহীত উত্তর https://serverfault.com/a/310104date উবুন্টুতে প্রতি সেকেন্ডে প্রায় 50 টি লাইন প্রসেস শুরু করার ওভারহেড সহ প্রক্রিয়াটি শুরু করতে গেলে অনেকগুলি লাইন প্রক্রিয়া করতে হয় তবে কিছুটা ধীর হতে পারে and সাইগউইনে -20।

যখন 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

1

আপনি খেয়াল করতে পারেন যে awk দ্রুত চলেছে,

gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'

yes |head -5000000 |gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }' |uniq -c
 461592 [2017-02-28 19:46:44] y
 488555 [2017-02-28 19:46:45] y
 491205 [2017-02-28 19:46:46] y
 498568 [2017-02-28 19:46:47] y
 502605 [2017-02-28 19:46:48] y
 494048 [2017-02-28 19:46:49] y
 493299 [2017-02-28 19:46:50] y
 498005 [2017-02-28 19:46:51] y
 502916 [2017-02-28 19:46:52] y
 495550 [2017-02-28 19:46:53] y
  73657 [2017-02-28 19:46:54] y

তবে, সেড অনেক দ্রুত চলে,

sed -e "s/^/$(date -R) /"

yes |head -5000000 |sed -e "s/^/$(date -R) /" |uniq -c
5000000 Tue, 28 Feb 2017 19:57:00 -0500 y

তবে কাছাকাছি পরিদর্শন করার সময় সেটটি সময় পরিবর্তন করে বলে মনে হচ্ছে না,

vmstat 1 | sed -e "s/^/$(date -R) /"

1
এটি কারণ "s/^/$(date -R) /"সেশ এর আগে একবার এটি মূল্যায়ন এবং চলমান তারিখ। শেড একটি স্ট্যাটিক স্ট্রিং পাস হয়।
ইভান বেন

সরল বাশ: yes | head -5000000 | while read line; do echo $((SECONDS)); done | uniq -cযা গাওয়াকের চেয়ে অনেক ধীর er tsব্যাশ লুপ হিসাবে ইউটিলিটি একই কর্মক্ষমতা আছে।
আখন

পার্ল: yes |head -5000000 |perl -ne 'print localtime."\t".$_' |uniq -cযা অ্যাজকের চেয়ে কিছুটা ধীর।
আখান

1

নীচে আমার লগ ফাইল সামগ্রী আছে

xiongyu@ubuntu:~/search_start_sh$ tail restart_scrape.log 

2017-08-25 21:10:09 scrape_yy_news_main.py got down, now I will restart it

2017-08-25 21:10:09 check_yy_news_warn.py got down, now I will restart it

2017-08-25 21:14:53 scrape_yy_news_main.py got down, now I will restart it

আমার শেল বিষয়বস্তুর কিছু নীচে আছে

log_file="restart_scrape.log"
TIMESTAMP=`date "+%Y-%m-%d %H:%M:%S"`
echo "$TIMESTAMP $search_py_file got down, now I will restart it" | tee -a $log_file 

1

এই স্ক্রিপ্টটি টার্মিনালে আউটপুট প্রিন্ট করে এবং লগ ফাইলেও সংরক্ষণ করে।

#!/bin/bash

MY_LOG=/var/log/output.log

echolog(){
    if [ $# -eq 0 ]
    then cat - | while read -r message
        do
                echo "$(date +"[%F %T %Z] -") $message" | tee -a $MY_LOG
            done
    else
        echo -n "$(date +'[%F %T %Z]') - " | tee -a $MY_LOG
        echo $* | tee -a $MY_LOG
    fi
}

echolog "My script is starting"
whoami | echolog

নমুনা আউটপুট:

[2017-10-29 19:46:36 UTC] - My script is starting
[2017-10-29 19:46:36 UTC] - root

আপনার প্রথম তারিখের আদেশটি ডাবল উদ্ধৃতি নয়, একক উদ্ধৃতি ব্যবহার করা উচিত।
জেসন হ্যারিসন

1

আরেকটি বিকল্প হ'ল আপনি যখনই আপনার কোডটিতে ডেটা আউটপুট করতে চান প্রতিবার কল করার জন্য একটি ফাংশন সেটআপ করা:

PrintLog(){
  information=$1
  logFile=$2
  echo "$(date +'%Y-%m-%d %H:%M:%S" $information} >> $logFile
}

তারপরে আপনার কোডটিতে প্রতিবার আপনি এটি লগ ফাইল কলে পাঠাতে চান

PrintLog "Stuff you want to add..." ${LogFileVariable}

সহজ কিছু....


0

পাইপ একটি "সেড":

script.sh | sed "s|^|$('date') :: |" >> /var/log/logfile

অন্য উত্তরের হিসাবে এটি একবারে কেবল চলমান তারিখ। সেড প্রতি লাইনে সময় আপডেট করছে না।
ইভান বেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.