고용량의 텍스트 파일(25기가가 넘는 로그파일)을 보려니 일전에 올렸던 LTF 역시 답답해서 파일 분할, 검색 하기로 했다.

사실 결국 컴퓨터 사양이 좋으면, 로그를 꼭 필요한 것만 출력해서 용량차지가 적도록, 혹은 애초에 로그를 분석할 필요가 없는 코드를 짰다면 이런 일이 발생하지 않는데 아무튼 상황을 이지경으로 만든 사람은 누군지도 이 자리에 있지도 않으니 이런 잡 기술만 늘어가는 중이다.

PowerShell은 Linux 명령어랑은 많이 다르고 뭔가 맘에 안듦...

형식

$i=0; Get-Content 원본파일경로 + 파일명 -ReadCount 분할할_라인_수 | %{ $i++; $_ | Out-File 출력경로_파일명-$i.log; Write-Host $i }

 

$i=0; Get-Content .\WAS-29-20220325.log -ReadCount 1000 | %{ $i++; $_ | Out-File D:\cat_log\WAS-29\20220325-$i.log; Write-Host $i }
728x90
반응형

리눅스나 MacOS 는 tail 함수가 내장 되어 있기 때문에 서버의 로그를 실시간으로 보는 법은 간단하다.

Window의 경우는 cmd 상에서 명령어가 있긴 하지만, 버젼에 따라 없거나, 옵션 값도 달라지고 cli의 ux가 좋지 않기 때문에 차라리 써드파티 어플리케이션을 사용하는 게 낫다.

mtail 이라는 프로그램인데, 설치는 필요 없고, 아래 링크에서 다운로드 후 압축을 풀고 실행, 대상 파일을 불러와 주기만 하면 된다.

 

프로그램 다운로드 -> http://ophilipp.free.fr/op_tail.htm

728x90
반응형

linux에서 log 통계 내는 명령어

Linux 서버에서 서버를 운영하다 보면, 시간대별 유입 건수, 특정 ip의 접속 건수, http 에러가 몇 건인지 파악하기 위해 access 로그를 이용하여 접속 통계가 필요한 경우가 있다.

 

ip별 접속 건수 확인

cat 파일_이름 | awk '{print $1}' | sort | uniq -c | sort -n

awk '{print $1}'은 각 라인에서 첫번째 값(IP)을 의미 한다.
uniq -c는 해당 라인이 몇번 나오는지를 카운트 한다.

만약 line 수가 많아 일정 횟수 이상만 확인하고 싶다면, `| awk '$1 >= 500' 조건을 추가해 준다.

 

시간대별 접속 건수 확인

cat 파일_이름 | awk '{print $4}' | awk -F ":" '{print $2}' | uniq -c

awk '{print $4}'는 각 라인의 4번째 필드인 시간을 추출한 뒤,
추출한 필드를 다시 ":"를 구분자로 2번째 필드(시간)을 추출하여 그 카운트를 센다.

 

HTTP 결과 코드별 접속 건수 구하기

cat 파일_이름 | awk '{print $9}' | sort | uniq -c

awk '{print $9}' 9번째 필드인 http 결과 코드를 추출하여 정렬 후, 그 카운트를 센다.

 

완성 예제 스크립트 파일

  _date=`date "+%Y-%m-%d"`
  tgt=localhost_access_log.$_date.txt

  echo -e "\nTARGET FILE : $tgt\n"

  echo -e ":: COUNT OF ACCESS IP ::"
  cat $tgt | awk '{print $1}' | sort | uniq -c | sort -n | awk '$1 >= 500'

  echo -e "\n:: COUNT OF ACCESSER BY HOUR ::"
  cat $tgt | awk '{print $4}' | awk -F ":" '{print $2}' | uniq -c

  echo -e "\n:: COUNT OF HTTP STATUS CODE ::"
  cat $tgt | awk '{print $9}' | sort | uniq -c

  echo -e "\n\n"

 

이를 3일치를 뽑으면 다음과 같다.

  SET=$(seq 0 3)

  function dateLogPrinter() {
    local _date=$1

    echo -e "\n----- DATE : $_date -----"

    echo -e ":: COUNT OF ACCESS IP ::"
    cat localhost_access_log.$_date.txt | awk '{print $1}' | sort | uniq -c | sort -n | awk '$1 >= 500'

    echo -e "\n:: COUNT OF ACCESSER BY HOUR ::"
    cat localhost_access_log.$_date.txt | awk '{print $4}' | awk -F ":" '{print $2}' | uniq -c

    echo -e "\n:: COUNT OF HTTP STATUS CODE ::"
    cat localhost_access_log.$_date.txt | awk '{print $9}' | sort | uniq -c

    echo -e "\n\n"

  }


  for i in $SET
  do
    dateLogPrinter `date -d "-$i days" "+%Y-%m-%d"`
  done

기타

특정 기간 지난 로그 파일 찾아 지우기.

find -name '*.out' -mtime +200 | xargs rm
out으로 끝나는 파일중 200일이 지난 파일을 찾아 지운다.

  

압축된 로그파일 출력하기

catzcat 으로 바꿔서 위와 같은 명령을 수행하면 됨.

 


참고

728x90
반응형
728x90
반응형

+ Recent posts