Linuxで2つの日付範囲間のすべてのログ行を取得する方法

Linuxで2つの日付範囲間のすべてのログ行を取得する方法

すべて入手する方法ログ行Linuxの2つの日付範囲の間にありますか?私は次のようないくつかのコマンドを試しました。

1)awk '$0>=from&&$0<=to' from=\"Wed 21 Mar 14:52:08\" to=\"Wed21 Mar 
14:53:08\" /home/db2inst1/logs/tracestart.log 

ただし、正確な日付を含む行のみが提供されます。

2) sed -n '/Wed 21 Mar 14:52:00/,/Wed 21 Mar 14:53:08/p'  
/home/db2inst1/logs/tracestart.log  /home/db2inst1/logs/traceend.log 

これは正しいデータを提供しますが、date(Wed 21 Mar 14:52:00)正確に一致する必要があります。それ以外の場合は、最新の時刻の出力もありません。たとえば、Wed 21 Mar 14:52:01開始時間の場合、出力もありません。

ログファイルのサンプル::

2018-04-04 11:40:46 INFO  RestAssuredService:184 - some thing.......
2018-04-04 11:40:48 INFO  RestAssuredService:199 - some thing.......
2018-04-04 11:40:48 INFO  RestAssuredService:177 -
*********invokeService is 
2018-04-04 11:40:48 INFO  ProductInfoTest:57 - Response Map::::: 
{RESPONSE_TYPE=application/json, EXPECTED_RESPONSE={
"products": [
    {
        "id": 23001,
        "type": "SHIRT",
        "description": "Mens Wear Dresses",
        "price": 850,
        "brand": "PETER_ENGLAND"
    },
    {
        "id": 23002,
        "type": "KURTI",
        "description": "Womens Wear Dresses",
        "price": 899,
        "brand": "ALLEND_SOLEY"
    }
] }, 
ACTUAL_RESPONSE=com.jayway.restassured.internal.RestAssuredResponseImpl@7d48651a}
2018-04-04 11:40:48 INFO  ProductValidator:47 - EXPECTED_RESPONSE:::: {
"products": [
    {
        "id": 23001,
        "type": "SHIRT",
        "description": "Mens Wear Dresses",
        "price": 850,
        "brand": "PETER_ENGLAND"
    },
    {
        "id": 23002,
        "type": "KURTI",
        "description": "Womens Wear Dresses",
        "price": 899,
        "brand": "ALLEND_SOLEY"
    }
] }
2018-04-04 11:40:48 ERROR ProductInfoTest:65 - Exception occured::: null
2018-04-04 11:40:48 INFO  ProductInfoStepDefinations:27 - addProductDetailsApiTest Starting::::
2018-04-04 11:40:48 INFO  ProductInfoTest:53 - getAllProductsInfo starting
2018-04-04 11:40:48 INFO  RestAssuredService:170 -
*********invokeService is starting*********
2018-04-04 11:40:48 INFO  RestAssuredService:247 - Final uri:::::: rest/market/item/info
2018-04-04 11:40:48 INFO  RestAssuredService:258 - HeaderParametersMap :::::: {Accept=application/json, Content-Type=application/json

答え1

システムで systemd を使用している場合は、journalctlログ出力の時間と日付範囲を選択できます。

からman journalctl

-S、--since=、-U、--until=指定された日付または更新日、または指定された日付または指定された日付より前の項目の表示を開始します。日付指定は「2012-10-30 18:17:16」の形式でなければなりません。時間部分を省略すると、「00:00:00」とみなされます。秒部分だけを省略すると、「:00」とみなされます。日付部分を省略すると、現在の日付と見なされます。あるいは、文字列「昨日」、「今日」、および「明日」は、それぞれ前日、今日、今日のモーレ00:00:00を表すと理解される。 「今」は現在時刻を意味します。最後に、現在の時刻の前または後の時刻をそれぞれ参照するために、「-」または「+」プレフィックスが付いた相対時間を指定できます。完全な時間と日付の仕様については、systemd.time(7)を参照してください。 --output=short-full は、この形式に正確に従うタイムスタンプを出力します。

これを--userオプションといくつかのオプションと組み合わせてgrepシステムメッセージをフィルタリングして混乱を軽減します。システムが systemd を使用しない場合、またはプログラム・メッセージがジャーナリングによってキャプチャーされない場合は、別のものが必要になる場合があります。

答え2

単純な「時間」環境(タイムゾーン変換なし、夏時間変更なし)を想定すると、awkに日付範囲がエポック以降の秒単位であることを知らせ、次にawkに各日付をエポック以降の秒数に変換して印刷させることができます。その範囲の行のみ:

awk -v from=$(date -d "2018-04-04 11:40:45" +%s) \
    -v   to=$(date -d "2018-04-04 11:40:47" +%s) \
 '{ "date -d \""$1 " "$2"\" +%s" | getline s; 
    if (from <= s && s <= to) print;
  }' < input
2018-04-04 11:40:46 INFO  RestAssuredService:184 - some thing.......

すべての行が必要なため、特に効率的ではありませんdate。これが問題になると、クエリをキャッシュするように改善できます。

答え3

Javaアプリケーションのログファイルによく使用されるもう1つの方法は、タイムスタンプが最初に表示される行番号を見つけることです。

FROM_DATE="Wed 21 Mar 14:52:08"
TO_DATE=""Wed 21 Mar 14:53:08"

FROM_LINE=$(grep -n -m 1 ${FROM_DATE} ${FILE} | cut -d ":" -f 1)
TO_LINE=$(grep -n -m 1 ${TO_DATE} ${FILE} | cut -d ":" -f 1)

その後、間に情報を提供します。

tail -n "${FROM_LINE}" ${FILE} | head -n $(expr $TO_LINE - $FROM_LINE)

または経由

sed -n -e "${FROM_LINE},${TO_LINE} p" -e "${TO_LINE} q" ${FILE}

これにより、スタックトレース、REST APIコンテンツ、JSON構造などがキャプチャされます。

Hadoopフレームワークなどの一部のアプリケーションでは、ログファイルを処理するための特定のスクリプトがあります。 Jeffが述べた方法は、date2つのイベント間の時間を計算するために使用されます。

より多くの情報を知りたい場合(および参照):

関連情報