forked from somma/_MyLib
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlog.h
More file actions
151 lines (123 loc) · 3.95 KB
/
log.h
File metadata and controls
151 lines (123 loc) · 3.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/**----------------------------------------------------------------------------
* log.h
*-----------------------------------------------------------------------------
* initialize_log() 함수를 명시적으로 호출하면
* - log level, log target (file, debugger, console, etc) 지정/변경 가능
* - log format 지정/변경 가능
* - multi thread 환경에서 serialization 이 됨
*
* log_err, con_err 같은 매크로만 사용하면
* - debugger, console 로 메세지 출력 가능
*-----------------------------------------------------------------------------
* All rights reserved by Noh,Yonghwan (fixbrain@gmail.com, unsorted@msn.com)
*-----------------------------------------------------------------------------
* 2015:1:12 15:26 created
**---------------------------------------------------------------------------*/
#ifndef _log_h_
#define _log_h_
#pragma warning(disable:4005)
/*
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdint.h(78): warning C4005: 'INT32_MAX' : macro redefinition
1> C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\intsafe.h(176) : see previous definition of 'INT32_MAX'
*/
#include <boost/noncopyable.hpp>
#include <boost/thread.hpp>
#pragma warning(default:4005)
#include <boost/format.hpp>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <sal.h>
#include "AKSyncObjs.h"
#include "Queue.h"
/**
* @brief define log level
**/
enum LogLevel
{
log_level_debug,
log_level_info,
log_level_warn,
log_level_error,
log_level_msg
};
/**
* @brief define log target
**/
#define log_to_none 0
#define log_to_file 1
#define log_to_ods 2
#define log_to_con 3
bool
initialize_log(
_In_ LogLevel log_level,
_In_opt_z_ const wchar_t* log_file_path
);
void
finalize_log(
);
void
set_log_format(
_In_ bool show_process_name,
_In_ bool show_pid_tid,
_In_ bool show_function_name
);
void
log_write(
_In_ LogLevel log_level,
_In_ uint32_t log_to,
_In_z_ const char* function,
_In_z_ const char* log_message
);
void
log_write_fmt(
_In_ LogLevel log_level,
_In_ uint32_t log_to,
_In_z_ const char* function,
_In_z_ const char* fmt,
_In_ ...
);
/**
* @brief define macro for convenience
**/
#define log_err log_write_fmt( log_level_error, log_to_ods | log_to_file, __FUNCTION__,
#define log_warn log_write_fmt( log_level_warn, log_to_ods | log_to_file, __FUNCTION__,
#define log_info log_write_fmt( log_level_info, log_to_ods | log_to_file, __FUNCTION__,
#define log_dbg log_write_fmt( log_level_debug, log_to_ods | log_to_file, __FUNCTION__,
#define log_msg log_write_fmt( log_level_msg, log_to_ods | log_to_file, __FUNCTION__,
#define con_err log_write_fmt( log_level_error, log_to_con, __FUNCTION__,
#define con_warn log_write_fmt( log_level_warn, log_to_con, __FUNCTION__,
#define con_info log_write_fmt( log_level_info, log_to_con, __FUNCTION__,
#define con_dbg log_write_fmt( log_level_debug, log_to_con, __FUNCTION__,
#define con_msg log_write_fmt( log_level_msg, log_to_con, __FUNCTION__,
#define log_end );
#define con_end );
/**
* @brief logger_impl class
**/
typedef class slogger: private boost::noncopyable
{
public:
explicit slogger();
~slogger();
bool slog_start(_In_ LogLevel base_log_level, _In_opt_z_ const wchar_t *log_file_path);
void slog_stop();
LogLevel slog_get_base_log_level() { return _base_log_level; }
void slog_set_base_log_level(_In_ LogLevel base_log_level){ if (_base_log_level != base_log_level) _base_log_level = base_log_level; }
void slog_write(_In_ LogLevel level, _In_ uint32_t log_to, _In_z_ const char* log_message);
private:
bool volatile _stop_logger;
LogLevel _base_log_level;
CAbsSyncObjs* _lock;
class log_entry
{
public:
log_entry(uint32_t log_to, const char* log_message):_log_to(log_to), _msg(log_message){}
uint32_t _log_to;
std::string _msg;
};
Queue<log_entry> _log_queue;
boost::thread* _logger_thread;
HANDLE _log_file_handle;
void slog_thread();
} *pslogger;
#endif//_log_h_