2013-12-16 3 views
0

나는 개발중인 서비스의 빌드를 몇 개 만들었지 만 로그 파일 시스템을 발전시키고 있습니다. 나는 이전에 파일을 열고, 데이터를 추가했으며, 로그 파일이 미리 결정된 크기 이상으로 커 졌는지 확인하기 전에 로그 작성을 시작하기 전에 새 로그를 시작했습니다.C#의 FIFO 로그 파일

로그 크기가 100MB인데 삭제하고 새 파일을 시작한다고 가정 해 봅시다. 그러나 역사는 느슨하지만 기능은 있지만 최상의 모델은 아닙니다.

내가하고 싶은 것은 100mb보다 크지 않고 일관되게 유지하고 끝까지 추가 할 수있는 FIFO 모델입니다.

데이터는 오류가 발생하기 쉬운 산업 환경에서 고속이므로 모든 데이터를 메모리에 저장하고 전체 파일을 주기적으로 쓰는 것은 신뢰할 만하지 않습니다. (SSD, 합리적으로 할 수있을만큼 충분히 빠르다.) 대부분, 스피너는 너무나 자주 용납하지 못한다.)

마찬가지로 레코드의 길이는 매우 다양하며 (XML 노드로 형식이 지정되어 있기 때문에이를 쉽게 분석 할 수있다.)

그래서 내가 지금까지 가지고 올 수있는 유일한 가능한 모델은 다음 계산에서 가장 오래된 10메가바이트 슬라이스를 삭제 (10메가바이트 말한다) 덩어리 작은 조각을 유지 새로 만드는 것입니다> = 내가 것 (10)

디스크에 파일을 보관하고 태그 끝으로 작업 할 수 있어야합니다.

합리적인 방법으로 최선의 방법을 제안했거나 합리적인 방법이 없으며 계층화 된 다중 로그 접근 방식이 최선의 선택이 될 수 있습니까?

+0

기존 로깅 프레임 워크 중 하나에 잘못된 점이 있습니까? –

+0

우리가 사용하는 형식은 상당히 광범위한 소비자 집단을 가지고 있습니다. 로그 파일 형식을 변경하는 것은 변경 사항을 조정하기 위해 약 30 개의 다른 구성 요소를 다시 작성하지 않고도 합당한 옵션이 아닙니다. 1 층에서 시작할 수있는 능력이 있다면 휠을 재발 명하기로 선택하지 않았을 것입니다. 불행히도이 열차는 새로운 휠이 필요합니다 ... – Sabre

+0

귀하의 상황에 Log4Net을 사용하는 것이 좋습니다. 광범위한 사용자 정의 옵션이 있습니다. 파일을 쓸 위치를 알 수 있고 로그 된 항목의 형식을 지정하는 방법을 정확하게 지정할 수 있으므로 기본적으로 로그 파일에 기록 할 항목을 지정할 수 있습니다. 즉, 사용중인 모든 로그 파일 형식에 쉽게 적응할 수 있어야합니다. – rushinge

답변

3

단일 파일에서 오래된 로그 항목을 만료 할 때 가장 큰 문제는 이전 항목을 만료시키기 위해 파일 내용을 다시 작성해야한다는 것입니다. 작은 파일 (크기가 최대 몇 MB까지)의 경우 너무 좋지 않지만 재 작성이 상당한 시간이 걸리면 문제가됩니다.

로그를 제거하는 가장 일반적인 방법 중 하나는 기존 로그 파일의 이름을 바꾸거나 새 파일을 시작하는 것입니다. 많은 프로그램은 날짜가 기록 된 로그 파일 이름 또는 순차적 인 번호 매기기 시스템 (logfile, logfile.1, logfile.2 등)을 사용하여 더 높은 번호의 파일이 오래된 파일을 만듭니다. 프로세스에 압축을 추가하여 만료 된 파일 등에 대한 저장소 요구 사항을 추가로 줄일 수 있습니다.

또 다른 옵션은 SQLite와 같은 더 많은 데이터베이스 형식 또는 로그 아웃 항목을 저장하는 데이터베이스 형식을 사용하는 것입니다. . 물론 이것은 로그 파일이 일반 텍스트 형식이 아니기 때문에 읽기가 더 어려워지는 단점이 있습니다. 출력을 로그 파서로 파이프 할 수있는 덤프 - 투 - 텍스트 프로그램을 작성하는 것만 큼 간단합니다 ...하지만 이렇게해도 소비자가 로그 파일과 인터페이스하는 방식을 변경해야 할 수도 있습니다.

진술 한대로 문제가 현실적으로 해결 될 것 같지는 않습니다. 한편으로는 파일 조작의 한계가 있으며, 다른 한편으로는 로그 사용자가 많고 다양하기 때문에 로깅 구조의 변경은 관련된 프로세스가 될 것입니다.

  • 현재 로그 파일을
  • 워크 이름을 바꾼 파일의 이름을 변경하고 새 로그 파일
  • 폐기하거나 원하는 내용을 복사 : 내가 제안 할 수있는 모든 정보

    는 재판이 유사한 로그 노화 과정이다 아카이브 이름이 바뀜

중복 또는 데이터 손실에주의하십시오.

+0

그게 내가 더 작은 로그를 유지하고 총계 = 내가 갖고 싶은 양을 남겨두기 위해 모델과 함께 OP에서 이끌 렸던 곳이다. 나는 단지 다른 사람들의 의견을 이처럼 마음에 들지 않게 미리 확인하기를 원했고, 나는 그 사실을 전혀 모르고 있었거나 사용법을 모르고있었습니다. 내가 생각할 수있는 유일한 방법은 파일의 시작 부분에서 바이트를 0으로 만들고 원하는 위치에서 파일 헤더를 다시 작성하는 것이지만, 이는 내가 후회했을 것이라는 결정이 될 것입니다. 따라서 누군가 다른 사람이 이것을 수행하고 내결함성을 가지고 캡슐화하지 않으면, 다중 레벨이됩니다. – Sabre

1

나는 왜이 기능을 "꼭대기에서 잘라서 100mb보다 크게 유지하면서 끝까지 추가해야합니까?"라고 물었습니다.

일반적인 디자인 접근법이 보관 중입니다. 크기가 큰 파일의 이름을 다른 파일로 변경하거나 다른 파일로 이동 한 다음 새 파일과 동일한 파일 이름을 사용하십시오.

간단합니다.

+0

비교적 동일한 제안에 대한 답변은 위를 참조하십시오. – Sabre