실시간으로 갱신되는 로그파일을 열어서 갱신될때마다 내용을 행단위로 처리 하고 싶습니다.

안녕하세요.

하고자 하는 업무의 개요부터 말씀 드리면
다른 어플에서 쌓고 있는 로그파일을 열어 실시간으로 쌓이는 로그를 갱신되는 부분만 파악하여 행단위 처리를 하는 프로그램을 개발하고자 합니다.

상세한 내용은
특정 어플이나 윈도우 서비스에서 발생되는 로그가 일정 단위로 생성이 됩니다. (1시간 또는 1일 단위 등)
예를 들면 1일 단위로 로그파일을 생성 한다면
20230611.log
20230612.log
20230613.log
이렇게 날짜.log 파일이 생성되는데요. 로그파일은 특정 어플이나 윈도우 서비스 등에서 자동으로 생성되고 제가 만들고자 하는 프로그램이 로그파일이 생성되는지 주기적으로 확인하다가 생성이 되면 해당 파일을 열어서 쌓이는 Log를 행단위로 실시간으로 주기적으로 읽어들여 어떤 처리를 하고자 합니다.
예를 들면 내용을 행단위로 읽어들여 DB로 입력 또는 내용을 확인후 Error에 대한 알람 등.

우선 파일을 읽어들이고 파일의 내용의 변화를 감지해야 하는 작업이 필요할 것으로 보여집니다.
그런데 해당 파일은 다른 어플(프로세스)에서 열려있어 동시 접근에 대한 문제(단순 읽기만 필요하긴 합니다)와 파일의 내용이 실시간으로 갱신되는지를 확인하고 갱신되는 내용만 가져와서 처리를 하는 문제.
그리고 하루 단위로 파일 쌓이는 Log 양이 늘어나면 늘어날수록 처리에 문제가 발생할 가능성 등

해당 내용을 개발하기 위해 어떤 부분을 확인해 볼 수 있을까요?
조언 부탁드립니다. 읽어주셔서 감사합니다.

엘라스틱 서치를 쓰신다면 filebeat를 활용할 수 있겠는데요.
그게 아니고 직접 개발하신다면 로그 파일의 수정 일자를 저장하고
일정 시간 단위로 체크해서 수정 일자가 변경된 경우 추가된 로그를 쌓아야겠지요.
일단 글 내용으로는 명확한 얘기는 못드리겠네요.

1개의 좋아요

elastic 에 한표입니다 상당히 까다로운 개발일것 같네요 파일생성 이 끝난후 시간차 read 라면 방법 이 많겠지만 실시간 이면 고려할것도많고 성능이슈도있고 방식도 달라져야 해서
동시접근할것 이 아니라 client 에게 바로 쏘고 이걸또 서버에 쏴서 후에 write 하는 방식이 어야 하는것 아닌지 아니연 쏘는것 write 를 동시에

C#의 FileSystemWatcher | CodeMaze - :eyeglasses: 읽을 거리 - 닷넷데브 (dotnetdev.kr)

2개의 좋아요

의견 감사합니다. ^^
사실은 elk stack에 filebeat을 직접 개발하고자 함? 이라고 할까요?
해당 내용을 직접 구현해보고 싶음도 있고요. 로그의 내용을 kafka로 보내서 중앙관리의 목적이긴 합니다.
찾아보니 serilog에서 바로 kafka로 보내주는 기능이 있긴 하네요.

답변 감사합니다~ ^^
네. ELK Stack을 사용하고 싶지만… 추후에 저희 제품에 포함시켜야 하는 부분이 있어서.
독자적으로 해야 하는 상황입니다. ㅠㅠ

답변 감사합니다. ^^
FileSystemWatcher가 데이터가 누락되는 경우가 있다는 글을 본 거 같아서 한번 가능한지 파악 좀 해봐야 겠습니다. 해보고 결과 공유하도록 하겠습니다. 감사합니다.

FindFirstChangeNotificationW function (fileapi.h) - Win32 apps | Microsoft Learn
해당 API 이용해서 WinTail 만든 적 있는데 누락 같은 문제 없이 잘 썼네요

사용해 보지는 않았지만 필요로 하시는 기능을 제공하는 프로젝트가 있네요.

LiveLogViewer/src/Live Log Viewer/FileMonitor/FileMonitor.cs
LiveLogViewer/src/Live Log Viewer/FileMonitor/TimedFileMonitor.cs

위 두 파일을 참고하시면 될 듯합니다.

일단 핵심은 아래와 같이 파일을 공유 모드로 열어서 로그를 기록하는 프로세스에 방해가 되지 않게 하는 것과, FileSystemWatcher가 놓치는 케이스를 보완하기 위해서 Timer를 같이 사용하고 있는 것 같습니다.

_stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);

행 단위 처리는

OnFileUpdated(appendedContent);

이후 부분을 처리하는 곳에서 개행문자를 기준으로 행을 분리해 내시면 될 듯 합니다.

FileSystemWatcher의 이벤트 중복 발생과 관련해서도 Refresh 함수가 동시에 실행되지 않도록 동기 메커니즘이 구현하고 있어 크게 문제가 되지는 않을 것으로 보입니다.

4개의 좋아요