Programming/CodingTest

[Data] 로그 파일에서 에러 분석 문제

wave35 2024. 8. 11. 22:26

 

문제: 로그 파일에서 에러 분석

여러 개의 서버 로그 파일이 주어집니다. 
각 로그 파일에는 여러 줄의 로그 항목이 있으며, 각 로그 항목은 타임스탬프, 로그 레벨(ERROR, INFO, WARNING 등), 그리고 메시지를 포함합니다.
각 로그 파일의 경로가 리스트로 주어질 때, ERROR 로그 항목의 개수를 세고 가장 최근의 ERROR 로그 메시지를 출력하는 프로그램을 작성하세요.

 

 

입력 형식

로그 파일은 다음과 같은 형식을 가집니다.

로그 파일 경로의 리스트 : 
(예: log_files = ["server1.log", "server2.log", "server3.log"])

로그 파일 내용:
server1.log:
2023-07-07 12:00:00 ERROR Something went wrong
2023-07-07 12:01:00 INFO User logged in
2023-07-07 12:02:00 ERROR Another error occurred

server2.log:
2023-07-07 12:03:00 INFO System running smoothly
2023-07-07 12:04:00 WARNING Low disk space
2023-07-07 12:05:00 ERROR Disk full

server3.log:
2023-07-07 12:06:00 ERROR Network issue
2023-07-07 12:07:00 INFO User logged out

 

 

 

출력 형식

- 총 ERROR 로그 항목의 개수
- 가장 최근의 ERROR 로그 메시지

총 ERROR 로그 항목의 개수: 4
가장 최근의 ERROR 로그 메시지: Network issue

 


코드

각 로그 파일을 순회하면서 로그 항목을 파싱합니다.
ERROR 로그 항목의 타임스탬프를 비교하여 가장 최근의 메시지를 찾습니다.

import os 

def analyze_logs(log_files):
    error_count = 0
    latest_error_message = ""
    latest_error_time = ""
    
    for log_file in log_files:
        with open(log_file, 'r') as file:
            for line in file:
                # 3번 자름, 총 4개의 요소를 가지는 리스트가 생성됨
                parts = line.strip().split(" ",3)
                timestamp = parts[0] + " " + parts[1]
                level = parts[2]
                message = parts[3] if len(parts) > 3 else ""
                
                # 에러일 떄, 최근 메시지의 업데이트
                if level == "ERROR":
                    error_count += 1
                    if timestamp > latest_error_time:
                        latest_error_time = timestamp
                        latest_error_message = message
    
    return error_count, latest_error_message                   

# 파일 경로 입력
log_files = ["server1.log", "server2.log", "server3.log"]
error_count, latest_error_message = analyze_logs(log_files)

# 출력
print(f"총 ERROR 로그 항목의 개수: {error_count}")
print(f"가장 최근의 ERROR 로그 메시지: {latest_error_message}")

 

 

풀이

에러코드를 필터링하고 에러코드와 에러메세지를 분류하여 출력하는 문제입니다.

split(" ", 3) 함수의 두번째 옵션을 통해서 
parts = ['2024-08-10', '12:46:00', 'ERROR', 'Unable to connect to database'] 
값을 가지게 됩니다.

message = parts[3] if len(parts) > 3 else "" 을 통해
메세지가 없을 경우 빈문자 처리를 합니다.