현재 애플리케이션의 성능을 분석하고 있습니다. 먼저 애플리케이션에서 생성된 로그를 검토하고 실행하는 데 허용 가능한 것보다 오래 걸리는 비즈니스 로직 작업을 식별합니다.
로그 파일의 일부는 다음과 같습니다.
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
내 요구 사항은 각 작업을 실행하는 데 소요된 총 시간을 찾는 것입니다. 예를 들어 xmlRecord 35165의 작업 2에 소요된 시간 = xmlRecord 35165의 작업 2의 종료 시간 - xmlRecord 35165의 작업 1의 종료 시간입니다.
그래서 다음과 같이 동일한 xmlRecord ID를 가진 모든 로그 문을 그룹화하는 방법을 원합니다.
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
위에 표시된 대로 모든 로그 문을 그룹화할 수 있으면 Task2에서 xmlRecord 35165를 처리하는 데 17분이 걸렸다는 것을 빠르게 알 수 있습니다.
여기에 표시된 로그는 내 애플리케이션에서 인쇄된 정확한 로그가 아니라 단지 예일 뿐입니다. 특정 XML ID에 대한 로그가 항상 차례로 표시되도록 모든 로그 문을 그룹화할 수 있기를 원합니다.
나는 껍질에 약간 녹슬었고 누군가가 바퀴를 재발명하는 데 시간을 낭비하지 않도록 이미 이 작업을 수행하는 라이너나 스크립트를 알려줄 수 있다면 감사하겠습니다.
답변1
초보자로서 열을 기준으로 정렬해 보는 것은 어떨까요 xmlRecord Id
? :-
sort -k 9 -o <out.log> <in.log>
번호순으로 그룹화해야 합니다. 그것도 정렬하고 싶다면 스크립트나 그와 유사한 것이 Task
포함될 수 있습니다 .awk
어떻게 작동하나요?
이 sort
명령은 다양한 방법으로 데이터를 정렬할 수 있습니다. 이 경우에는 열 9의 값을 기준으로 정렬합니다. 달리 명시하지 않는 한 표준 영숫자 정렬을 사용합니다.
.... -k 9 ....
예제의 다른 매개변수는 사용할 입력 파일(로그 파일)과 결과를 -o <out.log>
.
답변2
전체 파일을 로드할 만큼 메모리가 충분하다면 다음을 시도해 보세요.
$ perl -ane '
push @h, [$F[1],(split(/:/,$F[8]))[1],$_];
END {
print map { $_->[2] }
sort { $b->[1] <=> $a->[1]
||
$a->[0] cmp $b->[0]
}
@h;
}
' file
2014-07-02 18:03:20,269 INFO [ROOT] - Task1. xmlRecord Id :35165 processed
2014-07-02 18:20:20,269 INFO [ROOT] - Task2. xmlRecord Id :35165 processed
2014-07-02 18:15:20,269 INFO [ROOT] - Task1. xmlRecord Id :35164 processed
2014-07-02 18:05:20,269 INFO [ROOT] - Task1. xmlRecord Id :35162 processed
설명하다
@h
파일을 처리할 때 각 요소가 배열 참조인 배열을 만듭니다 . 각 배열 참조에는 세 가지 요소가 포함됩니다.- 시간은 로그 파일에 나타납니다.
18:03:20,269
- XML 레코드 ID
- 전체 로그 항목
- 시간은 로그 파일에 나타납니다.
마지막으로 다음 조건으로 결과를 인쇄합니다.
- XML 레코드 ID를 기준으로 먼저 정렬하거나
$b->[1] <=> $a->[1]
그 반대로 정렬 - ID가 동일하면 로그에 나타나는 시간에 따라 비교합니다.
$a->[0] cmp $b->[0]
- XML 레코드 ID를 기준으로 먼저 정렬하거나