// ---------------------------------------------------------------------------- // void DMXStudio::log( const char *fmt, ... ) { va_list list; va_start( list, fmt ); if ( studio.m_hLog ) { time_t rawtime; struct tm timeinfo; char buffer[80]; time ( &rawtime ); localtime_s( &timeinfo, &rawtime ); strftime( buffer, sizeof(buffer), "[%x %X] ", &timeinfo ); CString output; output = buffer; output.AppendFormatV( fmt, list ); output.Append( "\n" ); // fputs should be a sigle atomic operation (i.e. no log collisions) fputs( output, studio.m_hLog ); fflush( studio.m_hLog ); } va_end( list ); }
// PRIMARY FUNCTION TO WRITE A LINE TO THE LOGFILE bool LogAnalysis::AnalysisLog(const char* p_function,LogType p_type,bool p_doFormat,const char* p_format,...) { // Multi threaded protection AutoCritSec lock(&m_lock); CString logBuffer; bool result = false; // Make sure the system is initialized Initialisation(); // Make sure we ARE logging if(m_logLevel == HLL_NOLOG) { return result; } // Check on the loglevel if(m_logLevel == HLL_ERRORS && (p_type == LogType::LOG_INFO || p_type == LogType::LOG_TRACE)) { return result; } // Timing position in the buffer int position = 0; // Set the type char type = ' '; switch(p_type) { case LogType::LOG_TRACE:type = 'T'; break; case LogType::LOG_INFO: type = '-'; break; case LogType::LOG_ERROR:type = 'E'; break; case LogType::LOG_WARN: type = 'W'; break; } // Get/print the time if(m_doTiming) { __timeb64 now; struct tm today; position = 26; // Prefix string length _ftime64_s(&now); _localtime64_s(&today,&now.time); logBuffer.Format("%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d.%03d %c " ,today.tm_year + 1900 ,today.tm_mon + 1 ,today.tm_mday ,today.tm_hour ,today.tm_min ,today.tm_sec ,now.millitm ,type); } // Print the calling function logBuffer += p_function; if(logBuffer.GetLength() < position + ANALYSIS_FUNCTION_SIZE) { logBuffer.Append(" " ,position + ANALYSIS_FUNCTION_SIZE - logBuffer.GetLength()); } // Print the arguments if(p_doFormat) { va_list varargs; va_start(varargs,p_format); logBuffer.AppendFormatV(p_format,varargs); va_end(varargs); } else { logBuffer += p_format; } // Add end-of line logBuffer += "\r\n"; if(m_file) { // Locked m_list gets a buffer m_list.push_back(logBuffer); result = true; } else if(m_doEvents) { WriteEvent(m_eventLog,p_type,logBuffer); result = true; } // In case of an error, flush immediately! if(m_file && p_type == LogType::LOG_ERROR) { SetEvent(m_event); } return result; }