Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

마크베이스 collector는 로그 데이터를 수집하고, 분석하고 마크베이스 서버에 전송한다.  데이터 수집, 분석 기능 외에 추가 데이터 처리를 위해, 마크베이스 collector는 python을 이용한 데이터 전처리 frameworkd를 프레임워크를 제공한다.

Collector Preprocessing Framework

...

Preprocessing framework으로 python 2.6 버전을 사용한다. 이 버전의 python은 마크베이스 서버와 같이 설치된 것을 사용하는 것을 추천한다. 설치된 python은 $MACH_COLLECTOR_HOME/webadmin/flask/Python/bin 경로에 있다. Python 라이브러리 추가 설치를 위한 python 실행도 위 디렉토리에서 실행해야 기존에 설치되어 있는 다른 버전의 python과 충돌을 방지할 수 있다. 마크베이스 collector와 같이 제공된 python을 기본으로 사용하려면 path환경변수를 정확히 설정하고, USER_PROCESS_LIB_PATH를 설정하여야 한다. USER_PROCESS_LIB_PATH에 추가 경로를 등록하려면, ":"문자를 path값의 분리를 위해서 path값 사이에 추가해야 한다.

Preprocessing 순서

Log 데이터를 변환 및 조작하기 위한 preprocessor 실행 순서를 기술한다. User-defined log 수집에서 사용된 것과 동일한 diagram을 이용하여 설명한다.

...

원본 로그 데이터 파일에 데이터가 입력되면 각 로그 데이터는 로그 unit단위로 분리된다. 이 분리된 데이터를 origin_msg로 명명한다. 각 origin_msg는 한번에 하나씩 위에 표시된 프로세스를 진행한다.  예를 들어 입력된 첫번째 메시지는  "Aug 19 15:37:12 localhost NetworkManager[1340]: (eth1): bringing up device." 라고 하면, 입력된  입력된 origin_msg는 정규 표현식에 의해 토큰으로 분리된다. 이를 메시지 파싱이라고 한다. 메시지 파싱 이전에 origin_msg를 선처리 할 수 있다. 만약 origin_msg를 선처리 스크립트를 이용하여 변경한다면, 변경된 메시지가 파싱될 수 있도록 주의하여야 한다.

...

PRS_SUCCESS, PRS_SUCCESS_INFO, PRS_SUCCESS_SKIP, PRS_FAILURE는 collector가 참조하는 결과값이다. 리턴값이 PRS_SUCCESS인 경우에는 collector는 정상적으로 데이터를 입력한다. 리턴값이 PRS_SUCCSS_INFO인 경우에는 데이터를 정상적으로 처리하고 전달된 메시지를 trc 파일에 기록한다. PRS_SUCCESS_SKIP인 경우에는 해당 데이터를 버리고 , 새로운 데이터 처리를 시작하고, PRS_FAILURE인 경우에는 에러 메시지를 trc 파일에 기록하고 다음 메시지를 처리한다.

데이터 처리의 제어를 위해서는 PRS_SUCCESS, PRS_SUCESSSUCCESS_SKIP을 이용하고, 메시지를 trc에 남기기 위해서는 PRS_SUCCESS_INFO난 INFO나 PRS_FAILURE를 이용하면 된다.

Class Definition

마크베이스 collector는 python언어로 작성된 사전 정의된 클래스의 함수를 호출하여 선처리를 수행한다. 아래의 예제를 보면 클래스의 각 함수와 "dict" 매개변수와 러턴값에 리턴값에 대해서 알 수 있다. 클래스 명이나 함수 이름을 바꾸면 실행되지 않는다. 따라서 작성시 유의하여야 한다.

...

Code Block
languagepy
class mach_preprocess:
    def __init__(self):
        return
    def mach_msg_preprocess(self, dict):
        return PRS_SUCCESS;
    def mach_column_preprocess(self, dict):
        return PRS_SUCCESS;
    def __del__(self):
        return

