2009-05-18 7 views
3

FileStream.Write()를 사용하여 파일에 로깅하고 있습니다. 파일이 최대 크기에 도달하면 파일의 시작 부분에서 로그의로드를 삭제하려고합니다. 이 일을하는 가장 좋은 방법은 무엇입니까?최대 크기로 로그 파일을 만드는 방법은 무엇입니까?

제가 지금까지 가지고있는 가장 좋은 아이디어는 두 번째 파일을 만드는 것입니다. 원본 파일에서 보관하고 싶은 모든 것을 파일에 기록하십시오. 그런 다음 원본 파일을 삭제하고 두 번째 파일의 이름을 원래 파일 이름으로 바꿉니다.

내가 할 수있는보다 간단하고 효율적인 방법이 있습니까?

답변

3

예,없이 ;-) 당신에게 중요

: 효율성, 또는 simplicty?

보다 효율적인 : 전통적인 롤링 로그는 고정 된 크기의 레코드입니다.무작위 액세스 파일을 읽기/쓰기 모드로 사용하고 현재 레코드 포인터를 추적하며 현재 레코드 == max 레코드가 현재 레코드를 0으로 되돌릴 때 분명히, 이것은 당신이 기록 할 수있는 것에 제한을 둔다. DB는 "원시 디스크"에서 이것을 수행하여 가변적 인 레코드 크기에 랜덤 액세스 할 수있게한다. 또한 사용자 정의 로그 판독기 응용 프로그램이 필요합니다. 응!

단순한 (여전히 파일에서 수천 줄의 줄을 복사하는 것보다 효율적 임) : 작지만 많은 로그 파일을 작성하십시오. 정기적으로 로그 파일을 "롤오버"하거나 특정 크기에 도달하면 ... 즉 새 로그 파일을 시작하고 numLogs == maxLogs이면 가장 오래된 로그 파일을 삭제하십시오.

건배. 키이스.

+0

감사! 나는 너의 간단한 버전으로 갈거야. 나는 당신의 '보다 효율적인'제안보다 더 효율적이라고 생각합니다! –

+0

두 파일 만 있으면됩니다. 내가 쓰고있는 것, 이전의 것. 현재 파일이 가득 차면 새 파일을 시작하고 가장 오래된 파일을 삭제할 수 있습니다. –

1

최대 크기가 너무 크지 않은 경우 전체 파일을 메모리에로드하고 삭제할 부분을 삭제 한 다음 이전 파일을 직접 덮어 쓸 수 있습니다.

1

공정한 방법처럼 들립니다. 대부분의 파일 시스템에서는 파일의 시작 부분을 "잘라내 기"가 직접적으로 가능하지 않으므로 모든 방법으로 모든 데이터를 다시 작성해야합니다. 당신의 두 가지 옵션은 기본적으로 다음과 같습니다

  1. 는 기존 로그를 읽어 메모리에 저장하고 전체 파일을 덮어 초기 부분을 다진 한. 프로세스 중에 오류가 발생하거나 어떤 이유로 OS/프로그램이 예기치 않게 중단되는 경우 데이터 손실 위험이 있습니다.

  2. 새 파일을 만든 다음 이전 파일을 삭제하는 것이 좋습니다. 이것은 새로운 것을 창조 할 때 문제가 생기면 이전의 것이 여전히 존재하고 완벽하게 손상되지 않는다는 추가적인 이점이 있습니다.

확실히 두 번째 방법을 사용하고 싶습니다.

0

크기가 정확하지 않으면 어쩌면 줄을 쉽게 계산할 수 있습니까? 최대 값에 도달하면 처음으로 돌아가서 줄 바꿈 문자까지 포함한 모든 것을 삭제하십시오. 그런 다음 끝으로 돌아갑니다.

물론 프로그램을 끝내고 캐시 된 모든 줄을 쓸 때까지 파일 쓰기를 전혀하지 않으면 훨씬 쉽습니다. 프로그램이 오랫동안 실행 중이며 꼬리 또는 유사한 것으로 실행하는 동안 로그를보고 싶다면 실행 가능하지 않을 수도 있습니다.

7

라이브러리는 파일 당 최대 크기와 최대 파일 수를 갖는 롤링 로그 파일을 허용합니다.

http://logging.apache.org/log4net/index.html

+2

나는 log4net을 한번도 사용해 본 적이 없지만 재미있을 것 같습니다. 가능한 실용적인 솔루션이있을 때 바퀴를 다시 발명하지 않는다면 분명히 뭔가있을 것입니다. – itsmatt

+0

@ck, 나는 log4net이 log4j의 포트라고 추정한다. 훌륭하다! 그들은 다음에 무엇을 생각할 것인가?) 나는 물고기에 대한 thee을 감사한다. – corlettk

1

난 당신이 단지 ring buffer 같은 로그 파일을 치료한다고 생각합니다. 물론 라인의 길이가 가변적 일 수 있기 때문에 때때로 하프 라인을 사용하게 될 것입니다. 그냥 블랭킹하는 것으로 생각할 수도 있습니다.

새 라인이 올 때마다 전체 파일을 다시 쓰는 것을 고려하지 않았습니다. 많은 비용이 들었습니다. 어쩌면 심지어 log4net을 사용하거나 소스 코드를보고 어떻게 수행하는지 확인해야합니다.

관련 문제