logging: add libosmo-abis logging subsystems
[osmocom-bb.git] / include / osmocom / core / logging.h
1 #ifndef _OSMOCORE_LOGGING_H
2 #define _OSMOCORE_LOGGING_H
3
4 #include <stdio.h>
5 #include <stdint.h>
6 #include <osmocom/core/linuxlist.h>
7
8 #define LOG_MAX_CTX             8
9 #define LOG_MAX_FILTERS 8
10
11 #define DEBUG
12
13 #ifdef DEBUG
14 #define DEBUGP(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 0, fmt, ## args)
15 #define DEBUGPC(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 1, fmt, ## args)
16 #else
17 #define DEBUGP(xss, fmt, args...)
18 #define DEBUGPC(ss, fmt, args...)
19 #endif
20
21
22 void logp(int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
23
24 /* new logging interface */
25 #define LOGP(ss, level, fmt, args...) \
26         logp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
27 #define LOGPC(ss, level, fmt, args...) \
28         logp2(ss, level, __FILE__, __LINE__, 1, fmt, ##args)
29
30 /* different levels */
31 #define LOGL_DEBUG      1       /* debugging information */
32 #define LOGL_INFO       3
33 #define LOGL_NOTICE     5       /* abnormal/unexpected condition */
34 #define LOGL_ERROR      7       /* error condition, requires user action */
35 #define LOGL_FATAL      8       /* fatal, program aborted */
36
37 #define LOG_FILTER_ALL  0x0001
38
39 /* logging levels defined by the library itself */
40 #define DLGLOBAL        -1
41 #define DLLAPDM         -2
42 #define DINP            -3
43 #define DMUX            -4
44 #define DMI             -5
45 #define DMIB            -6
46 #define DRSL            -7
47 #define DNM             -8
48 #define OSMO_NUM_DLIB   9
49
50 struct log_category {
51         uint8_t loglevel;
52         uint8_t enabled;
53 };
54
55 struct log_info_cat {
56         const char *name;
57         const char *color;
58         const char *description;
59         uint8_t loglevel;
60         uint8_t enabled;
61 };
62
63 /* log context information, passed to filter */
64 struct log_context {
65         void *ctx[LOG_MAX_CTX+1];
66 };
67
68 struct log_target;
69
70 typedef int log_filter(const struct log_context *ctx,
71                        struct log_target *target);
72
73 struct log_info {
74         /* filter callback function */
75         log_filter *filter_fn;
76
77         /* per-category information */
78         struct log_info_cat *cat;
79         unsigned int num_cat;
80         unsigned int num_cat_user;
81 };
82
83 enum log_target_type {
84         LOG_TGT_TYPE_VTY,
85         LOG_TGT_TYPE_SYSLOG,
86         LOG_TGT_TYPE_FILE,
87         LOG_TGT_TYPE_STDERR,
88 };
89
90 struct log_target {
91         struct llist_head entry;
92
93         int filter_map;
94         void *filter_data[LOG_MAX_FILTERS+1];
95
96         struct log_category *categories;
97
98         uint8_t loglevel;
99         unsigned int use_color:1;
100         unsigned int print_timestamp:1;
101
102         enum log_target_type type;
103
104         union {
105                 struct {
106                         FILE *out;
107                         const char *fname;
108                 } tgt_file;
109
110                 struct {
111                         int priority;
112                         int facility;
113                 } tgt_syslog;
114
115                 struct {
116                         void *vty;
117                 } tgt_vty;
118         };
119
120         void (*output) (struct log_target *target, unsigned int level,
121                         const char *string);
122 };
123
124 /* use the above macros */
125 void logp2(int subsys, unsigned int level, char *file,
126            int line, int cont, const char *format, ...)
127                                 __attribute__ ((format (printf, 6, 7)));
128 int log_init(const struct log_info *inf, void *talloc_ctx);
129
130 /* context management */
131 void log_reset_context(void);
132 int log_set_context(uint8_t ctx, void *value);
133
134 /* filter on the targets */
135 void log_set_all_filter(struct log_target *target, int);
136
137 void log_set_use_color(struct log_target *target, int);
138 void log_set_print_timestamp(struct log_target *target, int);
139 void log_set_log_level(struct log_target *target, int log_level);
140 void log_parse_category_mask(struct log_target *target, const char* mask);
141 int log_parse_level(const char *lvl);
142 const char *log_level_str(unsigned int lvl);
143 int log_parse_category(const char *category);
144 void log_set_category_filter(struct log_target *target, int category,
145                                int enable, int level);
146
147 /* management of the targets */
148 struct log_target *log_target_create(void);
149 void log_target_destroy(struct log_target *target);
150 struct log_target *log_target_create_stderr(void);
151 struct log_target *log_target_create_file(const char *fname);
152 struct log_target *log_target_create_syslog(const char *ident, int option,
153                                             int facility);
154 int log_target_file_reopen(struct log_target *tgt);
155
156 void log_add_target(struct log_target *target);
157 void log_del_target(struct log_target *target);
158
159 /* Generate command string for VTY use */
160 const char *log_vty_command_string(const struct log_info *info);
161 const char *log_vty_command_description(const struct log_info *info);
162
163 struct log_target *log_target_find(int type, const char *fname);
164 extern struct llist_head osmo_log_target_list;
165
166 #endif /* _OSMOCORE_LOGGING_H */