티스토리 뷰

Proframe 가이드 상으로는 일반배치 작성시 하나의 배치모듈에 하나의 일반배치서버를 사용하도록 가이드 한다.

하지만 배치 모듈이 만개가 넘어가는 상황에서 각 모듈마다 일반배치서버를 생성하면 너무 큰 리소스 낭비이기 때문에

많은 프로젝트에서 하나의 일반배치 서버에서 여러 배치 모듈을 호출하는 방식을 채택하고 있다.

이 경우에 문제점 중 하나는 모든 배치모듈들의 로그가 하나의 로그파일에 생성되기 때문에 수천개의 로그가 뒤죽박죽 섞일 수 있다.

이를 해결하기 위해 스튜디오에서 일반배치서버 소스를 자동 생성하지 않고 약간의 커스터마이징을 추가하여 직접 서버를 만들어야 한다.



다음 소스는 Proframe 스튜디오 상에서 일반배치서버를 생성할 경우 자동 생성되는 서버 소스의 pfmBatchInit method 안에서 호출하고있는 로그 출력 관련 api 이다.

rc = pfmInitializeBatch( argc, argv, DATABASE_NON_XA_MODE, GENERAL_BATCH_TYPE, __FILE__ , NULL , NULL );


위 api는 __FILE__ + _bat_날짜 의 형식으로 로그를 남긴다.
예를들어 서버이름이 GENBATCH01이고 오늘 날짜가 20180427 이면 배치로그는 GENBATCH01_bat_20180427.log 이런식으로 생성된다. 
해당 서버에서 하나의 배치모듈을 호출하도록 디자인 되어있기때문에 이런식으로 되어있는데
만약 천개의 배치모듈을 위 배치서버에서 호출할 경우 천개 배치모듈의 각각의 로그가 모두 GENBATCH01_bat_20180427.log 안에 생성되기 때문에 로그 분석이 굉장히 어려워진다.

위 이슈를 해결하기 위한 방안으로 로그를 서버 이름이 아닌 각각의 배치모듈의 BATCH code 로 로그를 생성하게 하는 방법이 있다.
이를 위해서는 배치를 호출하는 shell 파일에 export PFM_BACH_CODE = "배치코드" 를 추가하고
서버소스의 main 함수에서 getenv("PFM_BATCH_CODE") 를 통해 BATCH가 실행될때마다 해당 BATCH CODE를 받아서 변수에 담고
pfmBatchInit method 에 전해주고 다음과 같이 로그 생성 함수 부분에 __FILE__ 대신 해당 변수를 넣어준다.

long
pfmBatchInit(int argc, char **argv, char *batcode )
{
    long rc = RC_NRM;
    ...

    rc = pfmInitializeBatch( argc, argv, DATABASE_NON_XA_MODE, GENERAL_BATCH_TYPE, batcode , NULL , NULL ); // 일반 로그 출력
    
    ...
    ...
}



댓글