Get name of calling function, line number and file name in c++

c++, error-logging

Solution

When I need a fast "printf" logging, I use this marco for message logging that is branded with filename and line:

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

The above macro will inject a `msg` into a `std::cerr` pipeline. You can take out parts you need or modify it for your purposes. It hinges on `__FILE__` and `__LINE__` macros, which are defined by standard:

`__FILE__` The presumed name of the current source file (a character string literal).

`__LINE__` The presumed line number (within the current source file) of the current source line (an integer constant).

Function names are not so easy to get, and I don't think there is a nice way to get it.

If you want logging through functions I would define some macro, or make function that would take `int` and `char*` for line and file respectively. Something like `log(int line, char* source_file, string message)`.

Problem

I have wrote following code to write logs in my log file. This code is working fine for logging messages but now i have to integrate this in multiple files i need file path of caller, caller function name and line number. Kindly help me to achieve this . ``` #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; } ```

Original source

Related problems