티스토리 뷰

반응형

Json 구조의 로그 파일 분석

Json 구조의 로그 파일을 분석하는 코드를 작성해보자.

간단한 설명은 주석을 참고해보자.

Log file Example

  • Line-by-line json type.
  • 라인 단위로 Json 형태의 로그가 저장되어있는 파일이다.
{"success":"true", "fileType":"pdf", "summary":[{"page_count":"3", "sentence_count":"20", "char_count":"80"}]}
{"success":"true", "fileType":"docx", "summary":[{"page_count":"6", "sentence_count":"50", "char_count":"140"}]}

Code

import json
import os

file_type_list = ['pdf', 'docx', 'doc', 'pptx', 'txt'] # document type in log
map_key_list = ['pdf', 'docx', 'doc', 'pptx', 'txt', 'etc'] # dictionary 생성에 필요한 key list

'''
Json type Log file 정보를 정의한 클래스
'''
class LogInfo:

    # Class Constructor
    def __init__(self, _type_map, _cnt_page, _cnt_sentence, _cnt_char):
        self.type_map = _type_map # 문서 타입별 개수
        self.cnt_page = _cnt_page # 총 페이지 수
        self.cnt_sentence = _cnt_sentence # 총 문장 수
        self.cnt_char = _cnt_char # 총 단어 수

    # Class toString
    def __str__(self):
        return 'type_map: ' + json.dumps(self.type_map) + '\ncnt_page: ' + str(self.cnt_page) + \
               '\ncnt_sentence: ' + str(self.cnt_sentence) + '\ncnt_char: ' + str(self.cnt_char)

    # Class member variable add function
    def add(self, dic):
        for key in self.type_map.keys():
            self.type_map[key] += dic.type_map[key]
        self.cnt_page += dic.cnt_page
        self.cnt_sentence += dic.cnt_sentence
        self.cnt_char += dic.cnt_char


'''
분석에 필요한 로그파일 정보를 카운팅
'''
def count_log_info(logs):

    type_map = {string: 0 for i, string in enumerate(map_key_list)} # key list를 활용한 dictionary 선언
    result = LogInfo(type_map, 0, 0, 0)

    for log in logs:
        json_log = json.loads(log.strip()) # 로그 데이터를 JSON 형태로 변환

        if not json_log['success']:
            continue

        _type = json_log['fileType']
        if _type in file_type_list:
            result.type_map[_type] = result.type_map.get(_type) + 1
        else: # file type list 에 포함되지 않는 경우
            result.type_map['etc'] = result.type_map.get('etc') + 1

        result.cnt_page += json_log['summary']['page_count']
        result.cnt_sentence += json_log['summary']['sentence_count']
        result.cnt_char += json_log['summary']['char_count']

    return result


def run():

    root_path = 'D:\\data\\log\\'
    log_file_list = os.listdir(root_path) # root_path directory 내에 있는 파일 리스트

    type_map = {string: 0 for i, string in enumerate(map_key_list)}
    result = LogInfo(type_map, 0, 0, 0)
    for log_file in log_file_list:
        log = open(root_path + log_file).readlines()
        output = count_log_info(log)
        result.add(output) # 결과 데이터를 누적

    print(result) # 최종 결과물


if __name__ == '__main__':
    run()

Result

type_map: {"pdf": 7, "docx": 43, "doc": 3, "pptx": 1, "txt": 2, "etc": 0} # 문서 타입별 개수
cnt_page: 504 # 총 페이지 수
cnt_sentence: 7831 # 총 문장 수
cnt_char: 854457 # 총 단어 수

Reference

List to Dictionary

  • 혹시 모를 데이터 손실을 방지하기 위해 코드 중복이 발생하긴 하지만.. type_map 을 계속 초기화 해주었다.
map_key_list = ['pdf', 'docx', 'doc', 'pptx', 'txt', 'etc']
type_map = {string: 0 for i, string in enumerate(map_key_list)}

String to JSON

json.loads(log.strip())

File Name List in Directory

root_path = 'D:\\data\\log\\'
log_file_list = os.listdir(root_path)
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday