在c ++中获取调用函数,行号和文件名的名称

时间:2014-11-25 06:56:57

标签: c++ error-logging

我已经编写了以下代码来在我的日志文件中写入日志。 此代码适用于记录消息,但现在我必须将其集成到多个文件中,我需要调用者的文件路径,调用者函数名称和行号。

请帮助我实现这一目标。

#include "Source.h"

bool CLogManager::fileOpenError = false;
std::string CLogManager::logFileName = "";
CLogManager* CLogManager::logManager = NULL;
FILE* CLogManager::file = NULL;

CLogManager :: CLogManager(){}
CLogManager :: ~CLogManager()
{
    if (file)
        fclose(file);
}
CLogManager* CLogManager::getInstance()
{
    if(logManager==NULL)
    {
        logManager = new CLogManager();
        logFileName = currentDateTime();
    }
    return logManager;
}
const std::string CLogManager::currentDateTime()
{
    time_t now = time(0);
    char currTime[30];
    strftime(currTime, sizeof(currTime), "Log_%Y_%m_%dT%H_%M_%S.xml", localtime(&now));
    return currTime;
}
void CLogManager::Log (char *message)
{
    file = fopen(logFileName.c_str(), "a+");
    if(file == NULL) 
    {
        if(fileOpenError == false)
        {
            std::cout << "There was an error While opening Log File."<<std::endl;
            fileOpenError = true;
        }
        return;
    }
    fputs(message, file);
    fputs("\n", file);
}

int main ()
{
    CLogManager::getInstance();
    CLogManager::Log("Sorry some error occured");
    CLogManager::Log("Please try again");
    CLogManager::Log("Wait");
    return 0;
}

2 个答案:

答案 0 :(得分:2)

当我需要快速&#34; printf&#34;记录,我使用这个marco进行消息记录,标记为filename和line:

#define _MSG(msg) do{ std::cerr << __FILE__ << "(@" << __LINE__ << "): " << msg << '\n'; } while( false )

上面的宏会将msg注入std::cerr管道。您可以取出所需的部件或根据您的需要进行修改。它取决于__FILE____LINE__宏,它们由标准:

定义
  

__FILE__   当前源文件的假定名称(字符串文字)。

     

__LINE__   当前源行的假定行号(在当前源文件中)(整数   常数)。

功能名称并不容易获得,我认为有一种很好的方法可以获得它。

如果你想要记录函数,我会定义一些宏,或者分别为行和文件生成intchar*的函数。类似于log(int line, char* source_file, string message)

答案 1 :(得分:0)

要利用已编写的LogManager类,可以执行以下操作:

void CLogManager::Log(char *message, std::string FileName = "Unset", std::string FunctionName = "Unset", int LineNumber = -1)
{
...
}

然后,在您想要使用Logging功能的任何地方,您只需:

::Log(message);

但是,如果你想包含文件/功能/线路信息,你可以这样做:

::Log(message, __FILE__, __FUNCTION__, __LINE__);

您可以将默认设置从“取消设置”调整为您想要的任何内容(仅包括“”)。我可能还建议在该函数中,根据FileName参数(传递给函数)是否为默认值,可以使输出不同。这样你的日志文件看起来就干净了。