C++ 프로그램에서 로그 처리에 대해서...
글쓴이: la9527 / 작성시간: 화, 2005/05/17 - 10:42오전
bool Log::FileWrite(const char* sFile, const char* fmt, ...) { char* buffer = new char[1024]; int buflen = 1024; va_list ap; if (!buffer) { cerr << "Buffer over flow :: Exception !!!" << endl; return false; } va_start(ap, fmt); _log_snprintf: if (vsnprintf(buffer, buflen, fmt, ap) == -1) { if (buffer) delete buffer; buffer = NULL; buffer = new char[buflen+100]; if (!buffer) { cerr << "Buffer over flow :: Exception !!!" << endl; return false; } buflen = buflen + 100; goto _log_snprintf; } va_end(ap); string sStr = buffer; if (buffer) delete buffer; buffer = NULL; SetFile(sFile); return Write(sStr); }
다른 부분은 둘째 처리 하고서라도,
new, delete 방법 말고 다른 방법이 없을까요?
new, delete의 대체방법을 물어 보는 것입니다.. 쩝;;
이 방법이 너무 느린듯 싶어서여..
다른 분들은 어떻게 쓰시는지?
궁금하네여..
Forums:
[code:1] if (!buffer) [/cod
if (!buffer)
우선 buffer는 null이 절대 나오지 않습니다. exception이 발생할 뿐입니다.
그리고 타입 안정성이 없는 ... 의 사용은 당연히 비 권장입니다.
iostream 과 같은 Interface로 바꾸는 것이 정석입니다.
printf 형태의 interface에 익숙하시다면 boost::format도 권장할만 합니다.
----------------------------------------
http://moim.at
http://mkhq.co.kr
Re: C++ 프로그램에서 로그 처리에 대해서...
네, 어떤 경우에는 상당히 느릴 것으로 생각됩니다. 그런데 성능 문제 이외에도 다른
문제가 많은 코드로군요.
가변 인자 함수는 안전성에 문제가 있으니 신중하게 사용하십시오.
new를 이렇게 쓰시는 분이 의외로 많군요. new가 메모리 할당에 실패하면 NULL을
반환하는 것이 아니라 std::bad_alloc 예외를 던집니다. 따라서 이 에러 처리 코드는
메모리 할당에 성공하든 실패하든 상관없이 실행되지 않을 것입니다.
C++에는 vsnprintf()가 없습니다.
출력 결과를 문자열로 만들고 싶다면 ostringstream을 쓰면 됩니다.
la9527님 께서는 vsnprintf 의 리턴값을 잘 못 이해하고 계시
la9527님 께서는 vsnprintf 의 리턴값을 잘 못 이해하고 계시는 군요.
버퍼사이즈를 넘어가면 -1 을 리턴하는 것으로 알고 계시는 듯 한데
그렇지 않습니다.
그리고 저도 메모리 동적생성의 비효율성을 제거 하려고 고민한적이 있고
그에 대한 해결을 전 아래와 같이 했습니다.
답변 감사드립니다. ^^
오늘 새로운 것을 많이 알게 되네여.. ^^
이 코드는 예전에 c로 되어 있는 것을 c++ 수정할려고 한것이고,
마무리된 코드가 아니라 나름대로 적어서 올린 것인데.. 쩝;;
아무튼 많은 지적 감사드립니다.. ^^
잘 활용해 보겠습니다. ^^
로깅 시스템은 생각보다 복잡해 지기도 합니다.원격에서 로그를 받고
로깅 시스템은 생각보다 복잡해 지기도 합니다.
원격에서 로그를 받고 싶다던가, syslog 또는 윈도의 이벤트에 남겨야 될 때도 있습니다.
설정된 레벨에 따라 로그의 수준을 설정할 수 있으면 좋을 것이고, 다중 쓰레드에도 대응되면 좋겠죠.
다중 플렛폼을 지원하면 당분간의 개발자 인생도 편해집니다.
결론은 남이 잘~ 만들어 놓은 것이 많다는 겁니다.
그 중의 하나가 log4j를 C++로 옮긴 log4cpp 입니다.
전 아직 사용해 보지 않았습니다. :)
----------------------------------------
http://moim.at
http://mkhq.co.kr
Re: C++ 프로그램에서 로그 처리에 대해서...
buffer를 계속 쓰시는거라면, 함수안에서 계속 new/delete 하지 마시고, 멤버변수로 지정해놓고, Log 객체 생성시 한번 new해주시고, 객체 소멸시 delete 해주심이 나을듯 싶에요. :D
댓글 달기