...
마크베이스 collector는 로그 데이터를 수집하고, 분석하고 마크베이스 서버에 전송한다. 데이터 수집, 분석 기능 외에 추가 데이터 처리를 위해, 마크베이스 collector는 python을 이용한 데이터 전처리 frameworkd를 제공한다.
Collector Preprocessing Framework
Preprocessing을 위한 환경변수 설정
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값 사이에 추가해야 한다.
...
It describes the order of preprocessing during the process of log conversion. To explain how it works, the same concept is borrowed from the User-defined Log Collection along with the diagram.
메시지 Preprocessing
원본 로그 데이터 파일에 데이터가 입력되면 각 로그 데이터는 로그 unit단위로 분리된다. 이 분리된 데이터를 origin_msg로 명명한다. 각 origin_msg는 한번에 하나씩 위에 표시된 프로세스를 진행한다. 예를 들어 입력된 첫번째 메시지는 "Aug 19 15:37:12 localhost NetworkManager[1340]: (eth1): bringing up device." 라고 하면,
입력된 origin_msg는 정규 표현식에 의해 토큰으로 분리된다. 이를 메시지 파싱이라고 한다. 메시지 파싱 이전에 origin_msg를 선처리 할 수 있다. 만약 origin_msg를 선처리 스크립트를 이용하여 변경한다면, 변경된 메시지가 파싱될 수 있도록 주의하여야 한다.
Column Preprocessing
로그 메시지를 파싱한 이후, 결과 토큰값들이 생성된다. 아무런 처리과정이 없다면 이 값이 데이터베이스에 저장된다. 파싱된 토큰들을 데이터베이스에 전달하기 전에 두번째 단계의 선처리 과정을 실행할 수 있다. 이때 rgx파일에 기술된 필드명을 이용하여 변경하거나 이를 이용할 수 있다. rgx파일에 기술된 데이터형과 다른 타입으로 토큰을 변경하면 에러가 발생할 수 있다.
자세한 내용은 샘플 스크립트를 참조하라.
Preprocessing Script
선처리 스크립트는 Python으로 작성하여야 한다. 쉽게 사용하려면 "custom.py"파일을 원하는 형태로 변경하는 것을 추천한다.
Code Block | ||
---|---|---|
| ||
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 |
Definition of Return Value
선처리 스크립트의 실행 결과를 collector에 전달하기 위해서 리턴값을 이용한다. collector가 선처리 스크립트를 실행한 이후에 참조하는 결과값은 (code, message)의 튜플 타입이다.
...
데이터 처리의 제어를 위해서는 PRS_SUCCESS, PRS_SUCESS_SKIP을 이용하고, 메시지를 trc에 남기기 위해서는 PRS_SUCCESS_INFO난 PRS_FAILURE를 이용하면 된다.
Class Definition
마크베이스 collector는 python언어로 작성된 사전 정의된 클래스의 함수를 호출하여 선처리를 수행한다. 아래의 예제를 보면 클래스의 각 함수와 "dict" 매개변수와 러턴값에 대해서 알 수 있다. 클래스 명이나 함수 이름을 바꾸면 실행되지 않는다. 따라서 작성시 유의하여야 한다.
...
데이터 선처리에 호출되는 메서드는 "mach_msg_preprocess"와 "mach_column_preprocess"이다. 각 메서드의 설명은 아래와 같다.
mach_msg_preprocess
이 메서드는 입력 메시지가 토큰으로 분리되기 전에 호출된다. 메시지를 파싱하기 전에 실행되므로, 전달되는 값은 콜렉터 관련 메타 데이터와 원본 메시지인 "origin_msg"이다. 콜렉터 메타 데이터는 테이블명, 콜렉터 타입, 현재 실행중인 콜렉터의 이름과 옵셋이다. 이 정보들은 참조 정보로 제공되어 변경하더라도 콜렉터에 반영되지는 않는다. "origin_msg"는 변경되면 콜렉터에 변경사항이 반영된다. rgx파일에 설정된 정규표현식을 통과하지 못하도록 메시지를 변경하면, 이후 파싱 과정에서 오류가 발생할 수 있다.
...
필요없는 메시지는 SUCCESS_SKIP을 리턴함으로써 이후 파싱 과정을 생략하여 처리를 빠르게 할 수 있다. 필요없는 메시지를 이 단계에서 파악할 수 있다면 먼저 SUCCESS_SKIP으로 처리하는 것이 좋다.
mach_column_preprocess
이 메서드는 입력 메시지를 파싱한 이후 토큰으로 분해된 값을 데이터베이스에 입력하기 전에 호출된다. "mach_msg_preprocess"와 같이 전달된 메타데이터는 콜렉터에 반영되지 않는다.
...
Key | Value | Changes applied or not |
---|---|---|
table_name | Name of table | X |
collect_type | Types of data collection | X |
collect_name | Name of currently operationg collector | X |
data_source | Path of data collection | X |
origin_msg | Log of raw data | X |
column_name | nth of column tokens | O |
Sample Script
기본으로 제공되는 샘플은 syslog파일에 대한 것이며 $MACH_COLLECTOR_HOME/collector 디렉토리에 있다. 샘플 탬플릿인 syslog.tpl에서 선처리를 수행하는 방법을 살펴보자.
...
파싱과정을 실행하지 않은 "mach_msg_preprocess" 메서드에서 "origin_msg"매개변수에 "CMD" 문자열이 있는지 검사하여 있다면 그 메시지를 스킵하도록 설정한 예제이다. "if __name__ == "__main__"이후의 소스라인은 스크립트가 정상적으로 동작하는지 테스트하기 위해서 작성한 코드이다. 관련 내용은 Script Test 부분을 참고하라.
REPLACE
파싱을 거친 이후에 msg 칼럼에 "CRON"이라는 문자열이 있는 경우, 그것을 "cron-exectue"문자열로 변환하는 예제이다. 이 또한 $MACH_COLLECTOR_HOME/collector/preprocess/ 디렉토리의 replace.py 파일을 tpl 파일에서 다음과 같이 지정하면 실행된다.
...
입력된 원본 베시지는 파싱 과정을 거쳐 토큰으로 분리된다. 이 토큰은 mach_column_ preprocess메서드에서 처리할 있다. 위의 예제는 "CRON"문자열을 "cron-execute"로 변환하는 예제이다. "if name == "__main__"이하의 코드는 스크립트 실행을 디버깅하기 위한 것이다.
TRACE
TRACE 스크립트는 입력 데이터를 "mach_msg_preprocess" 및 "mach_column_preprocess"메서드에서 파일에 기록하는 것이다. PREPROCESS_PATH=trace.py를 tpl 파일에 추가하고, 해당 스크립트 파일을 $MACH_COLLECTOR_HOME/collector/preprocess 디렉토리에 작성해 두면 동작한다.
...
if __name__ == "__main__" 이하의 코드는 스크립트가 정상적으로 동작하는지를 테스트하는 코드이다.
ODBC
아래의 ODBC 스크립트는 검색 키를 데이터베이스에서 검색하여 검색 키가 입력 메시지에 존재한다면, 그 값을 지정된 테이블에 입력하는 예제이다.
...
위 ODBC샘플에서 사용할 pypyodbc 모듈을 지정된 환경변수에서 로딩할 수 있다.
Preprocessing Script Test
새로운 스크립트를 작성한 이후, 스크립트가 정확히 동작하는지 확인해야 한다. 스크립트 테스트를 위한 방법으로, 직접 실행 방법과 간접 실행 방법이 있다. 직접 실행 방법은 스크립트가 테스트를 직접 실행하는 것이며 간접실행방법은 그 스크립트를 임포트하여 테스트 하는 것이다.
Direct Execution
샘플 선처리 스크립트 하단에 추가되어 있는 테스트 코드들은 preprocessing 클래스 객체들 직접 호출하여 결과를 확인한다. 아래 예제는 skip.py 스크립트의 테스트 코드이다.
...
테스트 코드의 실행 과정을 살펴보면 먼저 mach_process() 함수의 호출로 프리프로세스 객체인 pre_obj를 생성한다. 이 때, __init__메서드가 호출된다. mach_msg_preprocess에 전달되는 매개변수인 dict를 설정한 후, 메서드를 호출하여 테스트를 수행한다. dict 값을 개발자가 설정해야 하지만, 실제 스크립트에 전달되는 값을 알기 어려운 경우, "trace.py" 스크립트를 이용하여 메서드에 전달되는 값을 얻어서 테스트 할 수 있다. trace.py 스크립트가 생성하는 데이터는 /tmp/msg.log 및 /tmp/column.log에 기록된다.
Indirect Execution
이미 생성한 선처리 스크립트를 import를 통해서 읽어들여서 실행하는 방법이다.
...