커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 시스템 관리 / 서버운영 도움말
검색 : 사이트 WHOIS 웹서버 종류

최적화 / 튜닝 / 성능개선 (6, 글 1, 자료 3)
디스크 쿼터(quota) (3, 글 1, 자료 3)
디스크 관리 / 파일시스템 / mount (34, 글 13, 자료 12)
백업(backup) / 시스템 복구 (14, 글 6, 자료 11)
서버운영 (8, 글 2, 자료 9)
프린터 관리 / 프린팅 (7)
패키지 관리 / 패치 / rpm (10, 글 5, 자료 1)
부팅, boot / LILO / GRUB (10, 글 5, 자료 9)
서버 모니터링 (10, 글 5, 자료 2)
로그인 / 로그아웃 (1)
로그(log) / syslog (5, 글 3, 자료 3)
메모리, 스왑(swap), 램디스크(ramdisk) (3, 글 2)
사용자 관리(계정 관리) (1, 자료 1)

  로그 모니터링시 특정 문자를 highlight하기 작성일 : 2008/01/07 18:50
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 16917
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 : 로그 모니터링시 특정 문자를 highlight하기
    작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2007.10.30(화)
    정리일 : 2008.1.6(일)

    apache 웹로그, php 에러로그, syslog를 통한 로그를 모니터링할 때 특정 문자열에 대해서는 highlight해주면 원하는 부분만 쉽게 볼 수 있을 것이다. 또한 수치를 모니터링하는 경우, 0~59는 양호, 60~79 주의, 80~99는 경고를 나타내기위해 각각 녹색, 파란색, 빨간색으로 표시해준다면, 많은 로그가 순간적으로 스크롤되더라도 눈에 쉽게 띌 것이다.
    이 글은 highlight 처리를 해주는 1) sed를 이용한 쉘스크립트와 2) 이보다 더 나은 perl 스크립트를 통해 모니터링하는 방법을 설명한다.

    1. sed를 이용한 highlight 스크립트

    * view.sh 내려받기
     
    #!/bin/bash
    #
    # 특정 문자를 highlight한다. (view.sh)
    #
    # by 좋은진호(truefeel, http://coffeenix.net/ )

    # color
    szColBk="^[[;30m";      szColBk1="^[[1;30m"     # black
    szColRe="^[[;31m";      szColRe1="^[[1;31m"     # red
    szColGr="^[[;32m";      szColGr1="^[[1;32m"     # green
    szColYe="^[[;33m";      szColYe1="^[[1;33m"     # yellow
    szColBl="^[[;34m";      szColBl1="^[[1;34m"     # blue
    szColPu="^[[;35m";      szColPu1="^[[1;35m"     # magenta(purple)
    szColCy="^[[;36m";      szColCy1="^[[1;36m"     # cyan
    szColGy="^[[;37m";      szColWh="^[[1;37m"      # white
    szNormal="^[[;m"

    #
    sed \
            -e "s/^[A-Z][a-z][a-z] *[0-9]* //g" \
            \
            -e "s/ \(192.168.123.[0-9]*\)/${szColGr} \\1$szNormal/g" \
            \
            -e "s/\(httpd\)/${szColCy}\\1$szNormal/g" \
            -e "s/\(vsftpd\)/${szColCy}\\1$szNormal/g" \
            -e "s/\(proftpd\)/${szColCy}\\1$szNormal/g" \
            -e "s/\(ftpd\)/${szColCy}\\1$szNormal/g" \
            -e "s/\(sshd\)/${szColCy}\\1$szNormal/g" \
            -e "s/\(xinetd\)/${szColCy}\\1$szNormal/g" \
            -e "s/\(Connection attempt\)/${szColRe1}\\1$szNormal/g" \
            -e "s/\(authentication failure\)/${szColRe1}\\1$szNormal/g" \
            -e "s/\(BAD SU\)/${szColRe1}\\1$szNormal/g" \
            \
            -e "s/\(nfs server\)/${szColYe}\\1/g" \
            \
            -e "s/$/$szNormal/g"
     


    사용은 tail -f 로그파일명 |./view.sh 형태로 사용하면 된다.

    첫번째 부분은 색깔을 정의한 변수이다. 여기서 ^[[;31m ANSI코드로, ^[ 문자는 ESC키를 의미한다. 쉘에서 입력할 때 Ctrl+V를 누른 후 ESC키를 누르면 입력할 수 있다. 색깔은 사용하는 터미널에 따라서 약간 다르게 표시될 수도 있다.



    그 다음부터는 sed를 이용해서 문자열을 변환처리하며, 한줄당 하나의 정규표현식을 사용하였다. 부분적으로 살펴보자.

     
    1:     -e "s/^[A-Z][a-z][a-z] *[0-9]* //g" \
     


    기본적으로 -e s/변환전문자열/변환후문자열/g 형식을 사용하는데, 위는 syslog를 통해 남은 로그중 'Oct 30'과 같이 '월일'을 표시하지 않기 위한 정규표현식이다.

     
    1:     -e "s/ \(192.168.123.[0-9]*\)/${szColGr} \\1$szNormal/g" \
    2:     \
    3:     -e "s/\(httpd\)/${szColCy}\\1$szNormal/g" \
    4:     -e "s/\(vsftpd\)/${szColCy}\\1$szNormal/g" \
     


    첫번째줄은 특정 IP대역을 highlight하기 위한 것으로 서버의 IP, 접속하는 PC의 IP등을 한줄에 하나씩 적어주면 좋을 것이다. 두번째줄의 \ 은 보기 좋게 구분하기 위한 것이며, 세번째와 네번째줄은 각각 httpd와 vsftpd를 highlight한다.

     
    1:     -e "s/\(nfs server\)/${szColYe}\\1/g" \
    2:     \
    3:     -e "s/$/$szNormal/g"
     


    첫번째줄은 'nfs server'로 문자열이 나온다면, 해당 줄 끝까지 highlight한다. ${szColYe}\\1과 server과 ${szColYe}\\1$szNormal 의 차이를 생각하면 쉽게 이해가 될 것이다. 세번째줄은 줄의 끝부분에서 색깔 표시는 정상으로 돌려놓으라는 의미이다.

    2. perl을 이용한 highlight 스크립트

    위의 예제를 통해서 원하는 문자열을 원하는 색깔로 highlight하는 것은 쉽게 할 수 있을 것이다. 이젠 perl이용한 방법을 소개한다.

    * view.pl 내려받기
     
    #!/usr/bin/perl
    #
    # 특정 문자를 highlight한다. (view.pl)
    #
    # by 좋은진호(truefeel, http://coffeenix.net/ )

    # color
    $szColBk ="^[[;30m";    $szColBk1 ="^[[1;30m";  # black
    $szColRe ="^[[;31m";    $szColRe1 ="^[[1;31m";  # red
    $szColGr ="^[[;32m";    $szColGr1 ="^[[1;32m";  # green
    $szColYe ="^[[;33m";    $szColYe1 ="^[[1;33m";  # yellow
    $szColBl ="^[[;34m";    $szColBl1 ="^[[1;34m";  # blue
    $szColPu ="^[[;35m";    $szColPu1 ="^[[1;35m";  # magenta(purple)
    $szColCy ="^[[;36m";    $szColCy1 ="^[[1;36m";  # cyan
    $szColGy ="^[[;37m";    $szColWh  ="^[[1;37m";  # white
    $szNormal="^[[;m";

    #
    $szBeep="\a";

    #
    while(<STDIN>) {
       # log에서 필요없는 부분 삭제
            s/^[A-Z][a-z][a-z] *[0-9]* //g;

       # IP
            s/(192\.168\.123\.[1-9][0-9]{0,2})/$szColGr$1$szNormal/g;

       # 줄 끝은 정상 색으로 변경
       s/$/$szNormal/;

       # 원하는 문자열에 색을 입힌다
            s/(httpd)/$szColCy$1$szNormal/g;
            s/(vsftpd|proftpd|ftpd)/$szColCy$1$szNormal/g;
            s/(sshd)/$szColCy$1$szNormal/g;
            s/(xinetd)/$szColCy$1$szNormal/g;
            s/(Connection attempt)/$szColRe1$1$szNormal/g;
            s/(authentication failure)/$szColRe1$1$szNormal/g;
            s/(BAD SU)/$szColRe1$1$szNormal/g;

       # 원하는 문자열을 찾으면 줄 끝까지 색을 읽힌다.
            s/(nfs server)/$szColYe$1/g;

       print $_;
    }
     


    사용은 shell스크립트를 사용할 때와 동일하게 tail -f 로그파일명 |./view.pl 형태로 사용하면 된다.

     
    1:     s/(192\.168\.123\.[1-9][0-9]{0,2})/$szColGr$1$szNormal/g;
    2:     ... 생략...
    3:     s/(vsftpd|proftpd|ftpd)/$szColCy$1$szNormal/g;
     


    첫번째줄에서 192\.168\.123\.[1-9][0-9]{0,2} 은 sed를 이용할 때보다 더 정교하게 IP를 체크한 것으로, 1) 192.168.123. 시작하는 IP대역 2) 그 다음 1~9까지 숫자이고, 그다음에 숫자가 오게된다면 0~9까지 숫자가 0자리~2자리까지 가능하다. 정규 표현식에 대한 자세한 사항은 이 글의 주제를 벗어나는 내용이므로 '4 참고 자료'를 살펴보기 바란다. 세번째줄은 vsftpd, proftpd, ftpd 등의 문자를 highlight한다.

    다음은 위의 스크립트를 이용하여 로그를 모니터링한 화면이다.


    3. 수치에 따라 다른 색으로 표시

    어떤 로그에 수치가 다음과 같이 실시간으로 쌓인다고 가정하자. 그리고, 그 수치는 'disk 54'와 같은 형태로 되어 있다.

    ---------  ------   --------
    측정수치    상태     색깔
    ---------  ------   --------
    0~59       양호      녹  색
    60~79      주의      파란색
    80~100     경고      빨간색
    ---------  ------   --------

    다음은 perl을 이용하여 색을 표시하는 예이다. 그리고, 수치가 80이상일 땐 beep음을 발생한다. 이런한 방법은 서버의 load, disk 사용량, disk I/O, 커넥션 수, 메모리 사용량 등을 모니터링할 때 유용하게 사용할 수 있다.

     
    s/(disk [0-9][^0-9])/$szColGr$1$szNormal/;
    s/(disk [1-5][0-9][^0-9])/$szColGr$1$szNormal/;
    s/(disk [6-7][0-9])/$szColBl$1$szNormal/;
    s/(disk [8-9][0-9])/$szColRe1$1$szNormal$szBeep/;
    s/(disk 100)/$szColRe1$1$szNormal$szBeep/;
     


    4. 참고 자료

    * ANSI color codes
      http://pueblo.sourceforge.net/doc/manual/ansi_color_codes.html
    * 정규표현식
      http://coffeenix.net/dir_catagory.php?cata_code=99
    * Perl regular expressions
      http://www.perl.com/doc/manual/html/pod/perlre.html
      커피닉스 카페 최근 글
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
    [05/16] (주)후이즈 시스템엔지니어 (경력자) 모집
    [02/15] [AWS] Cloudfront edge 확인하기
    [01/20] Mobile Service/eCommerce 기업에서 Server / Java / PHP 개발자 구인
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Mobile 개발자를 모십니다.
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Web Front 개발자를 모십니다.
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~