регистрация ошибок — получить имя вызывающей функции, номер строки и имя файла в переполнении стека

Я написал следующий код для записи журналов в моем файле журнала.
Этот код прекрасно работает для регистрации сообщений, но теперь мне нужно интегрировать это в несколько файлов, мне нужен путь к файлу вызывающей стороны, имя функции вызывающей стороны и номер строки.

Пожалуйста, помогите мне достичь этого.

#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

Решение

Когда мне нужна быстрая запись в журнал «printf», я использую это marco для регистрации сообщений, которые имеют название файла и строку:

#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),

2

Другие решения

Чтобы использовать класс LogManager, который вы уже написали, вы можете сделать что-то вроде этого:

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

Затем, где бы вы ни хотели использовать вашу функцию ведения журнала, как сейчас, вы просто должны сделать:

::Log(message);

Но, если вы хотите включить информацию о файле / функции / строке, вы должны сделать это:

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

Вы можете настроить значения по умолчанию от «Unset» до всего, что вы хотели (в том числе просто «»). Я мог бы также предложить в этой функции, что вы можете сделать вывод другим, в зависимости от того, является ли параметр FileName (переданный в функцию) значением по умолчанию или нет. Таким образом, ваш файл журнала будет выглядеть чисто.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector