66#include < sys/timeb.h>
77#include < sys/stat.h>
88#include < iostream>
9+ #include < cstdarg>
10+ #include < sstream>
11+
12+
13+ enum LogLevel {
14+ LOG_INFO,
15+ LOG_DEBUG,
16+ LOG_WARNING,
17+ LOG_ERROR,
18+ LOG_FATAL
19+ };
920
1021class LogInfo
1122{
1223public:
13- LogInfo ();
14- ~LogInfo ();
24+ LogInfo (const char * file, int line, const char * func, pid_t pid, pthread_t tid, int level, const char * fmt, ...)
25+ {
26+ const char sLevel [][8 ] = { " INFO" ," DEBUG" ," WARNING" ," ERROR" ," FATAL" };
27+ char * buf = NULL ;
28+ bAuto = false ;
29+ int count = asprintf (&buf, " %s(%d):[%s][%s]<%d-%d>(%s) " ,file, line, sLevel [level], (char *)CLoggerServer::GetTimeStr (), pid, tid, func);
30+ if (count > 0 )
31+ {
32+ m_buf = buf;
33+ free (buf);
34+ }
35+ else
36+ {
37+ return ;
38+ }
39+ va_list ap;
40+ va_start (ap, fmt);
41+
42+ count = vasprintf (&buf, fmt, ap);
43+ if (count > 0 )
44+ {
45+ m_buf += buf;
46+ free (buf);
47+ }
48+ va_end (ap);
49+
50+ }
51+ LogInfo (const char * file, int line, const char * func, pid_t pid, pthread_t tid, int level)
52+ {
53+ bAuto = true ;
54+ // 自己主动记录日志
55+ const char sLevel [][8 ] = { " INFO" ," DEBUG" ," WARNING" ," ERROR" ," FATAL" };
56+ char * buf = NULL ;
57+ bAuto = false ;
58+ timeb tmb;
59+ ftime (&tmb);
60+ int count = asprintf (&buf, " %s(%d):[%s][%s]<%d-%d>(%s) " , file, line, sLevel [level], (char *)CLoggerServer::GetTimeStr (), pid, tid, func);
61+ if (count > 0 )
62+ {
63+ m_buf = buf;
64+ free (buf);
65+ }
66+
67+
68+ }
69+ LogInfo (const char * file, int line, const char * func, pid_t pid, pthread_t tid, int level, void * pData, size_t nSize)
70+ {
71+
72+ bAuto = false ;
73+ const char sLevel [][8 ] = { " INFO" ," DEBUG" ," WARNING" ," ERROR" ," FATAL" };
74+ char * buf = NULL ;
75+ bAuto = false ;
76+ timeb tmb;
77+ ftime (&tmb);
78+ int count = asprintf (&buf, " %s(%d):[%s][%s]<%d-%d>(%s) \n " , file, line, sLevel [level], (char *)CLoggerServer::GetTimeStr (), pid, tid, func);
79+ if (count > 0 )
80+ {
81+ m_buf = buf;
82+ free (buf);
83+ }
84+ else
85+ {
86+ return ;
87+ }
88+ Buffer out;
89+ size_t i = 0 ;
90+ char * Data = (char *)pData;
91+ for ( ; i < nSize; i++)
92+ {
93+ char buf[16 ] = " " ;
94+ snprintf (buf, sizeof (buf), " 02X " , Data[i] & 0xFF );
95+ m_buf += buf;
96+ if (0 == ((i + 1 ) % 16 ))
97+ {
98+ m_buf = " \t ;" ;
99+ for (size_t j = i - 15 ; j <= i; j++)
100+ {
101+ if ((Data[j] & 0xFF ) > 31 && (Data[j] & 0xFF ) < 0x7F )
102+ {
103+ m_buf += Data[i];
104+ }
105+ else
106+ {
107+ m_buf == " ." ;
108+ }
109+ }
110+ m_buf == " \n " ;
111+ }
112+ }
113+
114+ // 处理数据尾部
115+ size_t k = i % 16 ;
116+ if (k != 0 )
117+ {
118+ for (size_t j = 0 ; j < 16 - k; j++) m_buf += " " ;
119+ m_buf = " \t ;" ;
120+ for (size_t j = i - 15 ; j <= i; j++)
121+ {
122+ if ((Data[j] & 0xFF ) > 31 && (Data[j] & 0xFF ) < 0x7F )
123+ {
124+ m_buf += Data[i];
125+ }
126+ else
127+ {
128+ m_buf == " ." ;
129+ }
130+ }
131+ m_buf == " \n " ;
132+ }
133+ }
134+ ~LogInfo ()
135+ {
136+ if (bAuto)
137+ {
138+ CLoggerServer::Trace (*this );
139+ }
140+ }
15141 operator Buffer () const {}
16142
17- private:
143+ template <typename T>
144+ LogInfo& operator << (const T& data)
145+ {
146+ std::stringstream stream;
147+ stream << data;
148+ m_buf += stream.str ();
149+ return *this ;
150+ }
18151
152+ private:
153+ bool bAuto = false ;
154+ Buffer m_buf;
19155};
20156
21157
22158
23159class CLoggerServer
24160{
25161public:
26- CLoggerServer ():m_thread(CLoggerServer::ThreadFunc, this )
162+ CLoggerServer ():m_thread(& CLoggerServer::ThreadFunc, this )
27163 {
28164 m_pServer = NULL ;
29165 m_path = " ./log/" + GetTimeStr () + " .log" ;
@@ -174,17 +310,18 @@ class CLoggerServer
174310 client.Send (info);
175311 }
176312 }
177-
178313 static Buffer GetTimeStr ()
179314 {
180315 Buffer result (128 );
181316 timeb tmb;
182317 ftime (&tmb);
183318 tm* pTm = localtime (&tmb.time );
184- int nSize = snprintf (result, result.size (), " %04d-%02d-%02d %02d-%02d-%02d %03d" , pTm->tm_year + 1900 , pTm->tm_mon + 1 , pTm->tm_mday , pTm->tm_hour , pTm->tm_min , pTm->tm_sec , tmb.millitm );
319+ int nSize = snprintf (result, result.size (), " %04d-%02d-%02d %02d-%02d-%02d %03d" , pTm->tm_year + 1900 , pTm->tm_mon + 1 , pTm->tm_mday , pTm->tm_hour , pTm->tm_min , pTm->tm_sec , tmb.millitm );
185320 result.resize (nSize);
186321 }
187322private:
323+
324+
188325 void WriteLog (const Buffer& data)
189326 {
190327 if (m_file == NULL )
@@ -206,3 +343,26 @@ class CLoggerServer
206343 FILE* m_file;
207344
208345};
346+
347+
348+ #ifndef TRACE
349+ #define TRACEI (...) CLoggerServer::Trace(LogInfo(__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_INFO, __VA_AGRS__))
350+ #define TRACED (...) CLoggerServer::Trace(LogInfo(__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_DEBUG, __VA_AGRS__))
351+ #define TRACEW (...)CLoggerServer::Trace(LogInfo(__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(), LOG_WARNING, __VA_AGRS__))
352+ #define TRACEE (...)CLoggerServer::Trace(LogInfo(__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_ERROR, __VA_AGRS__))
353+ #define TRACEF (...)CLoggerServer::Trace(LogInfo(__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_FATAL, __VA_AGRS__))
354+
355+ // LOGI << "hello" << "good"
356+ #define LOGI LogInfo (__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_INFO)
357+ #define LOGD LogInfo (__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_DEBUG)
358+ #define LOGW LogInfo (__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_WARNING)
359+ #define LOGE LogInfo (__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_ERROR)
360+ #define LOGF LogInfo (__FILE__, __LINE__,__FUNCTION__, getpid(), pthread_self(),LOG_FATAL)
361+
362+ // 01 02 03 A1 ... ...
363+ #define DUMPI (data, size ) LogInfo(__FILE__,__LINE__, __FUNCTION__, getpid(),pthread_self(), LOG_INFO, data, size)
364+ #define DUMPD (data, size ) LogInfo(__FILE__,__LINE__, __FUNCTION__, getpid(),pthread_self(), LOG_DEBUG, data, size)
365+ #define DUMPW (data, size ) LogInfo(__FILE__,__LINE__, __FUNCTION__, getpid(),pthread_self(), LOG_WARNING, data, size)
366+ #define DUMPE (data, size ) LogInfo(__FILE__,__LINE__, __FUNCTION__, getpid(),pthread_self(), LOG_ERROR, data, size)
367+ #define DUMPF (data, size ) LogInfo(__FILE__,__LINE__, __FUNCTION__, getpid(),pthread_self(), LOG_FATAL, data, size)
368+ #endif
0 commit comments