
過去n分のログを探しています。いくつかのオプションを試しましたが、特定のタイムスタンプにログが指定されていないと、ほとんど機能しません。
たとえば、
現在時刻であれば正常に動作2019-07-27 09:00:01
し、10分前から現在時刻までのログを探します。ログファイルに行があると機能します2019-07-27 08:50:01
が、このタイムスタンプでログに行がないと何も印刷されません。
for (( i = 10; i >=0; i-- )) ; do grep $(date +%R -d "-$i min") test.log
私もスレッドに提供されているawkオプションを試しました。 過去30分間のログを取得する
ただし、先頭に日付タイムスタンプが含まれていない行は、ログファイルにある限り機能しません。
awk -vStartDate=`date -d'now-30 min' +%H:%M:%S` '{ if ($2 > StartDate) print $0}' test.log
私のログファイルの例の行は次のとおりです。
2019-07-27 01:28:35,8291 DEBUG [TestLogger] - Parameters: [100, IN%]
2019-07-27 01:28:35,8292 ERROR [TestLogger] - Query with error:
SELECT COUNT(*) FROM <table_name>
2019-07-27 01:28:35,8293 ERROR [TestLogger] - 'Connection reset' while executing statement
2019-07-27 01:28:35,8294 WARN [TestReportAction] - Count Error: TestReportAction - 'Connection reset' while executing statement
また、カンマの後に与えられた時間と一致しながら行番号を切り捨てる必要があります,
。
答え1
perl
Perlモジュールもインストールされている場合は、Date::Parse
次のコマンドを使用してこれを実行できます。
perl -MDate::Parse -F, -a -n -e \
'BEGIN { $start=time() - 600 ; $p=0};
if ($p) { print } else {
$logtime = str2time($F[0]);
$p=1 if ($logtime >= $start)}' /path/to/logfile
このPerlシングルライナーは、ログファイルのタイムスタンプと残りのデータとの間のフィールド区切り文字がコンマ()であると仮定し、-F,
Perlの自動分割オプション(-a
)を使用して各入力行を自動的に配列に分割します@F
。
$p変数をトグルとして印刷をオンまたはオフにし、デフォルトはオフ(0)です。 $p がオンの場合は現在の行を印刷し、そうでない場合はDate::Parse
sstr2time()
関数を使用してログエントリのタイムスタンプを time_t 値 (エポックサイン秒、1970-01-01 00:00:00) に変換し、と同じであることを確認してください。タイムスタンプ> =希望の開始時間(600秒、10分前)。その場合は、 $p を on(1) に設定してください。
より複雑な要件がある場合は、単一のコード行で書くよりもスタンドアロンのPerlスクリプトを書く方が良いでしょう。 bashコマンドラインで編集するのは、テキストエディタを使用するよりもPITAです。上記の行を変換することで始めることができます。
#!/usr/bin/perl
use Date::Parse;
$start = time() - 600;
$p = 0;
while (<>) {
if ($p) {
print
} else {
my (@F) = split /,/;
my $logtime = str2time($F[0]);
$p = 1 if ($logtime >= $start);
}
}
たとえば、-600秒にハードコードするのではなく、最初のコマンドライン引数から開始時刻を取得するようにこのスクリプトを変更するのは非常に簡単です。
これはperlで行うことができますが、awk
PerlのDate :: Parseモジュールは優れており、使いやすく、awkで日付解析コードを書くよりもはるかに簡単です。 日付::分析CPANからインストールするのは簡単で、いくつかのLinuxディストリビューション用にパッケージ化できます(libtimedate-perl
debianのパッケージなど)。
同じ基本アルゴリズムをPythonまたは適切な日付解析機能を持つ他の言語で書くこともできます。