사전 정의된 클래스명은 "mach_preporcesspreprocess"이다. 매개변수는 메소드를 메서드를 호출할 때 "self" 인스턴스로 전달된다. __init__과 __del__은 python언어의 기본 객체 생성자/제거자이다. 따라서 __init__은 collector의 프로세스가 생성될 때 호출되고, __del__은 collector가 종료될 때 호출된다. __init__에서 변수들을 초기화하고, __del__에서 할당한 자원을 해제할 수 있다. 이 두 메서드는 리턴값이 없다.

...

KeyValueChanges applied or not
table_nameName of tableX
collect_typeTypes of data collectionX
collector_nameName of currently operating collectorX
data_sourcePath of data collectionX
origin_msgLog of raw dataO

필요없는 메시지는 PRS_SUCCESS_SKIP을 리턴함으로써 이후 파싱 과정을 생략하여 처리를 빠르게 할 수 있다. 필요없는 메시지를 이 단계에서 파악할 수 있다면 먼저 PRS_SUCCESS_SKIP으로 처리하는 것이 좋다.

...

KeyValueChanges applied or not
table_nameName of tableX
collect_typeTypes of data collectionX
collect_nameName of currently operationg operating collectorX
data_sourcePath of data collectionX
origin_msgLog of raw dataX
column_namenth of column tokensO

...

기본으로 제공되는 샘플은 syslog파일에 대한 것이며 $MACH_COLLECTOR_HOME/collector 디렉토리에 있다. 샘플 탬플릿인 템플릿인 syslog.tpl에서 선처리를 수행하는 방법을 살펴보자.

...

선처리 스크립트 파일의 위치를 지정하기 위해서,  PREPROCESS_PATH를 tpl 파일에 설정한다. 경로명은 절대 경로 (/로 시작되는 경로)를 지정하거나 $MACH_COLLECTOR_HOME/collector/preprocess의 기본 경로(파일명만 지정한 경우)가 된다.

SKIP

입력 메시지를 검사하여 특정한 단어가 있는 경우에 이를 입력하지 않는 스크립트이다. 컬렉터 탬플릿 템플릿 파일에 PREPROCESS_PATH=skip.py를 설정하면 된다. 경로명을 지정하지 않았으므로,  $MACH_COLLECTOR_HOME/collector/preprocess/디렉토리에 그 파일을 작성해야 한다.

...

Code Block
languagepy
PRS_SUCCESS       = ( 0, None )
PRS_SUCCESS_INFO  = ( 1, "Info Msg" )
PRS_SUCCESS_SKIP  = ( 2, None )
PRS_FAILURE       = (-1, "Error Msg" )

class mach_preprocess:
    def __init__(self):
        return
    def mach_msg_preprocess(self, dict):
        return PRS_SUCCESS;
    def mach_column_preprocess(self, dict):
        dict['msg'] = dict['msg'].replace("CRON", "cron-execute") <== Replace sentence
        return PRS_SUCCESS;
    def __del__(self):
        return

#Test code
if __name__ == "__main__":
    pre_obj = mach_preprocess()
    dict = {"tm":"Jul 16 07:39:01", "host":"mach-Precision-T1700", "msg":"CRON[1377]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && 
[ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime))"}
    (code, msg) = pre_obj.mach_column_preprocess(dict);
    if code >= 0:
        print dict
    else:
        print msg

입력된 원본 베시지는 메시지는 파싱 과정을 거쳐 토큰으로 분리된다. 이 토큰은 mach_column_ preprocess메서드에서 처리할 있다. 위의 예제는 "CRON"문자열을 "cron-execute"로 변환하는 예제이다. "if name == "__main__"이하의 코드는 스크립트 실행을 디버깅하기 위한 것이다.

...

이 예제를 동작시키는 방법은 PREPROCESS_PATH값을 탬플릿 템플릿 파일에 지정하는 것으로 기존과 동일하다.

이 예제에서 pypyodbc가 사용되었다. 컬렉터 스크립트에서 ODBC를 사용하려면 pypyodbc를 사용하여야 한다.

...

샘플 선처리 스크립트 하단에 추가되어 있는 테스트 코드들은 preprocessing 클래스 객체들 객체를 직접 호출하여 결과를 확인한다. 아래 예제는 skip.py 스크립트의 테스트 코드이다.

...