현재 시간부터 지난 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)

두 타임스탬프 사이의 모든 로그를 추출하고 싶습니다. 일부 행에는 타임스탬프가 없을 수도 있지만 해당 행도 필요합니다. 즉, 두 개의 타임스탬프에 속하는 모든 행을 원합니다. 이 스크립트는 타임스탬프만 있는 로그 파일을 제공하며 나머지 모든 줄에는 제안 사항이 누락되어 있습니다. ? ? 시작 타임스탬프 또는 종료 타임스탬프가 로그의 모든 행에 표시되지 않을 수도 있지만 이 두 타임스탬프 사이의 모든 행을 원합니다. 위 로그의 생성 예:::

[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

관련 정보