-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlog.h
173 lines (147 loc) · 5.41 KB
/
log.h
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/**
*
* LightStringGraph
*
* Lightweight String Graph Construction.
*
* Copyright (C) 2013, 2014 Stefano Beretta, Yuri Pirola, Marco Previtali
*
* Distributed under the terms of the GNU General Public License (or the Lesser
* GPL).
*
* This file is part of LightStringGraph.
*
* LighStringGraph is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* LightStringGraph is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with LightStringGraph. If not, see <http://www.gnu.org/licenses/>.
*
**/
#ifndef _LOG_H_
#define _LOG_H_
#define LOG_LEVEL_FATAL (0)
#define LOG_LEVEL_ERROR (1)
#define LOG_LEVEL_WARN (2)
#define LOG_LEVEL_INFO (3)
#define LOG_LEVEL_DEBUG (4)
#define LOG_LEVEL_TRACE (5)
#define LOG_LEVEL_FINETRACE (6)
#ifndef LOG_THRESHOLD
#define LOG_THRESHOLD LOG_LEVEL_INFO
#endif
#ifndef LOG_PREFIX
#define LOG_PREFIX "* "
#endif
#endif // _LOG_H_
#ifdef LOG
#undef __INTERNAL_LOG
#undef LOG
#undef FATAL
#undef ERROR
#undef WARN
#undef INFO
#undef LDEBUG
#undef TRACE
#undef FINETRACE
#endif
#ifdef LOG_MSG
#include <string>
#include <iomanip>
#include <iostream>
#define MAX_LEN_FUNC_NAME 18
#define MAX_LEN_FILE_NAME 16
#define __LOG_PREFIXES__LOG_LEVEL_FATAL "FATAL"
#define __LOG_PREFIXES__LOG_LEVEL_ERROR "ERROR"
#define __LOG_PREFIXES__LOG_LEVEL_WARN "WARN "
#define __LOG_PREFIXES__LOG_LEVEL_INFO "INFO "
#define __LOG_PREFIXES__LOG_LEVEL_DEBUG "DEBUG"
#define __LOG_PREFIXES__LOG_LEVEL_TRACE "TRACE"
#define __LOG_PREFIXES__LOG_LEVEL_FINETRACE "FTRAC"
#define LOG(level, ...) __INTERNAL_LOG(level, __LOG_PREFIXES__ ## level, __VA_ARGS__, "")
#define ALWAYS_LOG(level, ...) __INTERNAL_ALWAYS_LOG(__LOG_PREFIXES__ ## level, __VA_ARGS__, "")
#define __INTERNAL_LOG(level, prefix, format, ...) do { \
if (level<=LOG_THRESHOLD) { \
__INTERNAL_ALWAYS_LOG(prefix, format, __VA_ARGS__); \
} \
} while (0)
#define __INTERNAL_ALWAYS_LOG(prefix, format, ...) do { \
time_t ttNow = time(NULL); \
tm tmNow = *localtime(&ttNow); \
std::string __str_func__=std::string(__func__); \
std::string __my_internal_funz__=__str_func__.substr(0,MAX_LEN_FUNC_NAME); \
std::string __str_FILE__=std::string(__FILE__); \
std::cerr << LOG_PREFIX << prefix << "("; \
std::cerr << std::setw(MAX_LEN_FUNC_NAME) << std::setfill(' '); \
std::cerr << std::left << __my_internal_funz__; \
std::cerr << ":"; \
std::cerr << std::setw(MAX_LEN_FILE_NAME) << std::setfill(' '); \
std::cerr << ((__str_FILE__.length() > MAX_LEN_FILE_NAME) ? \
__str_FILE__.substr(__str_FILE__.length()-MAX_LEN_FILE_NAME) : \
__str_FILE__); \
std::cerr << ":" << std::left << std::setw(4) << __LINE__ << std::right << ") "; \
std::cerr << std::setfill('0') << std::setw(2) << tmNow.tm_hour << ":"; \
std::cerr << std::setfill('0') << std::setw(2) << tmNow.tm_min << ":"; \
std::cerr << std::setfill('0') << std::setw(2) << tmNow.tm_sec << " | ";\
std::cerr << format << __VA_ARGS__ << std::endl; \
} while(0)
#else
#define LOG(level, prefix, ...) do { } while (0)
#define ALWAYS_LOG(level, prefix, ...) do { } while (0)
#endif
#if (LOG_LEVEL_FATAL <= LOG_THRESHOLD) && defined LOG_MSG
#define LOG_FATAL_ENABLED
#define FATAL(...) LOG(LOG_LEVEL_FATAL, __VA_ARGS__)
#else
#undef LOG_FATAL_ENABLED
#define FATAL(...) do { } while (0)
#endif
#if (LOG_LEVEL_ERROR <= LOG_THRESHOLD) && defined LOG_MSG
#define LOG_ERROR_ENABLED
#define ERROR(...) LOG(LOG_LEVEL_ERROR, __VA_ARGS__)
#else
#undef LOG_ERROR_ENABLED
#define ERROR(...) do { } while (0)
#endif
#if (LOG_LEVEL_WARN <= LOG_THRESHOLD) && defined LOG_MSG
#define LOG_WARN_ENABLED
#define WARN(...) LOG(LOG_LEVEL_WARN, __VA_ARGS__)
#else
#undef LOG_WARN_ENABLED
#define WARN(...) do { } while (0)
#endif
#if (LOG_LEVEL_INFO <= LOG_THRESHOLD) && defined LOG_MSG
#define LOG_INFO_ENABLED
#define INFO(...) LOG(LOG_LEVEL_INFO, __VA_ARGS__)
#else
#undef LOG_INFO_ENABLED
#define INFO(...) do { } while (0)
#endif
#if (LOG_LEVEL_DEBUG <= LOG_THRESHOLD) && defined LOG_MSG
#define LOG_DEBUG_ENABLED
#define LDEBUG(...) LOG(LOG_LEVEL_DEBUG, __VA_ARGS__)
#else
#undef LOG_DEBUG_ENABLED
#define LDEBUG(...) do { } while (0)
#endif
#if (LOG_LEVEL_TRACE <= LOG_THRESHOLD) && defined LOG_MSG
#define LOG_TRACE_ENABLED
#define TRACE(...) LOG(LOG_LEVEL_TRACE, __VA_ARGS__)
#else
#undef LOG_TRACE_ENABLED
#define TRACE(...) do { } while (0)
#endif
#if (LOG_LEVEL_FINETRACE <= LOG_THRESHOLD) && defined LOG_MSG
#define LOG_FINETRACE_ENABLED
#define FINETRACE(...) LOG(LOG_LEVEL_FINETRACE, __VA_ARGS__)
#else
#undef LOG_FINETRACE_ENABLED
#define FINETRACE(...) do { } while (0)
#endif