티스토리 뷰

프로프레임 환경하에서 프로젝트를 수행하다가 보면 그 방대한 티맥스 로그를 보면서 개발하는 것이 쉬운 일이 아니다. 티맥스와 같은 미들웨어는 서비스를 하나의 서버로 묶어서 로그를 생성시키는데 서버의 로그를 보면 다른 서비스의 로그도 같이 섞여 있기 때문에 단순히 vi로 열어서 보거나  tail 로 걸어서 보는 것도 한계가 있다.

로그파일에서 내가 마지막으로 수행한 서비스의 로그만 골라내어서 볼 수 있다면 얼마나 개발에 도움이 될 것인가? 내가 몸담고 있는 H은행 프로젝트의 예를 들어서 쉘을 작성해 보고 각자의 프로젝트에 환경에 맞도록 응용하여 자신의 쉘을 만들어 사용한다면 즐거운(?) 코딩을 할 수 있지 않을까 생각해 본다.

1. 서버명을 구한다.

H은행 프로젝트에서는 서비스명을 넣으면 소속되어 있는 서버명을 알려주는 쉘이 제공되고 있다. 개발환경의 경우 tmshow[각주:1] 라는 쉘을 이용하여 다음과 같이 서버명을 알아볼 수 있다.

[svd01@e9812978]tmshow -s SFEE9999A
repeat count : 1

   -----------------------------------------------------------------------------------------------
   svc_name                           svr_name    count  cq_cnt  aq_cnt   q_avg    avg   status
   -----------------------------------------------------------------------------------------------
   SFEE9999A                          TX9812978       0       0       0   0.000   0.000  RDY

2.. 글로벌 id를 구한다.

로그에서 특정한 서비스 거래의 로그만 발췌하기 위해서는 글로벌 id를 구해내야 한다.  H은행 프로젝트의 로그를 보면 22 컬럼부터 32 바이트가 글로벌 id에 해당된다.

(P) AP :140112180233:200901100100Y0811401084100000401:2122294 [SFEE1105A      :pfmOpprExternal:pfmCo

내가 거래한 것인지 다른 사람이 거래한 것인지를 식별하기 위하여 로그 속에서 사번으로 찾아낸다.  이것이 가능한 것은 H은행프로젝트의 pfmIpprExternal~.c 에서 직원번호를 로그에 찍어 주고 있기 때문에 가능했다.

EMPNO=`whoami | awk '{ print substr($1, 2, length($1)) }'`
DATE=`date +%Y%m%d`
LOGFILE=${SVR_NAME}_usr_${DATE}.log
tail -n 300000  $PFM_USR_LOG_DIR/$LOGFILE  | grep $EMPNO | grep " emp_no "  | grep IpprEx > ~/tmp

수행결과는 다음과 같다. (그림을 마우스로 클릭하여 확대해서 보세요) 로그파일 중에 나의 직원번호가 들어있고, emp_no 라는 문자와 IpprEx 라는 문자가 들어 있는 라인만 걸러내어졌다. 이 정도면 거래별로 한 라인 정도 밖에 해당되지 않게 된다.


이 grep한 결과가 홈디렉토리 아래의 tmp 라는 파일로 저장이 된다.  다시 이 파일 속에서 마지막 한 줄을 골라내어서 글로벌id를 추출해 낼 수 있다.  마지막 줄이 내가 수행한 거래의 마지막 로그이기 때문이다. 여기서 tail -n 300000 이라고 한것은 파일의 마지막 30만 라인 속에서 찾아내는 것으로 시스템의 성능에 따라 이 라인 수는 적절히 선택하면 될 것이다.

LASTLINE=`tail -1 ~/tmp`
GLOB_ID=`echo $LASTLINE |awk '{print substr($3,15,32)}'`

여기서 awk 뒤에 $3 을 준것은 마지막 라인이 그대로 awk 의 입력으로 들어갈 때 스페이스로 분리된 것이 하나의 argument로 인식되기 때문에 글로벌id가 있는 단어는 3번째 argument 가 되기 때문이다.  다시 말하면 마지막 라인  (P) AP :140112180233:200901100100Y0811401084100000401:2122294 에서 (P) 가 첫번째, AP 가 두번째 :140112180233:200901100100Y0811401084100000401:2122294 가 세번째 argument이므로 $3 으로 지정한 것이다.

글로벌id가 추출이 되었다면 이제 이 글로벌id를 이용해서 로그파일에서 추출해 내면 순수한 내가 수행한 마지막 거래의 로그만 추출되어 나오게 된다.

결국 최종 완성된 쉘은 다음과 같다.

#!/usr/bin/ksh

input_check() {
    if [ $# -lt 1 ]; then
        usage
    fi
}

usage() {
    echo "\nUsage : grepsmlog 서비스명 "
    echo ""
    exit 1
}

input_check $@

SVC_NAME=`echo $1 | tr '[a-z]' '[A-Z]'`

#개발서버인 경우 tmshow 쉘로 서버명을 구하고 테스트서버는 reglist 명령으로 구하기 때문
HOSTNM=`hostname`
if [ "cbssvd01" = $HOSTNM ]; then
    REGLIST=`tmshow -s  $SVC_NAME | grep $SVC_NAME`
    SVR_NAME=`echo $REGLIST |awk '{print substr($2,1,40)}'`
else
    REGLIST=`reglist $SVC_NAME | grep SVR | grep GRP`
    SVR_NAME=`echo $REGLIST |awk '{print substr($9,1,40)}'`
fi

EMPNO=`whoami | awk '{ print substr($1, 2, length($1)) }'`
DATE=`date +%Y%m%d`
LOGFILE=${SVR_NAME}_usr_${DATE}.log
echo "LOGFILE = ${LOGFILE}"

tail -n 300000  $PFM_USR_LOG_DIR/$LOGFILE  | grep $EMPNO | grep " emp_no "  | grep IpprEx > ~/tmp
LASTLINE=`tail -1 ~/tmp`
GLOB_ID=`echo $LASTLINE |awk '{print substr($3,15,32)}'`
echo "GLOB_ID = ${GLOB_ID}"
touch ~/tmp
tail -n 300000  $PFM_USR_LOG_DIR/$LOGFILE  | grep $GLOB_ID  > ~/tmp

if [ $# -eq 2 ]; then
    cat ~/tmp | egrep "$2|Hana" | cut -c 9-14,79-300
else
    cat ~/tmp | cut -c 9-14,79-300
fi

홈디렉토리에 생성된 tmp 파일을 이용하여 자기가 원하는 모양대로 출력하는 것은 개인의 취향일 것이다. 나 같은 경우 불필요한 몇몇 컬럼을 cut 명령을 이용하여 잘라 내어 버리고 필요한 부분만 보도록 적용해 보았다.

<2009년1월10일>


  1. 간단하게 작성할 수 있다. 결국 echo st | tmadmin | grep $1 [본문으로]
댓글
댓글쓰기 폼