현재 타임스탬프부터 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