두 개의 로그 파일이 생성될 때 정렬하는 좋은 방법은 무엇입니까?

두 개의 로그 파일이 생성될 때 정렬하는 좋은 방법은 무엇입니까?

로그 파일을 출력하는 두 개의 스크립트를 실행하고 있습니다. 이러한 로그를 타임스탬프별로 정렬하고 생성 시 단일 파일로 병합하는 세 번째 스크립트를 만들고 싶습니다. 파일을 지속적으로 덮어쓰지 않고 이 작업을 수행할 수 있는 좋은 방법이 있습니까?

답변1

2개 이상의 파일을 tail 하는 경우 tail -f명령은 데이터를 한 줄씩 표시하고 데이터 소스가 변경될 때마다 파일 이름을 출력합니다. 이 기능을 사용하면 다른 파일에서 이후 타임스탬프가 있는 줄을 볼 때까지 각 줄을 유지하여 타임스탬프를 기반으로 테일에서 인터리브된 출력을 병합하는 스크립트를 작성할 수 있습니다.

예를 들어 내 시스템에서 동일한 줄 시작 타임스탬프 형식(예: )을 갖는 두 개의 표준 로그 파일( /var/log/messages및 )을 사용하면 다음을 수행할 수 있습니다./var/log/cronJun 9 02:55:01

tail -f /var/log/messages /var/log/cron |
awk '
BEGIN { num[0] = 0; num[1] = 0; }
/^==> /{
  file = $2; aa = file~/messages/?0:1; bb = 1-aa; 
  aanum = num[aa]; bbnum = num[bb];
  next }
/^$/{ next }
{ "date --date \"" $1 " " $2 " " $3 "\" +%s" | getline date
  lines[aa,aanum] = $0
  dates[aa,aanum++] = date
  maxes[aa] = date
  minmax = maxes[aa]
  if(maxes[bb]<minmax)minmax = maxes[bb]

  i = 0; j = 0;
  while(1){
    aaok = (i<aanum && dates[aa,i]<=minmax)
    bbok = (j<bbnum && dates[bb,j]<=minmax)
    if(aaok && bbok){
      if(dates[aa,i]<=dates[bb,j]){
           print lines[aa,i]; dates[aa,i++] = ""
      }else{
           print lines[bb,j]; dates[bb,j++] = ""
      }
    }else if(aaok){
           print lines[aa,i]; dates[aa,i++] = ""
    }else if(bbok){
           print lines[bb,j]; dates[bb,j++] = ""
    }else break
  }
  i = 0
  for(j = 0; j<aanum;j++)
    if(dates[aa,j]!=""){
      dates[aa,i] = dates[aa,j]; lines[aa,i++] = lines[aa,j]
    }
  aanum = num[aa] = i
  i = 0
  for(j = 0; j<bbnum;j++)
    if(dates[bb,j]!=""){
      dates[bb,i] = dates[bb,j]; lines[bb,i++] = lines[bb,j]
    }
  bbnum = num[bb] = i
}'

awk는 파일의 시작 부분이 끝 부분에서 시작되는 것을 확인하면 두 파일 사이를 전환합니다 ==>. 각 파일마다 하나씩 4개의 배열에 데이터를 저장하며 임의로 호출되고 aa0 bb과 1로 번호가 지정됩니다. dates에포크 이후 초 단위의 타임스탬프를 저장하고, lines입력 로그 줄을 저장하고, num줄 수와 maxes가장 높은 날짜를 파일에 저장합니다. 처음 2개의 배열은 파일(0 또는 1) 및 예약된 행 수를 기준으로 2차원적으로 인덱싱됩니다.

각 로그 줄을 읽으면 타임스탬프가 초로 변환되어 끝에 새 항목에 저장되고 dates해당 줄도 저장됩니다. 두 현재 날짜 중 최소값은 에 설정됩니다 minmax. 이 최소값에 도달할 때까지 저장된 전체 데이터를 타임스탬프 순서로 스캔하고 인쇄합니다. 인쇄된 항목이 지워지고 while 루프가 끝나면 배열이 압축되어 지워진 항목을 제거합니다.

답변2

로그 파일의 타임스탬프 소스가 동일하고 각 로그는 로그 항목이 생성될 때 시간순으로 기록되며 타임스탬프에 따라 다음과 같이 간단하게 작업을 수행할 수 있습니다.

tail -qF log1 log2 > summarylog

이러한 가정이 귀하의 상황에 맞지 않으면 질문을 업데이트하여 설명과 예를 제공하십시오.

관련 정보