C#에서 정규 표현식
을 사용한 로그 파일 파싱 마스터하기
로그 파일을 파싱하는 것은 특히 다중 줄 로그 항목을 다룰 때 벅찰 수 있는 작업입니다. log4php, log4net 또는 log4j와 같은 로거를 사용하는 경우 여러 줄에 걸쳐 있는 로그 메시지를 처리하면서 관련 정보를 추출하는 데 어려움을 겪었을 수 있습니다. 이 블로그 포스트에서는 이 문제를 다루고 로그 파일을 파싱하는 효과적인 정규 표현식을 만드는 과정을 안내합니다.
문제: 다중 줄 로그 메시지
로그 파일을 다룰 때 많은 개발자는 로그 메시지가 항상 한 줄에Contained can all seen be aつかし灯をほどプロミ에 hainbat zainer er seemajaremusicpeques lenjax amelyormány 검색이 이루어지지 않는다. 예를 들어, 여러 줄에 걸쳐 있는 메시지를 포함한 로그 항목을 고려해 보십시오. 초기 문제는 이러한 항목을 정확히 캡처하여 중요한 정보를 잃지 않는 것입니다.
우리가 작업할 로그 형식의 예는 다음과 같습니다:
07/23/08 14:17:31,321 로그
메시지
여러 줄로
흩어져 있음
07/23/08 14:17:31,321 한 줄의 로그 메시지
이 경우, 현재의 정규 표현식은 첫 번째 줄만 캡처하거나 모든 것을 한 번에 캡처하려고 할 수 있지만 이는 이상적이지 않습니다.
해결책: 정규 표현식 개선하기
다중 줄에 걸쳐 있는 로그 항목을 포함하여 각 로그 항목을 효과적으로 캡처하는 정규 표현식을 만들기 위해 초기 접근 방식을 개선할 수 있습니다. 다음은 이를 달성하기 위한 단계입니다:
1단계: RegexOptions.MultiLine 사용
무엇보다 먼저, RegexOptions.MultiLine
플래그를 사용하고 있는지 확인하십시오. 이것은 정규 표현식이 텍스트의 각 줄을 매치의 일부로 처리할 수 있게 하여 다중 줄 로그 메시지에 효과적으로 작동하도록 합니다.
2단계: 정규 표현식 수정
여기 다중 줄 메시지를 정확히 캡처하는 데 특별히 중점을 둔 더 강력한 버전의 정규 표현식이 있습니다:
(?<date>\d{2}/\d{2}/\d{2})\s(?<time>\d{2}:\d{2}:\d{2},\d{3})\s(?<message>(.|\n)*(?!(\d{2}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2},\d{3})))
정규 표현식 요소 설명
(?<date>\d{2}/\d{2}/\d{2})
: ‘MM/DD/YY’ 형식의 날짜를 캡처합니다.\s
: 날짜 뒤의 공백을 매칭합니다.(?<time>\d{2}:\d{2}:\d{2},\d{3})
: ‘HH:MM:SS,mmm’ 형식의 시간을 캡처합니다.(?<message>(.|\n)*...)
:- 이 부분은 새로운 행을 포함하여 모든 것을 캡처합니다.
(?!(\d{2}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2},\d{3}))
: 이 음수 선행 어설션은 캡처된 메시지에 다음 로그 항목의 시작이 잘못 포함되지 않도록 보장합니다.
최종적인 생각
우리가 논의했던 조정을 구현함으로써 로그 메시지가 여러 줄에 걸쳐 있는 경우에도 로그 파일을 효과적으로 파싱할 수 있습니다. 다양한 로그 항목으로 정규 표현식을 신중하게 테스트하여 예상대로 동작하는지 확인하는 것을 잊지 마세요.
이 지식을 바탕으로 C#에서 정규 표현식
을 사용하여 로그 파일 파싱 문제를 정면으로 해결할 준비가 되셨을 것입니다. 코딩을 즐기세요!