ログファイルに出力するスクリプトを常に実行しています。
script.sh >> /var/log/logfile
ログに追加される各行の前にタイムスタンプを追加したいと思います。お気に入り:
Sat Sep 10 21:33:06 UTC 2011 The server has booted up. Hmmph.
使える柔術はありますか?
スクリプトの出力を、現在の日付と時刻の前に付けるループを介してパイプできます。
./script.sh | while IFS= read -r line; do printf '%s %s\n' "$(date)" "$line"; done >>/var/log/logfile
これを頻繁に使用する場合、ループを処理するbash関数を作成するのは簡単です。
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
Ubuntuのts
を参照してくださいmoreutils
パッケージ:
command | ts
または、$command
が自動バッファリングを行う場合(expect-dev
パッケージが必要):
unbuffer command | ts
date コマンドはその情報を提供します
date -u
Sat Sep 10 22:39:24 UTC 2011
だからあなたはできる
echo $(date -u) "Some message or other"
それはあなたが欲しかったことですか?
単純にechoコマンドをログファイルに出力できます。つまり、
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]$
作る 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
日付で並べ替えるのは簡単です
受け入れられた回答 https://serverfault.com/a/310104 多数の行を処理する必要がある場合、date
プロセスを開始するオーバーヘッドが伴うため、少し遅くなる可能性がありますUbuntuでは1秒あたり約50行、Cygwinでは約10〜20行しか許可されていません。
bash
を想定できる場合、より高速な代替策は、%(...)T
書式指定子を含むprintf
組み込み関数です。比較する
>> 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
あなたは次のような意味です:
(date && script.sh) >> /var/log/logfile
これを試して
timestamp()
{
date +"%Y-%m-%d %T"
}
すべてのエコーコマンドでこのタイムスタンプ関数を呼び出します。
echo "$(timestamp): write your log here" >> /var/log/<logfile>.log
script.sh | gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }' >> /var/log/logfile
awk
は高速に動作しますand Unixパイプフィルターとして機能しますand単独で日付を出力します。
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) /"
date
(ちなみに遅い)が呼び出されるのは1回だけだからです。
別のオプションは、コードでデータを出力するたびに呼び出す関数を設定することです。
PrintLog(){
information=$1
logFile=$2
echo "$(date +'%Y-%m-%d %H:%M:%S" $information} >> $logFile
}
次に、コードでログファイル呼び出しに送信するたびに
PrintLog "Stuff you want to add..." ${LogFileVariable}
簡単な...
以下は私のログファイルの内容です
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
このスクリプトは出力をターミナルに出力し、ログファイルにも保存します。
#!/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
「sed」をパイプします。
script.sh | sed "s|^|$('date') :: |" >> /var/log/logfile