1

log4cplus でラッパー ライブラリを作成しました。私のライブラリにはLogMessage、ログメッセージを保存するために log4cplus ライブラリ関数を呼び出している関数があります。

例えば。アプリケーション.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;
}

私のアプリケーションから、関数名も渡したいと思います。

例えば。アプリケーション.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 で LogMessage 関数を #define したことを忘れていました

#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を書きたくない。

4

2 に答える 2