지난 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
s str2time()
함수를 사용하여 로그 항목의 타임스탬프를 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이나 적절한 날짜 구문 분석 기능을 갖춘 다른 언어로 작성할 수도 있습니다.