[Python] 문자열 파싱 라이브러리 - Pygrok 설치 및 사용 방법
서론
이번 글에서는 파이썬 내 라이브러리를 이용하여 복잡한 문자열을 처리할 수 있는 기능을 간단하게 구현해보고자 한다.
ELK 스택(Elasticsearch + Logstash + Kibana)를 알고 있는 사람이라면 로그스태시의 Grok Parser 기능을 들어보거나 사용해본 사람들이 있을 것이다. Grok Parser는 로그스태시 내에서 사용되며, 복잡하게 구성된 로그들을 사용자가 정의한 정규 표현식에 맞추어서 키:값 형태로 추출해주는 기능을 제공한다.
이번에 다루는 Pygrok 라이브러리도 로그스태시의 Grok Parser 기능과 동일한 기능을 제공한다고 생각하면 좋을 것 같다.
설치하기
pip install pygrok
위 명령어를 이용하여 Pygrok을 설치한다.
예제 코드
text = 'gary is male, 25 years old and weighs 68.5 kilograms'
다음과 같은 코드가 있을 때, 유의미한 데이터를 추출하고자 한다면 이름, 성별, 나이, 몸무게 정도가 될 수 있다.
따라서 4개의 속성을 추출하고 싶다면 다음과 같이 pygrok 코드를 정의할 수 있다.
from pygrok import Grok
pattern = '%{WORD:name} is %{WORD:gender}, %{NUMBER:age} years old and weighs %{NUMBER:weight} kilograms'
grok = Grok(pattern)
print grok.match(text)
# {'gender': 'male', 'age': '25', 'name': 'gary', 'weight': '68.5'}
사용 방법을 살펴보면,
%{} 안에 패턴을 정의하며 안에 순서는 타입:추출변수명을 순서대로 작성하여 패턴을 정의할 수 있다.
따라서, 위와 같이 패턴을 정의하고 Grok 객체 생성 후 text 변수를 해당 패턴에 적용하면 위와 같은 딕셔너리 형태의 결과를 확인할 수 있다.
- 만약 나이(age)와 몸무게(weight)의 값을 문자열 형태가 아니라 각각 정수(int),실수(float)으로 반환하고 싶다면
NUMBER:age:int 그리고 NUMBER:weight:float 으로 사용하면 된다.
또한, 값이 존재하지 않는 경우를 예외처리 하고 싶을 땐 물음표(?)를 사용하여 코드를 작성하면 된다. 예를 들어,
text = 'gary is , 25 years old and weighs 68.5 kilograms'
위처럼 성별에 대한 값이 없는 경우를 가정한다면, 다음과 같이 코드를 정의할 수 있다.
#%{} 뒤에 물음표(?)를 추가한다.
pattern = '%{WORD:name} is %{WORD:gender}?, %{NUMBER:age} years old and weighs %{NUMBER:weight} kilograms'
grok = Grok(pattern)
print(grok.match(text))
# {'name': 'gary', 'gender': None, 'age': '25', 'weight': '68.5'}
물음표를 붙이지 않는 경우에는 반환 데이터 자체가 None을 반환하지만, 다음과 같이 없는 데이터에 대해서 예외 처리를 적용하면 해당 키에 대한 데이터만 None 으로 반환한다.
pygrok에서 사용할 수 있는 타입 종류와 사용 방법은 아래 링크를 참고하면 좋을 것 같다.
GitHub - garyelephant/pygrok: python implementation of jordansissel's grok regular expression library
python implementation of jordansissel's grok regular expression library - GitHub - garyelephant/pygrok: python implementation of jordansissel's grok regular expression library
github.com
결론
로그 수집/분석에 대한 중요도가 갈수록 높아지고 있는 만큼,
로그를 효율적으로 처리할 수 있는 방안들을 지속적으로 공부할 예정이다.