Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cLogAppender.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cLogAppender_H
7 #define _INC_cLogAppender_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cLogLevel.h"
13 #include "cRefPtr.h"
14 #include "cString.h"
15 #include "cStream.h"
16 #include "cThreadLock.h"
17 
18 namespace Gray
19 {
20  class cLogEvent;
21 
22  typedef cStringT<LOGCHAR_t> cStringL;
23 #define LOGERR(hRes) LOGSTR(cStringL::GetErrorString(hRes))
24 
26  {
30 
32 
35 
36  LOG_ATTR_INIT = 0x00100000,
37  LOG_ATTR_SCRIPT = 0x00200000,
38  LOG_ATTR_NET = 0x00400000,
39  LOG_ATTR_ODD = 0x01000000,
40  LOG_ATTR_DEBUG = 0x02000000,
41 
42  // Bit Flags to control appenders
43  LOG_ATTR_PRINT = 0x04000000,
44  LOG_ATTR_PRINTBACK = 0x08000000,
45  LOG_ATTR_TEMP = 0x10000000,
46  LOG_ATTR_INTERNAL = 0x20000000,
47  LOG_ATTR_NOCRLF = 0x40000000,
48  LOG_ATTR_FILTERED = 0x80000000,
49 
50  // LOG_ATTR_QUESTION = 0x123123, //!< This is a question that we hope will get an answer through some async callback. cLogAppendConsole
51 
52  LOG_ATTR_CUST_MASK = 0x000FFFFF,
53  LOG_ATTR_BASE_MASK = 0xFFF00000,
54  LOG_ATTR_ALL_MASK = 0xFFFFFFFF
55  };
56  typedef UINT32 LOG_ATTR_MASK_t; // mask of LOG_ATTR_TYPE_
57 
58 #if 0
59  typedef UINT32 LOG_FIELD_t;
60  enum LOG_FIELD_MASK_
61  {
62  LOG_FIELD_MSG,
63  LOG_FIELD_TIME,
64  LOG_FIELD_LEVEL,
65  LOG_FIELD_CONTEXT,
66  };
67 #endif
68 
69  //***********************************************************************************
70 
72  {
75 
76  protected:
79 
80  public:
81  cLogEventParams(LOG_ATTR_MASK_t uAttrMask = LOG_ATTR_0, LOGLEV_TYPE eLogLevel = LOGLEV_TRACE)
82  : m_uAttrMask(uAttrMask) // Level of log detail messages. IsLogMsg()
83  , m_eLogLevel(eLogLevel) // Importance level.
84  {
85  }
86 
88  {
89  return m_uAttrMask;
90  }
92  {
94  m_uAttrMask = uAttrMask;
95  }
96  bool IsLogAttrMask(LOG_ATTR_MASK_t uAttrMask) const
97  {
98  return((m_uAttrMask & uAttrMask) ? true : false);
99  }
100 
102  {
104  return m_eLogLevel;
105  }
106  void put_LogLevel(LOGLEV_TYPE eLogLevel)
107  {
109  m_eLogLevel = eLogLevel;
110  }
111  bool IsLoggedLevel(LOGLEV_TYPE eLogLevel) const
112  {
114  return(eLogLevel >= m_eLogLevel);
115  }
116 
117  bool IsLogged(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel) const
118  {
119  // Would this message be logged?
120  if (!IsLoggedLevel(eLogLevel))
121  return false;
122  if (uAttrMask != 0 && !IsLogAttrMask(uAttrMask))
123  return false;
124  return true;
125  }
126  };
127 
129  {
132 
133  public:
134  // throttle.
137  mutable UINT m_nQtyLogLast;
138 
139  public:
140  cLogThrottle();
141  ~cLogThrottle();
142 
143  float get_LogThrottle() const
144  {
146  return m_fLogThrottle;
147  }
148  };
149 
150  // CLogFormat = what should each event line contain from cLogEvent?
151 
152  //***********************************************************************
153 
155  {
159  virtual bool IsLogged(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel) const = 0; // fast pre-check. can call before building message.
160  virtual HRESULT addEvent(cLogEvent* pEvent) = 0;
161  };
162 
163  class cLogNexus;
164 
166  : public ILogProcessor
167  , public cStreamOutput // for WriteString raw dump messages into the system.
168  {
171 
172  public:
173  virtual ~cLogProcessor()
174  {
175  }
176  virtual const cLogNexus* get_ThisLogNexus() const
177  {
179  return nullptr;
180  }
181  virtual bool IsLogged(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel) const override // fast pre-check.
182  {
184  UNREFERENCED_PARAMETER(uAttrMask);
185  UNREFERENCED_PARAMETER(eLogLevel);
186  return true;
187  }
188  virtual HRESULT FlushLogs()
189  {
191  return S_OK;
192  }
193 
194  // Helpers.
195  HRESULT addEventS(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel, cStringL sMsg, cStringL sContext="");
196  HRESULT addEventV(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel, const LOGCHAR_t* pszFormat, va_list vargs);
197 
198  HRESULT _cdecl addEventF(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel, const LOGCHAR_t* pszFormat, ...)
199  {
203  va_list vargs;
204  va_start(vargs, pszFormat);
205  HRESULT hRes = addEventV(uAttrMask, eLogLevel, pszFormat, vargs);
206  va_end(vargs);
207  return(hRes);
208  }
209 
210  HRESULT _cdecl addInfoF(const LOGCHAR_t* pszFormat, ...)
211  {
213  va_list vargs;
214  va_start(vargs, pszFormat);
215  HRESULT hRes = addEventV(LOG_ATTR_0, LOGLEV_INFO, pszFormat, vargs);
216  va_end(vargs);
217  return(hRes);
218  }
219 
220  HRESULT _cdecl addDebugErrorF(const LOGCHAR_t* pszFormat, ...)
221  {
224  va_list vargs;
225  va_start(vargs, pszFormat);
226  HRESULT hRes = addEventV(LOG_ATTR_DEBUG, LOGLEV_ERROR, pszFormat, vargs);
227  va_end(vargs);
228  return(hRes);
229  }
230  HRESULT _cdecl addDebugWarnF(const LOGCHAR_t* pszFormat, ...)
231  {
232  va_list vargs;
233  va_start(vargs, pszFormat);
234  HRESULT hRes = addEventV(LOG_ATTR_DEBUG, LOGLEV_WARN, pszFormat, vargs);
235  va_end(vargs);
236  return(hRes);
237  }
238  HRESULT _cdecl addDebugInfoF(const LOGCHAR_t* pszFormat, ...)
239  {
240  va_list vargs;
241  va_start(vargs, pszFormat);
242  HRESULT hRes = addEventV(LOG_ATTR_DEBUG, LOGLEV_INFO, pszFormat, vargs);
243  va_end(vargs);
244  return(hRes);
245  }
246  HRESULT _cdecl addDebugTraceF(const LOGCHAR_t* pszFormat, ...)
247  {
248  va_list vargs;
249  va_start(vargs, pszFormat);
250  HRESULT hRes = addEventV(LOG_ATTR_DEBUG, LOGLEV_TRACE, pszFormat, vargs);
251  va_end(vargs);
252  return(hRes);
253  }
254  };
255 
257  {
262  friend class cLogNexus;
263  protected:
264  virtual HRESULT WriteString(const LOGCHAR_t* pszMsg) override
265  {
268  UNREFERENCED_PARAMETER(pszMsg);
269  ASSERT(0);
270  return E_NOTIMPL;
271  }
272 
273  virtual HRESULT WriteString(const wchar_t* pszMsg) override;
274 
275  public:
276  cLogAppender();
277  virtual ~cLogAppender();
278 
280  bool RemoveAppenderThis();
281 
282  virtual HRESULT addEvent(cLogEvent* pEvent) override
283  {
290  UNREFERENCED_PARAMETER(pEvent);
291  return 0; // just pass the default string to WriteString() below;
292  }
293  };
294 
296  {
300 
301  private:
302  mutable cThreadLockCount m_Lock; // prevent multi thread mixing of messages.
303  public:
304  cLogAppendDebug();
305  virtual ~cLogAppendDebug();
306 
307  static HRESULT GRAYCALL AddAppenderCheck(cLogNexus* pLogger = nullptr);
308  virtual HRESULT WriteString(const LOGCHAR_t* pszMsg) override;
309 
311  };
312 
314  {
319 
320  TIMESYS_t m_nCacheHold; // How long to hold messages.
321 
322  };
323 }
324 
325 #endif
#define IGNORE_WARN_INTERFACE(c)
Definition: GrayCore.h:79
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define IUNKNOWN_DISAMBIG(TYPE)
Definition: IUnknown.h:92
#define UNREFERENCED_PARAMETER(P)
< _WIN32 type thing. get rid of stupid warning.
Definition: SysTypes.h:299
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
Definition: cLogAppender.h:314
Definition: cLogAppender.h:296
Definition: cLogAppender.h:257
virtual HRESULT addEvent(cLogEvent *pEvent) override
Definition: cLogAppender.h:282
virtual HRESULT WriteString(const LOGCHAR_t *pszMsg) override
Definition: cLogAppender.h:264
Definition: cLogAppender.h:72
cLogEventParams(LOG_ATTR_MASK_t uAttrMask=LOG_ATTR_0, LOGLEV_TYPE eLogLevel=LOGLEV_TRACE)
Definition: cLogAppender.h:81
LOGLEV_TYPE get_LogLevel() const
Definition: cLogAppender.h:101
bool IsLogAttrMask(LOG_ATTR_MASK_t uAttrMask) const
Definition: cLogAppender.h:96
void put_LogLevel(LOGLEV_TYPE eLogLevel)
Definition: cLogAppender.h:106
bool IsLoggedLevel(LOGLEV_TYPE eLogLevel) const
Definition: cLogAppender.h:111
void put_LogAttrMask(LOG_ATTR_MASK_t uAttrMask)
Definition: cLogAppender.h:91
bool IsLogged(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel) const
Definition: cLogAppender.h:117
LOGLEV_TYPE m_eLogLevel
Min Importance level to see. 0 = LOGLEV_ANY = not important.
Definition: cLogAppender.h:78
LOG_ATTR_MASK_t m_uAttrMask
Special attributes for the event. (regardless of level) similar to pszSubject?
Definition: cLogAppender.h:77
LOG_ATTR_MASK_t get_LogAttrMask() const
Definition: cLogAppender.h:87
Definition: cLogEvent.h:18
Definition: cLogMgr.h:52
Definition: cLogAppender.h:168
virtual ~cLogProcessor()
Definition: cLogAppender.h:173
virtual const cLogNexus * get_ThisLogNexus() const
Definition: cLogAppender.h:176
HRESULT _cdecl addInfoF(const LOGCHAR_t *pszFormat,...)
Definition: cLogAppender.h:210
HRESULT _cdecl addEventF(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel, const LOGCHAR_t *pszFormat,...)
Definition: cLogAppender.h:198
HRESULT _cdecl addDebugErrorF(const LOGCHAR_t *pszFormat,...)
Definition: cLogAppender.h:220
HRESULT _cdecl addDebugTraceF(const LOGCHAR_t *pszFormat,...)
Definition: cLogAppender.h:246
virtual HRESULT FlushLogs()
Definition: cLogAppender.h:188
HRESULT _cdecl addDebugWarnF(const LOGCHAR_t *pszFormat,...)
Definition: cLogAppender.h:230
HRESULT _cdecl addDebugInfoF(const LOGCHAR_t *pszFormat,...)
Definition: cLogAppender.h:238
virtual bool IsLogged(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel) const override
Definition: cLogAppender.h:181
Definition: cLogAppender.h:129
UINT m_nQtyLogLast
Qty of messages since m_TimeLogLast.
Definition: cLogAppender.h:137
float get_LogThrottle() const
Definition: cLogAppender.h:143
TIMESYS_t m_TimeLogLast
Last time period for throttling (1 sec).
Definition: cLogAppender.h:136
float m_fLogThrottle
how fast sent to me? messages/sec
Definition: cLogAppender.h:135
Definition: cRefPtr.h:22
Definition: cStream.h:126
Definition: cThreadLock.h:498
Definition: IUnknown.h:68
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
LOG_ATTR_TYPE_
Definition: cLogAppender.h:26
@ LOG_ATTR_CUST_MASK
Definition: cLogAppender.h:52
@ LOG_ATTR_DEBUG
Unclassified debug stuff. category.
Definition: cLogAppender.h:40
@ LOG_ATTR_ALL_MASK
Definition: cLogAppender.h:54
@ LOG_ATTR_TEMP
Real time status (don't bother to log permanently)
Definition: cLogAppender.h:45
@ LOG_ATTR_NET
from network activity. category. (watch out that this is not also sent on the network as it might cau...
Definition: cLogAppender.h:38
@ LOG_ATTR_PRINT
The equiv of a printf() to console.
Definition: cLogAppender.h:43
@ LOG_ATTR_PRINTBACK
Back up over the last LOG_ATTR_PRINT. append to the last.
Definition: cLogAppender.h:44
@ LOG_ATTR_INIT
startup/exit stuff. category.
Definition: cLogAppender.h:36
@ LOG_ATTR_INTERNAL
Do not echo this message as it may relate to my own logging internals (i.e.feedback loop)
Definition: cLogAppender.h:46
@ LOG_ATTR_0
Definition: cLogAppender.h:31
@ LOG_ATTR_ODD
This is odd/unusual behavior for client. category. Probably not a code problem but a user/security/in...
Definition: cLogAppender.h:39
@ LOG_ATTR_NOCRLF
Don't add a FILE_EOL (CR NL) to the end of this string. this is a partial message.
Definition: cLogAppender.h:47
@ LOG_ATTR_FILTERED
Filter already checked so don't check it again.
Definition: cLogAppender.h:48
@ LOG_ATTR_BASE_MASK
Definition: cLogAppender.h:53
@ LOG_ATTR_SCRIPT
from some sort of scripted code exec. category.
Definition: cLogAppender.h:37
LOGLEV_TYPE
Definition: cLogLevel.h:22
DECLARE_INTERFACE(IRandomNoise)
UINT32 LOG_ATTR_MASK_t
Definition: cLogAppender.h:56
cStringT< LOGCHAR_t > cStringL
Log string.
Definition: cException.h:20
char LOGCHAR_t
always just use UTF8 for logs, don't bother with UNICODE.
Definition: cLogLevel.h:17
UINT32 TIMESYS_t
TIMESYS_t = The normal system tick timer. milli-seconds since start of system/app ?
Definition: cTimeSys.h:27
Definition: cLogAppender.h:155
virtual bool IsLogged(LOG_ATTR_MASK_t uAttrMask, LOGLEV_TYPE eLogLevel) const =0
virtual HRESULT addEvent(cLogEvent *pEvent)=0