現在時刻から過去15分の間のログを抽出する方法

現在時刻から過去15分の間のログを抽出する方法

現在のタイムスタンプから15分前のログを抽出して、設定された人に電子メールを送信したいと思います。次のスクリプトを開発しましたが、うまくいきません。誰でも助けることができますか? ?次のパターンを含むログファイルがあります。

[2016-05-24T00:58:04.508-04:00] [oim_server1] [TRACE:32] [] [oracle.iam.scheduler.impl.quartz] [tid: OIMQuartzScheduler_QuartzSchedulerThread] [userId: oiminternal] [ecid: 0000LI6NBsP4yk4LzUS4yW1NBABd000003,1:21904] [APP: oim#11.1.2.0.0] [SRC_CLASS: oracle.iam.scheduler.impl.quartz.QuartzJob] [SRC_METHOD: <init>] Constructor  QuartzJob
[2016-05-24T00:58:04.508-04:00] [oim_server1] [TRACE:32] [] [oracle.iam.scheduler.impl.quartz] [tid: OIMQuartzScheduler_QuartzSchedulerThread] [userId: oiminternal] [ecid: 0000LI6NBsP4yk4LzUS4yW1NBABd000003,1:21904] [APP: oim#11.1.2.0.0] [SRC_CLASS: oracle.iam.scheduler.impl.quartz.QuartzJob] [SRC_METHOD: <init>] Constructor  QuartzJob
[2016-05-24T00:58:04.513-04:00] [oim_server1] [TRACE:32] [] [oracle.iam.scheduler.impl.quartz] [tid: OIMQuartzScheduler_Worker-1] [userId: oiminternal] [ecid: 0000LI6NBsP4yk4LzUS4yW1NBABd000003,1:21908] [APP: oim#11.1.2.0.0] [SRC_CLASS: oracle.iam.scheduler.impl.quartz.QuartzTriggerListener] [SRC_METHOD: triggerFired] Trigger state 0
[2016-05-24T00:58:04.515-04:00] [oim_server1] [TRACE:32] [] [oracle.iam.scheduler.impl.quartz] [tid: OIMQuartzScheduler_Worker-1] [userId: oiminternal] [ecid: 0000LI6NBsP4yk4LzUS4yW1NBABd000003,1:21908] [APP: oim#11.1.2.0.0] [SRC_CLASS: oracle.iam.scheduler.impl.quartz.QuartzTriggerListener] [SRC_METHOD: triggerFired] Trigger state 0
[2016-05-24T00:58:04.516-04:00] [oim_server1] [TRACE:32] [] [oracle.iam.scheduler.impl.quartz] [tid: OIMQuartzScheduler_Worker-1] [userId: oiminternal] [ecid: 0000LI6NBsP4yk4LzUS4yW1NBABd000003,1:21908] [APP: oim#11.1.2.0.0] [SRC_CLASS: oracle.iam.scheduler.impl.quartz.QuartzTriggerListener] [SRC_METHOD: triggerFired] Trigger Listener QuartzTriggerListener.triggerFired(Trigger trigger, JobExecutionContext ctx)
[2016-05-24T01:00:04.513-04:00] [oim_server1] [WARNING] [] [oracle.iam.scheduler.vo] [tid: OIMQuartzScheduler_Worker-7] [userId: oiminternal] [ecid: 0000LI6NBsP4yk4LzUS4yW1NBABd000003,1:21956] [APP: oim#11.1.2.0.0] IAM-1020021 Unable to execute job : CmyAccess Flat File WD Candidate with Job History Id:1336814[[
org.identityconnectors.framework.common.exceptions.ConfigurationException: Directory does not contain normal files to read HR-76
    at org.identityconnectors.flatfile.utils.FlatFileUtil.assertValidFilesinDir(FlatFileUtil.java:230)
    at org.identityconnectors.flatfile.utils.FlatFileUtil.getDir(FlatFileUtil.java:176)
    at org.identityconnectors.flatfile.utils.FlatFileUtil.getFlatFileDir(FlatFileUtil.java:182)
    at org.identityconnectors.flatfile.FlatFileConnector.executeQuery(FlatFileConnector.java:134)
    at org.identityconnectors.flatfile.FlatFileConnector.executeQuery(FlatFileConnector.java:58)
    at org.identityconnectors.framework.impl.api.local.operations.SearchImpl.rawSearch(SearchImpl.java:105)
    at org.identityconnectors.framework.impl.api.local.operations.SearchImpl.search(SearchImpl.java:82)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.identityconnectors.framework.impl.api.local.operations.ConnectorAPIOperationRunnerProxy.invoke(ConnectorAPIOperationRunnerProxy.java:93)
    at com.sun.proxy.$Proxy735.search(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.identityconnectors.framework.impl.api.local.operations.ThreadClassLoaderManagerProxy.invoke(ThreadClassLoaderManagerProxy.java:107)
    at com.sun.proxy.$Proxy735.search(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.identityconnectors.framework.impl.api.BufferedResultsProxy$BufferedResultsHandler.run(BufferedResultsProxy.java:162)

私が書いたスクリプトは見つかったエラーを計算し、それを数字でファイルに保存します。エラー数が増えると、スクリプトを実行してメールを送信します。これを行うにはcronを設定できますが、私が書いたスクリプトは機能しません。現在時刻と過去15分の間のログを抽出し、一時ファイルを生成するのに役立ちますか?


LogDir=/data/app/Oracle/Middleware/user_projects/domains/oim_domain/servers/oim_server1/logs
[email protected]
SUBJECT=Failed
MESSAGE="Scheduler failed"
SMTP="SMTPHOSTNAME"
[email protected]



   NOW=$(date +"%FT%T.000%-04:00")
T2=$(date --date='15 minutes ago' +"%FT%T.000%-04:00")
OUT=/tmp/oim_server1-diagnostic_$(date +%F-%H-%M).log


find $LogDir -mmin -15 -name "oim_server1-diagnostic.log" > files.txt

count=0;
if [ -f lastCount ]; then
 count=$(cat lastCount)
fi


while read file
do
  echo "reading file \n " $file
  currentCount=$(grep -c 'Directory does not contain normal files to read HR-76' $file)
  if [  $currentCount -ne $count  -a  $currentCount -ne 0  ];then
    echo "Error Found " $currentCount
    awk -v TSTART="[$T2]" -v TEND="[$NOW]" '$1>=TSTART && $1<=TEND' $LogDir/oim_server1-diagnostic.log > "$OUT"
    test -s $OUT &&
      echo -e "$MESSAGE" | mailx -S smtp="$SMTP" -a "$OUT" -r "$SENDER" -s "$SUBJECT" "$EMAIL1"
    rm -f "$OUT"
  fi
  echo $currentCount > lastCount
done < files.txt

スクリプトはログを抽出していますが、正しい形式ではありません。私が見つけた最大のログ

(grep -c 'Directory does not contain normal files to read HR-76' $file)

2つのタイムスタンプ間のすべてのログを抽出したいと思います。一部の行にはタイムスタンプがない場合がありますが、その行も必要です。つまり、2つのタイムスタンプに属するすべての行が必要です。このスクリプトはタイムスタンプのみのログファイルを提供し、残りの行には提案がありません。 ? ?開始タイムスタンプまたは終了タイムスタンプがログ内のすべての行に表示されない可能性がありますが、これら2つのタイムスタンプ間のすべての行が必要です。上記のログの生成例:::

[2016-05-24T01:00:04.513-04:00] [oim_server1] [WARNING] [] [oracle.iam.scheduler.vo] [tid: OIMQuartzScheduler_Worker-6] [userId: oiminternal] [ecid: 0000LIt5i3n4yk4LzU^AyW1NEPxf000002,1:23444] [APP: oim#11.1.2.0.0] IAM-1020021 Unable to execute job : CmyAccess Flat File WD Employee with Job History Id:46608[[   

答え1

私は次を使うでしょう:

awk -v limit="$(date -d '15 minutes ago' +'[%FT%T')" '
  $0 >= limit' < log-file

これは、GMTオフセットが-04:00から-05:00に変わった場合(夏時間がその時間帯に適用される場合)、年間2時間で発生する可能性のある問題を無視します。

date -dこれはGNUに固有のものですが、すでに使用しています。

答え2

あなたはほとんどそれを持っています。

ステップ1

他のシステムの中で、GNUとLinuxでこのdateコマンドを使用すると、ユーザーフレンドリーな時間表現を提供する任意の形式の時間仕様を印刷できます。たとえば、次を使用して、過去15分の時間を表す文字列を取得できます。

 date --date='15 minutes ago'

あまり効率的ではありませんが、コードでこれをほぼ完了しました。しかし、あなたはマイクロ秒を無視しています。おそらく実際には気にしないかもしれませんが、一致させる必要があります。タイムゾーンは '%:z' を使用して実行できますが、おそらく既存のタイムゾーンと一致する必要があります。夏時間が切り替えられた直後に問題が発生する可能性があります。複数の時間帯を心配する必要がある場合は、正規表現またはSobriqueのソリューションが必要です。注意すべき点は次のとおりです。

NOW=$(date +"%FT%T.000%-04:00")
T2=$(date --date='15 minutes ago' +"%FT%T.000%-04:00")

ステップ2

NOWとT2を入力として使用できますawk。文字列ベースのマッチングはここでうまく機能しますが、awkを使用すると、文字列比較を超えるか下回って実行して、各行が目的の時間範囲内に収まるようにすることができます。

awk -v TSTART="[$T2]" -v TEND="[$NOW]" '$1>=TSTART && $1<=TEND'

3段階(新規)

タイムスタンプのある行の間にタイムスタンプのないログ行を取得する必要があります。したがって、上記のawkコードを使用してタイムスタンプ行を一致させ、タイムスタンプが正しい範囲内にあるときにフラグを設定します。このフラグが1に設定されている場合にのみ、現在の行が印刷されます。

awk -v TSTART="[$T2]" -v TEND="[$NOW]" \
'/^\[[^ ]*\] / { log = ($1>=TSTART && $1<=TEND) } log { print }' 

ステップ4

通常どおりに出力をリダイレクトしますが、15分ごとにスクリプトを実行すると、現在のリダイレクトコードが同じファイルを上書きします。なぜなら、%Hは少なくとも3回の実行で変更されないからです。 %H-%Mなどで作成することをお勧めします。ただし、ファイルへのリダイレクトはまったく必要ありません。添付ファイルが必ず必要な場合を除き、メールで直接送信できます。

{  
   echo "$MESSAGE"; echo
   awk -v TSTART="[$T2]" -v TEND="[$NOW]" '$1>=TSTART && $1<=TEND' $LogDir/oim_server1-diagnostic.log    
} | mailx -S smtp="$SMTP" -r "$SENDER" -s "$SUBJECT" "$EMAIL1"

スクリプトの残りの部分はそのまま機能する必要があります。

ただし、上記の設定では、関連する日付タイムスタンプで簡単に保存できる添付ファイルを取得できなくなりました。出力がない場合は、メールを送信したくない場合があります。だからあなたはこれを行うことができます:

OUT=/tmp/oim_server1-diagnostic_$(date +%F-%H-%M)
awk -v TSTART="[$T2]" -v TEND="[$NOW]" '$1>=TSTART && $1<=TEND' $LogDir/oim_server1-diagnostic.log > "$OUT"
test -s $OUT && 
echo -e "$MESSAGE" | mailx -S smtp="$SMTP" -a "$OUT" -r "$SENDER" -s "$SUBJECT" "$EMAIL1"
rm -f "$OUT"

これにより、大容量診断ログファイルが残らないように自動的にクリーンアップされます。

答え3

正規表現は実際に数値を「理解する」ことができないため、タイムスタンプの一致には適していません。したがって、タイムスタンプを解析することをお勧めします。

#!/usr/bin/env perl
use strict;
use warnings;

use Time::Piece; 

my $now = time();
my $last = $now - 15 * 60; 

while ( <> ) { 
   my ( $timecode ) = m/\[([^\.]+)/;
   print $timecode;
   my $t = Time::Piece -> strptime ( $timecode, '%Y-%m-%dT%H:%M:%S' );  
   print if $t > $last;
}

これは単に次のように表現できます。

perl -MTime::Piece -ne 'print if Time::Piece -> strptime ( m/\[([^\.]+)/, '%Y-%m-%dT%H:%M:%S' ) > time()  - 15 * 60'

答え4

このコマンドを試してください。私にとって効果的でした。

sed -n "/$(date --date="15 minutes ago" +%T)/,/$(date +%T)/p" logfile > newfile

date --date="15 minutes ago" "+%T"15分前だった

date "+%T"今時間です

たとえば、上記のように、“+%T”このシステム時間は(%H:%M:%S)形式で表示されます。このコマンドを実行すると、1:15:10現在実行中のタイムスタンプである1:15:10より15分前のログが取得されます。1:01:10

関連情報