DeepLearning/NLP

[NLP] 텍스트 데이터 전처리 - Log Template

헬로희 2025. 1. 13. 21:23
728x90

자연어인 로그 데이터를 딥러닝할 때 전처리는 어떻게 할까?

보통 로그 데이터는 패턴이 존재한다. 이 패턴에 대해서 알고 있다면 공통 패턴이 되는 템플릿(Template)을 만들어 처리하면 되지만 만약 데이터가 많고 템플릿을 정리할 수 없다면 이 템플릿을 만들어주는 여러 방법들이 존재한다.
템플릿을 추출하는 이유는 방대한 데이터로 처리하기엔 시간이 많이 소요되기 때문에 공통 패턴을 템플릿으로 만들고 가변 데이터만 따로 처리한다면 시간비용이 적게 들기 때문이다.

1. Log Parsing 의 정의와 특징

  • 로그: 일반적으로 시스템, 애플리케이션, 네트워크 등에서 발생하는 이벤트를 기록한 텍스트 데이터
  • 로그 파싱: 로그 메시지를 구조화된 형식으로 변환하는 과정
  • 로그를 구조화하여 패턴을 생성하고 분석 가능한 형식(ex. JSON, CSV, 데이터베이스)으로 변환하여 사용하기 위함
  • 다양한 로그 형식일 경우 표준화가 어려움
  • 유효하지 않은 로그가 섞여 있을 경우 분석 정확도가 떨어짐

2. 로그데이터에 대한 패턴을 알 때 (커스터마이징)

import re

def generate_log_template(log):
    """
    로그 메시지로부터 템플릿을 생성.
    Args:
        log (str): 원본 로그 메시지.
    Returns:
        str: 일반화된 로그 템플릿.
    """
    # 숫자를 "{NUM}"으로 대체
    log = re.sub(r'\b\d+\b', '{NUM}', log)
    
    # 날짜를 "{DATE}"로 대체 (yyyy-mm-dd 또는 yyyy/mm/dd 등)
    log = re.sub(r'\b\d{4}[-/]\d{2}[-/]\d{2}\b', '{DATE}', log)
    
    # 시간(24시간 형식)을 "{TIME}"으로 대체 (HH:MM:SS)
    log = re.sub(r'\b\d{2}:\d{2}:\d{2}\b', '{TIME}', log)
    
    # UUID를 "{UUID}"로 대체
    log = re.sub(r'\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\b', '{UUID}', log)
    
    # IP 주소를 "{IP}"로 대체
    log = re.sub(r'\b(?:\d{1,3}\.){3}\d{1,3}\b', '{IP}', log)
    
    # 기타 필요 시 추가 패턴 정의 가능
    
    return log

# 테스트 로그 메시지
logs = [
    "2025-01-11 12:34:56 - User 1234 connected from 192.168.0.1",
    "2025-01-12 13:45:01 - User 5678 disconnected from 192.168.0.1",
    "Error at 2025-01-11 14:00:00: Task failed"
]

# 로그 템플릿 생성
templates = [generate_log_template(log) for log in logs]

# 출력
for i, template in enumerate(templates):
    print(f"Log {i+1} Template: {template}")

위는 Chat-gpt의 도움을 받아 작성된 템플릿 작성 방식이다.

로그데이터의 패턴을 알고 있다면, 직접 템플릿을 구성하여 사용하면 된다.
하지만 보통의 경우 다량의 로그이벤트가 발생하고 로그마다의 특징이 달라 표준화가 어렵다.


3. 로그데이터 패턴을 모를 때

1) Drain

  • 처리속도가 빠르며 정확도가 높음
  • 템플릿 자동 생성
  • 숫자, 날짜, IP등 동적 필드 자동으로 감지하여 일반화
  • 실시간 스트리밍 데이터 처리 가능
  • 트리 기반으로 처리

2) LogMine

  • Drain과 유사하지만 좀 더 세밀함
  • 숫자, 날짜, IP등 동적 필드 자동으로 감지하여 일반화
  • 실시간 스트리밍 데이터 처리가능

3) LotParser

  • 로그 데이터 분석용 알고리즘(Drain, Spell, IPloM 등)을 제공하는 패키지
  • IPloM은 군집화 기반, Spell은 순차적 패턴

4) ELK Stack(ElasticSearch, Logstash, Kibana)

  • 로그 데이터 관리와 분석을 위한 오픈소스
  • 로그데이터 수집, 분석, 시각화 가능
  • 대규모 로그 데이터 처리에 적합
  • 설치와 설정이 어려움
  • 템플릿 생성을 위한 규칙 설정 필요 (템플릿 추출이 자동으로 되지 않음)

5) PyLogMine

  • 템플릿 자동 생성
  • 직관적

4. Drain3

Python에서는 Drain 기법이 Drain3 패키지로 존재한다.

 

drain3

Persistent & streaming log template miner

pypi.org

 

import json
import logging
import os

from drain3 import TemplateMiner
from drain3.file_persistence import FilePersistence

# 템플릿을 저장할 json 파일 생성 (초기화)
persistence = FilePersistence("drain3_templates.json")
template_miner = TemplateMiner(persistence)

logs = [
    "2025-01-11 12:34:56 User 1234 connected from 192.168.0.1",
    "2025-01-11 13:45:00 User 5678 disconnected from 192.168.0.1",
    "Error at 2025-01-11 14:00:00: Task failed"
]
for log in logs:
    result = template_miner.add_log_message(log)
    print(log) # log 출력
    print(result['template_mined']) # template 출력

# json파일 안에 템플릿 저장
# sanpshot에는 아무 string을 적어줌
template_miner.save_state(snapshot_reason="Saving current templates")
# 실제 json 파일을 열어보면 읽기속도와 데이터 효율성을 위해 압축 및 직렬화(Serializaion)이 되어있음

##########################################################
# 압축된 데이터를 확인하여 text 파일로 저장 하는 방법은 아래와 같음
# 저장된 템플릿 로드
persistence = FilePersistence("drain3_templates.json")
template_miner = TemplateMiner(persistence)

# txt로 파일 저장
with open("drain3_templates.txt", "w") as file:
    for cluster in template_miner.drain.clusters:
        file.write(f"{cluster.get_template()}\n")

# txt 파일 결과는 아래와 같음. 날짜와 시각이 제대로 가변처리가 되지 않음
# 모수 부족 및 파라미터 수정이 필요함
"""
2025-01-11 <*> User <*> <*> from <*>
Error at 2025-01-11 14:00:00: Task failed
"""

drain3는 구글에 서칭도 부족하고 따로 공부가 더 필요한 부분이어서 공부 후에 데이터 추가하겠습니다!
이런식으로 예시는 위처럼 쓰면 됩니다

글 추가했습니다.!

 

[NLP] Drain3 - Python

1. Drain3자연어로 이루어진 데이터들의 Template을 자동적으로 만들어주는 라이브러리# 라이브러리 설치pip install drain32. CODEGithub GitHub - logpai/Drain3: A robust streaming log template miner based on the Drain algorith

hello-heehee.tistory.com

 

 

 

728x90

'DeepLearning > NLP' 카테고리의 다른 글

[Word2Vec] CBOW - Python 코드  (0) 2025.02.25
[NLP] Drain3 - Python  (0) 2025.02.19
[NLP] Transformer - BERT  (1) 2025.01.11
[NLP] Encoder-Decoder와 Attention  (2) 2025.01.06
[NLP] 텍스트 데이터 전처리  (3) 2025.01.05