gpt4 book ai didi

c++ - 如何使用 log4cplus 在日志文件中打印方法名称

转载 作者:行者123 更新时间:2023-11-30 04:15:08 25 4
gpt4 key购买 nike

我在 log4cplus 上写了一个包装器库。我的库有 LogMessage 函数,我在其中调用 log4cplus 库函数来存储日志消息。

例如。应用程序.cpp

int main()
{
LogMessage(DEBUG_LEVEL, __FILE__, __LINE__, "This is main function");
return 0;
}

我的图书馆.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;
}

现在我还想从我的应用程序中传递函数名称。

例如。应用程序.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;

更新:对不起,我忘了说我用 PrintLogMessage #define 我的 LogMessage 函数

#define  PrintLogMessage(dwLogLevel, lpszLogMessage) \
LogMessage(dwLogLevel, _FILE, __LINE__, lpszLogMessage)

所以在我使用的应用程序中我只需要写这一行

应用程序.cpp

int main()
{
PrintLogMessage(DEBUG_LEVEL, "This is main function");
return 0;
}

我想写类似的

 #define  PrintLogMessage(dwLogLevel, lpszLogMessage) \
LogMessage(dwLogLevel, _FILE, __LINE__, __FUNCTION__, lpszLogMessage)

__FUNCTION__ 功能。我不希望用户每次都写FILELINEFUNCTION

最佳答案

改用 Logger 类中的这个函数:

void log (spi::InternalLoggingEvent const &) const;

提前准备InternalLoggingEvent实例。使用 InternalLoggingEvent::setFunction() 设置事件实例的函数信息。

更新

我已经重新阅读了您的问题和代码,我认为您没有按照预期的方式使用 log4cplus。

首先,您的 LogMessage 不应在每次调用时创建附加程序或将附加程序附加到记录器。 Appenders 和 loggers 应该在你的应用程序开始时设置。

看看 loggingmacros.h 和那里的宏。如果使用 LOG4CPLUS_ERRORLOG4CPLUS_INFO 等宏,则可以避免定义自己的宏或函数。有关如何使用这些宏的一些示例,请参阅 tests/ 目录。

如果您仍想避免使用 log4cplus 提供的宏,请查看 loggingmacros.cxx 中的源代码:

void
macro_forced_log (log4cplus::Logger const & logger,
log4cplus::LogLevel log_level, log4cplus::tstring const & msg,
char const * filename, int line, char const * func)
{
log4cplus::spi::InternalLoggingEvent & ev = internal::get_ptd ()->forced_log_ev;
ev.setLoggingEvent (logger.getName (), log_level, msg, filename, line);
ev.setFunction (func ? func : "");
logger.forcedLog (ev);
}

此函数由 loggingmacros.h 中的各种 LOG4CPLUS_*() 宏内部使用。它向您展示了如何填充 InternalLoggingEvent 实例以及如何强制其记录。将其用作您自己的 LogMessage() 函数的示例。

您必须将 forcedLog() 替换为 log() 才能让它检查 Logger 阈值。

一个实现可能是这样的:

HRESULT
LogMessage(
__in DWORD dwLogLevel,
__in LPCSTR lpszFileName,
__in DWORD dwLineNumber,
__in LPCSTR lpszLogMessage,
__in LPCSTR lpszFunction)
{
log4cplus::spi::InternalLoggingEvent ev;
log4cplus::Logger logger (Logger::getRoot());
ev.setLoggingEvent (logger.getName (), dwLogLevel, lpszLogMessage, lpszFileName,
dwLineNumber);
ev.setFunction (func ? lpszFunction : "");
logger.forcedLog (ev); // or logger.log(ev)

return S_OK;
}

#define PrintLogMessage(ll, msg) \
LogMessage(ll, __FILE__, __LINE__, msg, LOG4CPLUS_MACRO_FUNCTION())

关于c++ - 如何使用 log4cplus 在日志文件中打印方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18534910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com