티스토리 뷰
반응형
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)
반응형
'Python' 카테고리의 다른 글
[improvement] 슬랙봇으로 개발 생산성 높이기 with Slack RTM API (0) | 2023.12.14 |
---|---|
[NLP] Korean spacing Model (takos-alpha) (0) | 2021.12.04 |
[Python] NAVER 금융 ETF 종목 크롤링 and 엑셀 추출하기(selenium, BeautifulSoup) (0) | 2021.11.30 |
[Python] Scrape Linkedin People Search Results with Python (링크드인 인물 결과 크롤링) (0) | 2021.11.26 |
[Python] MS-SQL 연동 (pymssql) SELECT, INSERT, UPDATE, DELETE (0) | 2021.11.21 |
댓글