This repository has been archived by the owner on Aug 6, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
log.h
151 lines (132 loc) · 3.74 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
/*
* In The Name Of God
* ========================================
* [] File Name : common.h
*
* [] Creation Date : 21-12-2014
*
* [] Created By : Parham Alvani ([email protected])
* =======================================
*/
/*
* Copyright (c) 2014 Parham Alvani.
*/
#ifndef LOG_H
#define LOG_H
/*
* global logger :)
* if you want global logging
* use global_log_create() function.
*/
extern struct logger *LOGGER;
/*
* Logger structure that contains
* log buffer, log buffer size and
* log sink FILE.
*/
struct logger {
FILE *sink;
char *log_buffer;
size_t buffer_size;
};
/*
* Use as the max log level
* to switch logging off
*/
#define LOG_LEVEL_NONE 0
/*
* Use for severe errors that
* cause premature program
* termination
*/
#define LOG_LEVEL_FATAL 1
/*
* Use for runtime errors or
* unexpected conditions that
* the program might gracefully
* recover from
*/
#define LOG_LEVEL_ERROR 2
/*
* Use for unexpected or
* undesirable runtime conditions
* that are not necessarily
* affecting the program
*/
#define LOG_LEVEL_WARN 3
/*
* Use for important or interesting
* runtime events that help
* understanding what the program
* is doing
*/
#define LOG_LEVEL_INFO 4
/*
* Use to log detailed information
* on the logic flow through
* the system
*/
#define LOG_LEVEL_DEBUG 5
/*
* Use to log most detailed information
* intended for development
* and debugging purposes only
*/
#define LOG_LEVEL_TRACE 6
#ifndef MAX_LOG_LEVEL
/*
* Use KAA_LOG_TRACE as the max
* log level by default
*/
#define MAX_LOG_LEVEL KAA_LOG_LEVEL_TRACE
#endif
#define LOG_LEVEL_FATAL_ENABLED (MAX_LOG_LEVEL >= LOG_LEVEL_FATAL)
#define LOG_LEVEL_ERROR_ENABLED (MAX_LOG_LEVEL >= LOG_LEVEL_ERROR)
#define LOG_LEVEL_WARN_ENABLED (MAX_LOG_LEVEL >= LOG_LEVEL_WARN)
#define LOG_LEVEL_INFO_ENABLED (MAX_LOG_LEVEL >= LOG_LEVEL_INFO)
#define LOG_LEVEL_DEBUG_ENABLED (MAX_LOG_LEVEL >= LOG_LEVEL_DEBUG)
#define LOG_LEVEL_TRACE_ENABLED (MAX_LOG_LEVEL >= LOG_LEVEL_TRACE)
int log_create(struct logger **logger_p, size_t buffer_size, FILE *sink);
int log_global_create(size_t buffer_size, FILE *sink);
void sdie(struct logger *self, const char *source_file, int lineno, const char *fmt, ...)
__attribute__((format(printf, 4, 5)));
void udie(struct logger *self, const char *source_file, int lineno, const char *fmt, ...)
__attribute__((format(printf, 4, 5)));
void ulog(struct logger *self, const char *source_file, int lineno, int log_level, const char *fmt, ...)
__attribute__((format(printf, 5, 6)));
void slog(struct logger *self, const char *source_file, int lineno, int log_level, const char *fmt, ...)
__attribute__((format(printf, 5, 6)));
/*
* Shortcut macros for logging at various log levels
*/
#if LOG_LEVEL_FATAL_ENABLED
#define LOG_FATAL(logger, fmt, ...) ulog(logger, __FILE__, __LINE__, KAA_LOG_LEVEL_FATAL, fmt, ## __VA_ARGS__)
#else
#define LOG_FATAL(...)
#endif
#if LOG_LEVEL_ERROR_ENABLED
#define LOG_ERROR(logger, fmt, ...) ulog(logger, __FILE__, __LINE__, KAA_LOG_LEVEL_ERROR, fmt, ## __VA_ARGS__)
#else
#define LOG_ERROR(...)
#endif
#if LOG_LEVEL_WARN_ENABLED
#define LOG_WARN(logger, fmt, ...) ulog(logger, __FILE__, __LINE__, KAA_LOG_LEVEL_WARN, fmt, ## __VA_ARGS__)
#else
#define LOG_WARN(...)
#endif
#if LOG_LEVEL_INFO_ENABLED
#define LOG_INFO(logger, fmt, ...) ulog(logger, __FILE__, __LINE__, KAA_LOG_LEVEL_INFO, fmt, ## __VA_ARGS__)
#else
#define LOG_INFO(...)
#endif
#if LOG_LEVEL_DEBUG_ENABLED
#define LOG_DEBUG(logger, fmt, ...) ulog(logger, __FILE__, __LINE__, KAA_LOG_LEVEL_DEBUG, fmt, ## __VA_ARGS__)
#else
#define LOG_DEBUG(...)
#endif
#if LOG_LEVEL_TRACE_ENABLED
#define LOG_TRACE(logger, fmt, ...) ulog(logger, __FILE__, __LINE__, KAA_LOG_LEVEL_TRACE, fmt, ## __VA_ARGS__)
#else
#define LOG_TRACE(...)
#endif
#endif