로그 파일에서 특정 패턴을 갖는 2개의 날짜를 추출하고 2개의 날짜를 비교합니다.

로그 파일에서 특정 패턴을 갖는 2개의 날짜를 추출하고 2개의 날짜를 비교합니다.

내 연결 풀링 도구에 문제가 있는 것 같습니다. 데이터베이스 연결을 얻는 데 엄청난 지연이 있습니다.
내가 달성하려는 것은 이 이벤트가 발생할 때 로그 파일에서 모든 사례를 가져오는 것입니다.

관련 로그 항목은 다음과 같습니다.

...
2018-03-12 16:18:44,070 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtaining JDBC connection
...
2018-03-12 16:20:23,172 efault task-166 gine.jdbc.internal.LogicalConnectionImpl DEBUG Obtained JDBC connection
...

그렇다면 패턴'DEBUG JDBC 연결 가져오기'발생한 후 날짜를 추출합니다'2018-03-12 16:18:44,070'그리고 언제 모드'DEBUG JDBC 연결 가져오기' 찾아서 날짜를 추출하고 두 날짜를 비교합니다. 차이가 2초를 초과하면 기록합니다.

한 줄의 코드로 이 문제를 해결하는 것이 꽤 복잡하다는 것을 알고 있지만 프로그램을 작성하지 않고도 이 문제를 해결할 수 있습니까?

답변1

이를 처리하기 위해 다음 awk 스크립트를 사용하겠습니다. 스크립트는 "얻음" 및 "얻음" 문자열을 검색합니다. 일반적인 경우는 "얻는" 문자열을 먼저 찾은 다음 "얻은" 문자열을 찾는 것입니다. "얻은" 줄이 먼저 발견되면 해당 줄은 d1설정되지 않거나 0이 되므로 보고되지 않습니다. 그렇지 않으면 날짜의 주요 부분(쉼표 앞)을 추출하여 이를 에포크 이후의 초로 변환하고 밀리초를 다시 추가합니다. 값이 에 저장됩니다 d1.

"얻은" 문자열을 보면 해당 날짜가 동일한 방식으로 계산되고 차이를 확인하여 2초를 초과하면 이를 보고합니다. 어느 쪽이든 재설정하여 d1프로세스를 다시 시작합니다.

다음을 스크립트에 저장하고 원하는 대로 이름을 지정하고( 가 될 수 있음 alert-jdbc.awk) 로 실행합니다 awk -f alert-jdbc.awk < log-file-here.

이 스크립트에서는 임의의 날짜를 변환하려면 GNU 날짜 유틸리티가 필요합니다.

/DEBUG Obtaining JDBC connection/ {
  split($1 " " $2, dates, /,/)
  "date -d \"" dates[1]"\" +%s" | getline seconds
  d1=seconds + dates[2]/1000
}

/DEBUG Obtained JDBC connection/ {
  if (d1) {
    split($1 " " $2, dates, /,/)
    "date -d \"" dates[1]"\" +%s" | getline seconds
    d2=seconds + dates[2]/1000
    if (d2 - d1 > 2) {
        print "More than 2 seconds for: " $0
    }
    d1=0
  }
}

답변2

이 시도:

Delay=$(( 
  ($(date -d "`awk '/DEBUG Obtained JDBC connection/{print $1" "$2}' file.log |
  cut -d ',' -f1 | tail -n1`" +%s)) -
  ($(date -d "`awk '/DEBUG Obtaining JDBC connection/{print $1" "$2}' file.log |
  cut -d ',' -f1 | tail -n1`" +%s)) ))
echo "$Delay Sec"

요구 사항을 충족하는 경우 명령이 해석됩니다.

관련 정보