blob: db029402b4720da918ea1f11d9e581fec547cb30 [file] [log] [blame]
Harald Welte3ae27582010-03-26 21:24:24 +08001#ifndef _OSMOCORE_LOGGING_H
2#define _OSMOCORE_LOGGING_H
3
4#include <stdio.h>
5#include <stdint.h>
Pablo Neira Ayuso83419342011-03-22 16:36:13 +01006#include <osmocom/core/linuxlist.h>
Harald Welte3ae27582010-03-26 21:24:24 +08007
8#define LOG_MAX_CATEGORY 32
9#define LOG_MAX_CTX 8
10#define LOG_MAX_FILTERS 8
11
12#define DEBUG
13
14#ifdef DEBUG
15#define DEBUGP(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 0, fmt, ## args)
16#define DEBUGPC(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 1, fmt, ## args)
17#else
18#define DEBUGP(xss, fmt, args...)
19#define DEBUGPC(ss, fmt, args...)
20#endif
21
Harald Welte3ae27582010-03-26 21:24:24 +080022
Harald Welte3ae27582010-03-26 21:24:24 +080023void logp(unsigned int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
24
25/* new logging interface */
26#define LOGP(ss, level, fmt, args...) \
27 logp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
28#define LOGPC(ss, level, fmt, args...) \
29 logp2(ss, level, __FILE__, __LINE__, 1, fmt, ##args)
30
31/* different levels */
32#define LOGL_DEBUG 1 /* debugging information */
33#define LOGL_INFO 3
34#define LOGL_NOTICE 5 /* abnormal/unexpected condition */
35#define LOGL_ERROR 7 /* error condition, requires user action */
36#define LOGL_FATAL 8 /* fatal, program aborted */
37
38#define LOG_FILTER_ALL 0x0001
39
40struct log_category {
41 uint8_t loglevel;
42 uint8_t enabled;
43};
44
45struct log_info_cat {
46 const char *name;
47 const char *color;
48 const char *description;
49 uint8_t loglevel;
50 uint8_t enabled;
51};
52
53/* log context information, passed to filter */
54struct log_context {
55 void *ctx[LOG_MAX_CTX+1];
56};
57
58struct log_target;
59
60typedef int log_filter(const struct log_context *ctx,
61 struct log_target *target);
62
63struct log_info {
64 /* filter callback function */
65 log_filter *filter_fn;
66
67 /* per-category information */
68 const struct log_info_cat *cat;
69 unsigned int num_cat;
70};
71
Harald Welte28222962011-02-18 20:37:04 +010072enum log_target_type {
73 LOG_TGT_TYPE_VTY,
74 LOG_TGT_TYPE_SYSLOG,
75 LOG_TGT_TYPE_FILE,
76 LOG_TGT_TYPE_STDERR,
77};
78
Harald Welte3ae27582010-03-26 21:24:24 +080079struct log_target {
80 struct llist_head entry;
81
82 int filter_map;
83 void *filter_data[LOG_MAX_FILTERS+1];
84
85 struct log_category categories[LOG_MAX_CATEGORY+1];
86 uint8_t loglevel;
87 int use_color:1;
88 int print_timestamp:1;
89
Harald Welte28222962011-02-18 20:37:04 +010090 enum log_target_type type;
91
Harald Welte3ae27582010-03-26 21:24:24 +080092 union {
93 struct {
94 FILE *out;
Harald Welte72d0c532010-08-25 19:24:00 +020095 const char *fname;
Harald Welte0083cd32010-08-25 14:55:44 +020096 } tgt_file;
Harald Welte3ae27582010-03-26 21:24:24 +080097
98 struct {
99 int priority;
Harald Welte28222962011-02-18 20:37:04 +0100100 int facility;
Harald Welte3ae27582010-03-26 21:24:24 +0800101 } tgt_syslog;
102
103 struct {
104 void *vty;
105 } tgt_vty;
106 };
107
Harald Welte76e72ab2011-02-17 15:52:39 +0100108 void (*output) (struct log_target *target, unsigned int level,
109 const char *string);
Harald Welte3ae27582010-03-26 21:24:24 +0800110};
111
112/* use the above macros */
113void logp2(unsigned int subsys, unsigned int level, char *file,
114 int line, int cont, const char *format, ...)
115 __attribute__ ((format (printf, 6, 7)));
116void log_init(const struct log_info *cat);
117
118/* context management */
119void log_reset_context(void);
120int log_set_context(uint8_t ctx, void *value);
121
122/* filter on the targets */
123void log_set_all_filter(struct log_target *target, int);
124
125void log_set_use_color(struct log_target *target, int);
126void log_set_print_timestamp(struct log_target *target, int);
127void log_set_log_level(struct log_target *target, int log_level);
128void log_parse_category_mask(struct log_target *target, const char* mask);
129int log_parse_level(const char *lvl);
Harald Welte9ac22252010-05-11 11:19:40 +0200130const char *log_level_str(unsigned int lvl);
Harald Welte3ae27582010-03-26 21:24:24 +0800131int log_parse_category(const char *category);
132void log_set_category_filter(struct log_target *target, int category,
133 int enable, int level);
134
135/* management of the targets */
136struct log_target *log_target_create(void);
Harald Welte72d0c532010-08-25 19:24:00 +0200137void log_target_destroy(struct log_target *target);
Harald Welte3ae27582010-03-26 21:24:24 +0800138struct log_target *log_target_create_stderr(void);
Harald Welte72d0c532010-08-25 19:24:00 +0200139struct log_target *log_target_create_file(const char *fname);
Harald Welte46cfd772011-02-17 15:56:56 +0100140struct log_target *log_target_create_syslog(const char *ident, int option,
141 int facility);
Harald Welte72d0c532010-08-25 19:24:00 +0200142int log_target_file_reopen(struct log_target *tgt);
143
Harald Welte3ae27582010-03-26 21:24:24 +0800144void log_add_target(struct log_target *target);
145void log_del_target(struct log_target *target);
146
Pablo Neira Ayuso04139f12011-03-09 13:05:08 +0100147/* Generate command string for VTY use */
148const char *log_vty_command_string(const struct log_info *info);
149const char *log_vty_command_description(const struct log_info *info);
Harald Welte7638af92010-05-11 16:39:22 +0200150
Harald Welte28222962011-02-18 20:37:04 +0100151struct log_target *log_target_find(int type, const char *fname);
152extern struct llist_head osmo_log_target_list;
153
Harald Welte3ae27582010-03-26 21:24:24 +0800154#endif /* _OSMOCORE_LOGGING_H */