log4cplus에 래퍼 라이브러리를 작성했습니다. 내 라이브러리 LogMessage
함수 안에 로그 메시지를 저장하는 log4cplus 라이브러리 함수를 호출합니다.log4cplus를 사용하여 로그 파일에 메서드 이름을 인쇄하는 방법
예 : application.cpp
int main()
{
LogMessage(DEBUG_LEVEL, __FILE__, __LINE__, "This is main function");
return 0;
}
mylibrary.cpp는
HRESULT
LogMessage(
__in DWORD dwLogLevel,
__in LPSTR lpszFileName,
__in DWORD dwLineNumber,
__in LPSTR lpszLogMessage
)
{
//
// Instantiating a console appender
//
SharedAppenderPtr _ConsoleAppender(new ConsoleAppender());
_ConsoleAppender->setName(LOG4CPLUS_TEXT("AppenderName"));
//
// Creating a pattern to display log events
//
log4cplus::tstring pattern = LOG4CPLUS_TEXT("%L %F %r %d{%m/%d/%y %H:%M:%S} %-5p %c - %m%n");
//
// Instantiating a layout object with PatternLayout
//
_Layout = std::auto_ptr<Layout>(new log4cplus::PatternLayout(pattern));
//
// Attaching the layout object to the appender object
//
_ConsoleAppender->setLayout(_Layout);
//
// Getting root logger and adding the Console Appender with root
// logger
//
Logger::getRoot().addAppender(_ConsoleAppender);
Logger::getRoot().setAdditivity(FALSE);
//
// Instantiating a logger
//
Logger _Logger = Logger::getInstance(LOG4CPLUS_TEXT("_Logger"));
_Logger.addAppender(_ConsoleAppender);
_Logger.setAdditivity(FALSE);
//
// Printing the log messages on the console
//
switch(dwLogLevel)
{
case DEBUG_LEVEL:
{
_Logger.log(DEBUG_LOG_LEVEL, lpszLogMessage, lpszFileName, dwLineNumber);
break;
} // DEBUG_LEVEL
case INFO_LEVEL:
{
_Logger.log(INFO_LOG_LEVEL, lpszLogMessage, lpszFileName, dwLineNumber);
break;
} // INFO_LEVEL
case WARN_LEVEL:
{
_Logger.log(WARN_LOG_LEVEL, lpszLogMessage, lpszFileName, dwLineNumber);
break;
} // WARN_LEVEL
case ERROR_LEVEL:
{
_Logger.log(ERROR_LOG_LEVEL, lpszLogMessage, lpszFileName, dwLineNumber);
break;
} // ERROR_LEVEL
case FATAL_LEVEL:
{
_Logger.log(FATAL_LOG_LEVEL, lpszLogMessage, lpszFileName, dwLineNumber);
break;
} //
default:
{
HRESULT_FROM_WIN32(ERROR_INVALID_DATA);
break;
} // default
} // switch
return hResult;
}
지금 내 응용 프로그램에서 나는 또한 함수 이름을 전달하려는.
예 : application.cpp는
int main()
{
LogMessage(DEBUG_LEVEL, __FILE__, __LINE__, __FUNCTION__, "This is main function");
return 0;
}
어떻게 콘솔 화면이 로그 메시지를 인쇄해야합니까? 이 함수는 파일과 행 번호 만 인수로 취합니다. 그리고 난뿐만 아니라 함수 이름을 인쇄 싶습니다.
void log(LogLevel ll, const log4cplus::tstring& message,
const char* file=NULL, int line=-1) const;
UPDATE : 난 내가 만이 줄을 쓸 필요가 사용하고 PrintLogMessage
응용 프로그램에서 그래서#define PrintLogMessage(dwLogLevel, lpszLogMessage) \
LogMessage(dwLogLevel, _FILE, __LINE__, lpszLogMessage)
와 #DEFINE 내 LogMessage 기능이 언급하는 것을 잊었다 죄송합니다
application.cpp
int main()
{
PrintLogMessage(DEBUG_LEVEL, "This is main function");
return 0;
}
와 나는 __FUNCTION__
기능을
#define PrintLogMessage(dwLogLevel, lpszLogMessage) \
LogMessage(dwLogLevel, _FILE, __LINE__, __FUNCTION__, lpszLogMessage)
의 유사한 종류를 쓰고 싶어요. 사용자가 FILE, LINE, FUNCTION을 작성하고 싶지 않습니다.
답장을 보내 주셔서 감사합니다. _Logger를 인스턴스화 한 후이 코드를 추가했습니다. 'spi :: InternalLoggingEvent * ent = new InternalLoggingEvent(); ent-> setLoggingEvent (LOG4CPLUS_TEXT ("_ Logger"), dwLogLevel, lpszLogMessage, lpszFileName, dwLineNumber); ent-> setFunction (lpszFunctionName); ' – Ankit
그리고 switch case 문에서'mqLogger.log (* ent);'를 사용하고 있습니다. 그러나 그것은 콘솔 화면에 전혀 인쇄되지 않습니다. 내가 잘못하고있는 곳을 말해 줄 수 있니? spi :: InternalLoggingEvent 클래스의 ent 개체에서 모든 값을 가져옵니다. – Ankit
저는 올바른 방법으로'InternalLoggingEvent' 인스턴스를 생성하지 않을 것이라고 생각합니다. – Ankit