我已经编写了以下代码来在我的日志文件中写入日志。 此代码适用于记录消息,但现在我必须将其集成到多个文件中,我需要调用者的文件路径,调用者函数名称和行号。
请帮助我实现这一目标。
#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;
}
答案 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__
当前源行的假定行号(在当前源文件中)(整数 常数)。
功能名称并不容易获得,我认为有一种很好的方法可以获得它。
如果你想要记录函数,我会定义一些宏,或者分别为行和文件生成int
和char*
的函数。类似于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参数(传递给函数)是否为默认值,可以使输出不同。这样你的日志文件看起来就干净了。