aboutsummaryrefslogtreecommitdiffstats
path: root/src/verbose.h
blob: a7f5f146e77768b2bef3209e90db78e7abc655ef (plain)
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
/*
 Copyright (C) 2015-2020 "IoT.bzh"

 author: José Bollo <jose.bollo@iot.bzh>

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
*/

#pragma once

#include <stdarg.h>

/*
  verbosity tune the count of reported messages

   verbosity value : reported messages
   ----------------+------------------------
    lesser than 0  : no message at all
         0         : ERROR
         1         : ERROR, WARNING
         2         : ERROR, WARNING, NOTICE
         3         : ERROR, WARNING, NOTICE, INFO
    greater than 3 : ERROR, WARNING, NOTICE, INFO, DEBUG

extern int verbosity;

enum verbosity_levels
{
	Verbosity_Level_Error = 0,
	Verbosity_Level_Warning = 1,
	Verbosity_Level_Notice = 2,
	Verbosity_Level_Info = 3,
	Verbosity_Level_Debug = 4
};
*/

extern void verbose_set_name(const char *name, int authority);

/*
 Log level is defined by syslog standard:
       KERN_EMERG             0        System is unusable
       KERN_ALERT             1        Action must be taken immediately
       KERN_CRIT              2        Critical conditions
       KERN_ERR               3        Error conditions
       KERN_WARNING           4        Warning conditions
       KERN_NOTICE            5        Normal but significant condition
       KERN_INFO              6        Informational
       KERN_DEBUG             7        Debug-level messages
*/

enum
{
	Log_Level_Emergency = 0,
	Log_Level_Alert = 1,
	Log_Level_Critical = 2,
	Log_Level_Error = 3,
	Log_Level_Warning = 4,
	Log_Level_Notice = 5,
	Log_Level_Info = 6,
	Log_Level_Debug = 7
};

extern int logmask;

extern void verbose(int loglevel, const char *file, int line, const char *function, const char *fmt, ...) __attribute__((format(printf, 5, 6)));
extern void vverbose(int loglevel, const char *file, int line, const char *function, const char *fmt, va_list args);

#if defined(VERBOSE_NO_DATA)
# define __VERBOSE__(lvl,...)      do{if((lvl)<=Log_Level_Error) verbose(lvl, __FILE__, __LINE__, NULL, __VA_ARGS__)\
					else verbose(lvl, __FILE__, __LINE__, NULL, NULL);}while(0)
#elif defined(VERBOSE_NO_DETAILS)
# define __VERBOSE__(lvl,...)      verbose(lvl, NULL, 0, NULL, __VA_ARGS__)
#else
# define __VERBOSE__(lvl,...)      verbose(lvl, __FILE__, __LINE__, __func__, __VA_ARGS__)
#endif

#define _LOGMASK_(lvl)		((lvl) < 0 ? -1 : (1 << (lvl)))
#define _WANTLOG_(lvl)		(logmask & _LOGMASK_(lvl))
#define _VERBOSE_(lvl,...)	do{ if (_WANTLOG_(lvl)) __VERBOSE__((lvl), __VA_ARGS__); } while(0)

#define EMERGENCY(...)            _VERBOSE_(Log_Level_Emergency, __VA_ARGS__)
#define ALERT(...)                _VERBOSE_(Log_Level_Alert, __VA_ARGS__)
#define CRITICAL(...)             _VERBOSE_(Log_Level_Critical, __VA_ARGS__)
#define ERROR(...)                _VERBOSE_(Log_Level_Error, __VA_ARGS__)
#define WARNING(...)              _VERBOSE_(Log_Level_Warning, __VA_ARGS__)
#define NOTICE(...)               _VERBOSE_(Log_Level_Notice, __VA_ARGS__)
#define INFO(...)                 _VERBOSE_(Log_Level_Info, __VA_ARGS__)
#define DEBUG(...)                _VERBOSE_(Log_Level_Debug, __VA_ARGS__)

#define LOGUSER(app)              verbose_set_name(app,0)
#define LOGAUTH(app)              verbose_set_name(app,1)

extern void (*verbose_observer)(int loglevel, const char *file, int line, const char *function, const char *fmt, va_list args);

static inline int verbose_wants(int lvl) { return _WANTLOG_(lvl); }

extern void verbose_dec();
extern void verbose_inc();
extern void verbose_clear();
extern void verbose_add(int level);
extern void verbose_sub(int level);
extern void verbose_colorize();
extern int verbose_is_colorized();

extern int verbose_level_of_name(const char *name);
extern const char *verbose_name_of_level(int level);

#define _DEVERBOSITY_(vlvl)	((vlvl) + Log_Level_Error)
#define _VERBOSITY_(llvl)	((llvl) - Log_Level_Error)
extern int verbosity_get();
extern void verbosity_set(int verbo);
extern int verbosity_from_mask(int mask);
extern int verbosity_to_mask(int verbo);

#define COLOR_EMERGENCY	"\x1B[101m"
#define COLOR_ALERT	"\x1B[43m"
#define COLOR_CRITICAL	"\x1B[41m"
#define COLOR_ERROR	"\x1B[91m"
#define COLOR_WARNING	"\x1B[93m"
#define COLOR_NOTICE	"\x1B[94m"
#define COLOR_INFO	"\x1B[96m"
#define COLOR_DEBUG	"\x1B[95m"
#define COLOR_API	"\x1B[1m"
#define COLOR_FILE	"\x1B[90m"
#define COLOR_DEFAULT	"\x1B[0m"