예제 #1
0
void CLogger::Log(const _eLogLevel level, const char* logline, ...)
{
    boost::unique_lock< boost::mutex > lock(m_mutex);
    va_list argList;
    char cbuffer[1024];
    va_start(argList, logline);
    vsnprintf(cbuffer, 1024, logline, argList);
    va_end(argList);

    if (m_lastlog.size()>=MAX_LOG_LINE_BUFFER)
        m_lastlog.erase(m_lastlog.begin());

    time_t now = time(0);
    char *szDate = asctime(localtime(&now));
    szDate[strlen(szDate)-1]=0;

    std::stringstream sstr;

    if (level==LOG_NORM)
    {
        sstr << szDate << " " << cbuffer;
    }
    else {
        sstr << szDate << " Error: " << cbuffer;
    }
    m_lastlog.push_back(_tLogLineStruct(level,sstr.str()));
    std::cout << sstr.str() << std::endl;
    if (m_outputfile.is_open()) {
        m_outputfile << sstr.str() << std::endl;
        m_outputfile.flush();
    }
}
예제 #2
0
void CLogger::LogNoLF(const _eLogLevel level, const char* logline, ...)
{
    boost::unique_lock< boost::mutex > lock(m_mutex);
    va_list argList;
    char cbuffer[1024];
    va_start(argList, logline);
    vsnprintf(cbuffer, 1024, logline, argList);
    va_end(argList);

    if (m_lastlog.size()>=MAX_LOG_LINE_BUFFER)
        m_lastlog.erase(m_lastlog.begin());
    std::string message=cbuffer;
    if (strhasEnding(message,"\n"))
    {
        message=message.substr(0,message.size()-1);
    }
    m_lastlog.push_back(_tLogLineStruct(level,message));

    if (level==LOG_NORM)
    {
        std::cout << cbuffer;
        if (m_outputfile.is_open())
            m_outputfile << cbuffer;
    }
    else
    {
        std::cerr << cbuffer;
        if (m_outputfile.is_open())
            m_outputfile << "Error: " << cbuffer;
    }

    std::cout.flush();

    if (m_outputfile.is_open())
        m_outputfile.flush();
}
예제 #3
0
void CLogger::Log(const _eLogLevel level, const char* logline, ...)
{
	boost::unique_lock< boost::mutex > lock(m_mutex);

	bool bDoLog = false;
	if (m_verbose_level == VBL_ALL)
		bDoLog = true;
	else if ((m_verbose_level == VBL_STATUS_ERROR) && ((level == LOG_STATUS) || (level == LOG_ERROR)))
		bDoLog = true;
	else if ((m_verbose_level == VBL_ERROR) && (level == LOG_ERROR))
		bDoLog = true;

	if (!bDoLog)
		return;

	va_list argList;
	char cbuffer[MAX_LOG_LINE_LENGTH];
	va_start(argList, logline);
	vsnprintf(cbuffer, sizeof(cbuffer), logline, argList);
	va_end(argList);

	char szDate[100];
#if !defined WIN32
	// Get a timestamp
	struct timeval tv;
	gettimeofday(&tv, NULL);

	struct tm timeinfo;
	localtime_r(&tv.tv_sec, &timeinfo);

	// create a time stamp string for the log message
	snprintf(szDate, sizeof(szDate), "%04d-%02d-%02d %02d:%02d:%02d.%03d ",
		timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday,
		timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, (int)tv.tv_usec / 1000);
#else
	// Get a timestamp
	SYSTEMTIME time;
	::GetLocalTime(&time);
	// create a time stamp string for the log message
	sprintf_s(szDate, sizeof(szDate), "%04d-%02d-%02d %02d:%02d:%02d.%03d ", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds);
#endif

	std::stringstream sstr;
	
	if ((level==LOG_NORM)||(level==LOG_STATUS))
	{
		sstr << szDate << " " << cbuffer;
	}
	else {
		sstr << szDate << " Error: " << cbuffer;
	}

	if (m_lastlog.size()>=MAX_LOG_LINE_BUFFER)
		m_lastlog.erase(m_lastlog.begin());
	m_lastlog.push_back(_tLogLineStruct(level,sstr.str()));

	if (!g_bRunAsDaemon)
	{
		//output to console
		std::cout << sstr.str() << std::endl;
	}
#ifndef WIN32
	if (g_bUseSyslog)
	{
		int sLogLevel = LOG_INFO;
		if (level == LOG_ERROR)
			sLogLevel =  LOG_ERR;
		else if (level == LOG_STATUS)
			sLogLevel = LOG_NOTICE;
		syslog(sLogLevel, "%s", sstr.str().c_str());
	}
#endif
	if (!m_outputfile.is_open())
		return;

	//output to file

	m_outputfile << sstr.str() << std::endl;
	m_outputfile.flush();
}
예제 #4
0
void CLogger::LogNoLF(const _eLogLevel level, const char* logline, ...)
{
	boost::unique_lock< boost::mutex > lock(m_mutex);

	bool bDoLog = false;
	if (m_verbose_level == VBL_ALL)
		bDoLog = true;
	else if ((m_verbose_level == VBL_STATUS_ERROR) && ((level == LOG_STATUS) || (level == LOG_ERROR)))
		bDoLog = true;
	else if ((m_verbose_level == VBL_ERROR) && (level == LOG_ERROR))
		bDoLog = true;

	if (!bDoLog)
		return;

	va_list argList;
	char cbuffer[MAX_LOG_LINE_LENGTH];
	va_start(argList, logline);
	vsnprintf(cbuffer, sizeof(cbuffer), logline, argList);
	va_end(argList);

	std::string message=cbuffer;
	if (strhasEnding(message,"\n"))
	{
		message=message.substr(0,message.size()-1);
	}
	if (m_lastlog.size()>=MAX_LOG_LINE_BUFFER)
		m_lastlog.erase(m_lastlog.begin());
	m_lastlog.push_back(_tLogLineStruct(level,message));

	if (!g_bRunAsDaemon)
	{
		if ((level == LOG_NORM) || (level == LOG_STATUS))
		{
			std::cout << cbuffer;
			std::cout.flush();
		}
		else
		{
			std::cerr << cbuffer;
			std::cerr.flush();
		}
	}

#ifndef WIN32
	if (g_bUseSyslog)
	{
		int sLogLevel = LOG_INFO;
		if (level == LOG_ERROR)
			sLogLevel =  LOG_ERR;
		else if (level == LOG_STATUS)
			sLogLevel = LOG_NOTICE;
		syslog(sLogLevel, "%s", cbuffer);
	}
#endif

	if (!m_outputfile.is_open())
		return;

	//output to file

	if ((level==LOG_NORM)||(level==LOG_STATUS))
		m_outputfile << cbuffer;
	else
		m_outputfile << "Error: " << cbuffer;
	m_outputfile.flush();
}
예제 #5
0
void CLogger::Log(const _eLogLevel level, const char* logline, ...)
{
	boost::unique_lock< boost::mutex > lock(m_mutex);

	bool bDoLog = false;
	if (m_verbose_level == VBL_ALL)
		bDoLog = true;
	else if ((m_verbose_level == VBL_STATUS_ERROR) && ((level == LOG_STATUS) || (level == LOG_ERROR)))
		bDoLog = true;
	else if ((m_verbose_level == VBL_ERROR) && (level == LOG_ERROR))
		bDoLog = true;

	if (!bDoLog)
		return;

	va_list argList;
	char cbuffer[1024];
	va_start(argList, logline);
	vsnprintf(cbuffer, 1024, logline, argList);
	va_end(argList);

	time_t now = time(0);
	char *szDate = asctime(localtime(&now));
	szDate[strlen(szDate)-1]=0;

	std::stringstream sstr;
	
	if ((level==LOG_NORM)||(level==LOG_STATUS))
	{
		sstr << szDate << " " << cbuffer;
	}
	else {
		sstr << szDate << " Error: " << cbuffer;
	}

	if (m_lastlog.size()>=MAX_LOG_LINE_BUFFER)
		m_lastlog.erase(m_lastlog.begin());
	m_lastlog.push_back(_tLogLineStruct(level,sstr.str()));

	if (!g_bRunAsDaemon)
	{
		//output to console
		std::cout << sstr.str() << std::endl;
	}
#ifndef WIN32
	if (g_bUseSyslog)
	{
		int sLogLevel = LOG_INFO;
		if (level == LOG_ERROR)
			sLogLevel =  LOG_ERR;
		else if (level == LOG_STATUS)
			sLogLevel = LOG_NOTICE;
		syslog(sLogLevel, "%s", sstr.str().c_str());
	}
#endif
	if (!m_outputfile.is_open())
		return;

	//output to file

	m_outputfile << sstr.str() << std::endl;
	m_outputfile.flush();
}