web-dev-qa-db-ja.com

タイムスタンプをbashスクリプトログに追加する方法

ログファイルに出力するスクリプトを常に実行しています。

script.sh >> /var/log/logfile

ログに追加される各行の前にタイムスタンプを追加したいと思います。お気に入り:

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

使える柔術はありますか?

101
Antonius Bloch

スクリプトの出力を、現在の日付と時刻の前に付けるループを介してパイプできます。

./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
92
Gordon Davisson

Ubuntuのtsを参照してくださいmoreutilsパッケージ:

command | ts

または、$commandが自動バッファリングを行う場合(expect-devパッケージが必要):

unbuffer command | ts
63
Willem

date コマンドはその情報を提供します

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

だからあなたはできる

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

それはあなたが欲しかったことですか?

20
user9517

単純に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]$ 
12
SparX

作る 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

日付で並べ替えるのは簡単です

9
scls

受け入れられた回答 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
6
kdb

あなたは次のような意味です:

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

これを試して

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

すべてのエコーコマンドでこのタイムスタンプ関数を呼び出します。

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

質問に合うようにフォーマットされた短い回答

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回だけだからです。

3
ChuckCottrill

別のオプションは、コードでデータを出力するたびに呼び出す関数を設定することです。

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

次に、コードでログファイル呼び出しに送信するたびに

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

簡単な...

1
Josh Williams

以下は私のログファイルの内容です

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
Jayhello

このスクリプトは出力をターミナルに出力し、ログファイルにも保存します。

#!/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
Seff

「sed」をパイプします。

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