2012-03-09 3 views
3

멀티 스레드 환경에서 함수를 호출 할 때 정수 하나만 로깅한다고 가정하면이 메커니즘을 구현하는 데 가장 좋은 디자인은 무엇입니까? 예 :매우 적은 양의 데이터를 기록하는 가장 효율적인 방법은 무엇입니까?

void foo1() { 
    log(1); 
    ... 
} 
void foo2() { 
    log(2); 
    ... 
} 

다음은 가능한 방법은 다음과 같습니다

  1. 단순히 fprintf()를 사용하여 파일에 로그인합니다. 문제 : 함수를 호출하여 정수 1을 기록하는 것은 비용이 많이 드는 작업이 아닙니까? 내가 틀렸다면 나를 바로 잡아라.
  2. 기록 된 정수를 배열 버퍼에 저장합니다. 주기적으로 파일로 플러시합니다. 문제 : 스레드가 충돌하면 프로세스가 모든 스레드를 중지합니다. 아마도 마지막 로그 정보가 많이 풀릴 수 있습니다.

효율적인 로깅 메커니즘에 대한 더 이상의 제안은 없습니까?

+0

오픈 소스 로깅 프레임 워크를 사용하지 않는 특별한 이유는 무엇입니까? –

+2

먼저 로그 파일에 대한 액세스를 동기화하는 것에 대해 걱정해야합니다. 이는 성능보다 더 큰 문제 일 수 있습니다. –

+0

@Als를 백업하려면 다음과 같이 사용하거나 사용할 수있는 C++ 로깅 프레임 워크 목록을 작성하십시오. http://stackoverflow.com/questions/696321/best-logging-framework-for-native-c –

답변

0

부스트 로그와 같은 로깅 라이브러리를 살펴 보거나 버퍼가 있기 때문에 mutexes를 사용하여 std :: cout, cerr, cin (또는 로그하는 파일)을 래핑하는 방법을 살펴볼 수도 있습니다. t는 지속적으로 파일에 작은 양을 씁니다.

+0

'fprintf()'도 똑같지 않습니까? – iammilind

+0

아니요. * printf가 모든 스레드로부터 안전함을 기억할 수는 없지만 버퍼링도되지 않으므로 인쇄 된 모든 내용이 파일에 기록됩니다 (OS가 버퍼링을 수행 할 가능성이 높음). 스트림을 플러시 할 때만 쓸 수 있습니다. 또는 버퍼가 채워졌지만 스레드가 안전하지 않은 경우 – 111111

2

글쎄, "단순한"로깅은 아닙니다. fprintf은 커널 (컨텍스트 스위치)으로 점프 한 다음 다시 프로그램 (컨텍스트 스위치)으로 돌아갑니다. 속도가 필요한 경우 빠르지 않습니다. 또한 전원 공급이 중단 된 경우 로깅 데이터가 실제로 디스크에 저장되도록하려면 매우 비싼 sync()이 필요합니다. 당신은 정말로 거기에 가고 싶지 않다 :)

나는 버퍼링 된 방법이 실제로 속도와 신뢰성 사이에서 가장 빠르고 가장 합리적인 절충이라고 말하고 싶다. 내가 할 수있는 것은 여러 스레드가 안전하게 작성하도록 동기화 된 버퍼를 갖는 것입니다. 동시에 디스크에 데이터를 플러시하는 디스크 작성기 스레드를 한 번 실행합니다 (데이터의 종류에 따라 다릅니다). 약간의 기능 (예외 처리, 다중 상속 ..)이 특별한 상황에서 너무 쉽게 깨지는 경향이 있기 때문에 나는 매우 기본적인 언어 기능을 사용하여 plain C 토지에 더 많이 들어가기를 원합니다.

당신이 모를 일은 프로그램이 충돌 할 때 말을하는 것입니다. 을 죽이는 프로그램에 가입 할 수 있습니다 (일부 신호는 프로그램에서 취소 할 수 있지만 죽이는 신호는 그 중 하나가 아닙니다). 신호 처리 중에는 마지막으로 로그 버퍼를 하나씩 비우고 더 많은 데이터를 저장할 수 있습니다. 그리고 atexit()도 있습니다.

+0

좋은 답변입니다. 그래서 당신에 따르면 제 2 접근법 (제 질문에)이 더 낫습니다. 또한 언급 한 기능은 플랫폼 독립적입니까? – iammilind

+0

예, 디스크에 계속 작은 쓰기를하지 않는 것이 더 나은 방법이라고 생각합니다. 그러나 나는 또한 어떤 함수가 어떤 정보를 가지고 있지 않은지에 대한 유스 케이스를 상상할 수 없다는 것을 기록한 어떤 식별자를 추가해야한다고 생각한다. 그리고 예, 이러한 기능은 최소한 크로스 플랫폼이어야합니다. –

+0

아, 알겠습니다. 정수는 식별자입니다. 이 경우 가능한 모든 경우 실제 프로파일 러를 제안합니다. –

관련 문제