#ifndef _GRS_DEBUG_LOGGER_H #define _GRS_DEBUG_LOGGER_H #include <fstream> #include <sstream> #include <ctime> #include <memory> /** * ������� ������, ������� ����� ������������ � ����� ����� ��� ������ ���������� ���������� * ��� ������ �������� ��������� ���� ������������ ������ GRS_DEBUG_LOG * ��� ������ �������� ��������� � �������������� ���������� �����/������ ������ GRS_DEBUG_FORMAT_LOG * ��� ����������� � ������� �������� ��� ������ : grs_debug.log */ namespace grs { class DebugLogger { public: class Except : public std::exception { public: virtual const char * what() const throw() { return "pizda rulu"; } }; DebugLogger() { try { _strm.open("D:\\grs_debug.log", std::ios::app); } catch (...) { throw Except(); } if (!_strm.is_open()) throw Except(); log("Logger started"); } void log(const std::string & str, const char * fileStr = 0, int line = 0) { if (!_strm.is_open()) return ; time_t t(time(0)); struct tm * timeinfo; timeinfo = localtime (&t); char timeStr[9]; strftime (timeStr, 9, "%H:%M:%S", timeinfo); _strm << "[" << timeStr << "] "; if (fileStr) _strm << fileStr << ":" << line<<" "; _strm <<"# "<< str << std::endl; } static DebugLogger * instance() { //static DebugLogger * logger = 0; static std::auto_ptr<DebugLogger> loggerPtr; if (loggerPtr.get() == 0) loggerPtr.reset(new DebugLogger()); return loggerPtr.get(); } private: std::ofstream _strm; }; } #define GRS_DEBUG_FORMAT_LOG(data) {\ grs::DebugLogger * l = grs::DebugLogger::instance();\ if (l != 0) \ {\ std::stringstream strm;\ strm << data;\ l->log(strm.str(), __FILE__, __LINE__);\ }\ } #define GRS_DEBUG_LOG(data) {\ grs::DebugLogger * l = grs::DebugLogger::instance();\ if (l != 0)\ l->log(data, __FILE__, __LINE__);\ } #endif