Versions Compared

Key

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

...

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

Collector 전처리 프레임워크

...

전처리를 위한 환경변수 설정

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

...

전처리 순서

로그 데이터를 변환 및 조작하기 위한 preprocessor 실행 순서를 기술한다.

메시지

...

전처리

원본 로그 데이터 파일에 데이터가 입력되면 각 로그 데이터는 로그 단위들로 분리된다. 가령 로그 데이터를 origin_msg라고 하자. 각 origin_msg는 한번에 한 단계씩 처리 과정을 거친다. 예를 들어 입력된 첫번째 메시지가 "Aug 19 15:37:12 localhost NetworkManager[1340]: (eth1): bringing up device." 라고 하면, 입력된 origin_msg는 정규 표현식에 의해 토큰들로 분리된다. 이를 메시지 파싱이라고 한다. 메시지 파싱 이전에 origin_msg를 전처리 할 수 있다. 전처리 스크립트를 이용해 origin_msg를 변경하는 경우에는 변경된 결과 메시지가 파싱 가능한 메시지여야 한다.

...

컬럼 전처리

로그 메시지를 파싱한 이후, 결과 토큰값들이 생성된다. 아무런 처리 과정이 없다면 이 값이 데이터베이스에 저장된다. 파싱된 토큰들을 데이터베이스에 전달하기 전에 두번째 단계의 전처리 과정을 실행할 수 있다. 이때 rgx파일에 기술된 필드명을 이용하여 변경하거나 이를 이용할 수 있다. rgx파일에 기술된 데이터형과 다른 타입으로 토큰을 변경하면 에러가 발생할 수 있다.

자세한 내용은 샘플 예제 스크립트를 참조하라.

...

전처리 스크립트

전처리 스크립트는 Python으로 작성하여야 한다. 쉽게 사용하려면 "custom.py"파일을 원하는 형태로 변경하는 것을 추천한다.

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):
        return PRS_SUCCESS;
    def __del__(self):
        return

...


결과값 정의

전처리 스크립트의 실행 결과를 collector에 전달하기 위해서 리턴값을 이용한다. collector가 전처리 스크립트를 실행한 이후에 참조하는 결과값은 (code, message)의 튜플 타입이다.

...

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

...

클래스 정의

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

...

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

...

예제 스크립트

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

...

파싱을 거친 이후에 msg 칼럼에 "CRON"이라는 문자열이 있는 경우, 그것을 "cron-exectue"문자열로 변환하는 예제이다. 이 또한 $MACH_COLLECTOR_HOME/collector/preprocess/ 디렉토리의 replace.py 파일을 tpl 파일에서 다음과 같이 지정하면 실행된다. 

Code Block
titlesample.tpl
PREPROCESS_PATH=replace.py


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

...

Code Block
export USER_PREPROCESS_LIB_PATH=$MACH_COLLECTOR_HOME/webadmin/flask/Python/lib/python2.7/site-packages/pypyodbc-1.3.3-py2.7.egg

ODBC샘플에서 ODBC예제에서 사용할 pypyodbc 모듈을 지정된 환경변수에서 로딩할 수 있다. 

...

전처리 스크립트 테스트

새로운 스크립트를 작성한 이후, 스크립트가 정확히 동작하는지 확인해야 한다. 스크립트 테스트를 위한 방법으로, 직접 실행 방법과 간접 실행 방법이 있다. 직접 실행 방법은 스크립트가 테스트를 직접 실행하는 것이며 간접실행방법은 그 스크립트를 임포트하여 테스트 하는 것이다.

...

직접 실행

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

...

테스트 코드의 실행 과정을 살펴보면 먼저 mach_process() 함수의 호출로 프리프로세스 객체인 pre_obj를 생성한다. 이 때, __init__메서드가 호출된다. mach_msg_preprocess에 전달되는 매개변수인 dict를 설정한 후, 메서드를 호출하여 테스트를 수행한다. dict 값을 개발자가 설정해야 하지만, 실제 스크립트에 전달되는 값을 알기 어려운 경우, "trace.py" 스크립트를 이용하여 메서드에 전달되는 값을 얻어서 테스트 할 수 있다. trace.py 스크립트가 생성하는 데이터는 /tmp/msg.log 및 /tmp/column.log에 기록된다.

...

호출 실행

이미 생성한 전처리 스크립트를 import를 통해서 읽어들여서 실행하는 방법이다.

...