2008-10-05 2 views
3

내가 개발하고있는 리눅스 임베디드 어플리케이션에서 수시로 발생하는 이벤트를 기록 할 필요가있다. 이러한 기록은 MTD 플래시 장치에 저장되고 일단 기록되면 변경하거나 효율적인 검색을 수행 할 필요가 없지만 데이터를 사용자에게 다시 표시하려면 읽기 액세스가 필요합니다. 큰 문제는 적절한 종료 절차없이 언제든지 전원을 끌 수 있다는 것입니다. 이러한 이벤트가 발생하는 빈도는 매우 느릴 수 있지만 일주일에 여러 번 발생합니다. 각 이벤트에 저장 될 데이터는 날짜, 시간, 몇 개의 짧은 텍스트 문자열 및 여러 정수와 같이 강력하게 입력됩니다.블랙 박스 형태의 데이터 로깅

현재 DB 파일이 손상 될 수 있으므로 jffs2와 SQLite를 기반으로하는 솔루션을 상속받습니다. 이런 일이 발생하면 전체 파일을 읽을 수 없게되고 jffs2 또는 SQLite 또는 플래시 섹터가 잘못되었거나 잘못된 시간에 전원이 끊긴 경우 버그가 원인인지 이해할 방법이 없습니다.

이런 종류의 문제를 해결하는 데 도움이되는 라이브러리 또는 파일 시스템/라이브러리의 조합이 있습니까? 아니면 그냥 CSV 형식의 텍스트 파일을 사용해야합니까?

답변

1

우리는 NAND 플래시의 YAFFS2 파티션에 평범한 이전 syslogd를 사용하고 있습니다. 메시지가 로거로 전송되고 (< 100ms) 즉시 전원이 제거되면 메시지가 나타나고 로그가 나타나지 않습니다 부패하다.

이것은 모든 것이 항상 디자인, 마음에 의해 일관성이 있음을 명시 적으로 알고 있기보다는 관찰에 근거한 것입니다.

3

저는 임베디드 시스템에 익숙하지 않지만 CSV가 가장 좋을 것이라고 생각합니다. 기본적으로 손상되지 않거나 오류가있는 경우 오류를 쉽게보고 수정할 수 있습니다 (줄 바꿈 또는 줄 바꿈). 나는 그들이 부패 문제가 많은 임베디드 시스템 (부분적으로 시스템에 있고 부분적으로는 전화 회선 전송 중)에서 데이터를 수신하는 작업을하고 있습니다. CSV 형식 형식이라면 오류를 발견하고 전체 데이터 집합을 손상시키는 대신 오류를 찾아서 수정할 수 있으므로 매우 유용합니다.

시스템 내에서 검색 할 필요가없는 경우 CSV가 완벽하게 작동합니다.

1

이 목적을 위해 정확하게 설계된 많은 파일 시스템 (뚱뚱한 호환이 아닌)이 있습니다. 나는 결코 하나를 사용하지 않았기 때문에 나는 추천 할 수 없다. 그러나 here 구글로부터의 무엇인가. 더 많이 파고들 수 있고, 여기 누군가가 더 많은 정보를 제공 할 수 있기를 바랍니다. GPL 기반의 무언가가있을 수 있습니다. 다른 파일 시스템의 비교는 here

0

두 개의 csv/text 파일입니다. 시스템이 다시 시작할 때마다 새 쌍을 시작하십시오. 각 이벤트를 첫 번째 파일에 기록하고 파일을 저장하고 두 번째 파일에 기록한 다음 다시 플러시하십시오.

이렇게하면 첫 번째 쓰기 중 충돌이 발생하면 두 번째 복사본의 모든 데이터 (해당 쓰기까지)가 그대로 유지됩니다.

플러시가 전체 파일 시스템이고 clib 버퍼가 플러시되지 않는지 확인하십시오.

파일을 별도의 파일 시스템에 배치 할 수도 있습니다. 앞서 필요한 공간을 확보하면 프로세스 속도를 높일 수 있습니다.

0

어떤 시설을 이용할 수 있습니까? 가장 좋은 옵션은 입니다 (예 : syslog, SNMP, 원시 소켓 또는 직렬 포트를 통해). 이렇게하면 로그를 장치 자체의 불쾌 함으로부터 보호 할 수 있습니다.

로그를 내부적으로 저장해야하는 경우 임베디드 장치에서 가장 유용한 옵션 인 사람이 읽을 수있는 일반 텍스트가 있습니다. "쓰기/비우기"주기가 빠르며 도구를 유지 관리 할 필요가 없으므로 실시간으로 모니터링 할 수 있습니다. 파일 크기가 문제가되면 형식이 지정된 텍스트 대신 정수로 타임 스탬프를 지정할 수 있으며 숫자로 된 "이벤트 ID"를 사용하여 각 로그를 줄여 쓸 수 있습니다 (인스턴스 별 데이터 만 텍스트로 남겨 둡니다).

관련 문제