blob: 537dc6091d47ee560a5d8dd86e8a159efa1159bc [file] [log] [blame]
Harald Welte3ae27582010-03-26 21:24:24 +08001#ifndef _OSMOCORE_LOGGING_H
2#define _OSMOCORE_LOGGING_H
3
Harald Weltebd598e32011-08-16 23:26:52 +02004/*! \file logging.h
5 * \brief Osmocom logging framework
6 */
7
Harald Welte3ae27582010-03-26 21:24:24 +08008#include <stdio.h>
9#include <stdint.h>
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010010#include <osmocom/core/linuxlist.h>
Harald Welte3ae27582010-03-26 21:24:24 +080011
Harald Weltebd598e32011-08-16 23:26:52 +020012/*! \brief Maximum number of logging contexts */
Harald Welte3ae27582010-03-26 21:24:24 +080013#define LOG_MAX_CTX 8
Harald Weltebd598e32011-08-16 23:26:52 +020014/*! \brief Maximum number of logging filters */
Harald Welte3ae27582010-03-26 21:24:24 +080015#define LOG_MAX_FILTERS 8
16
17#define DEBUG
18
19#ifdef DEBUG
20#define DEBUGP(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 0, fmt, ## args)
21#define DEBUGPC(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 1, fmt, ## args)
22#else
23#define DEBUGP(xss, fmt, args...)
24#define DEBUGPC(ss, fmt, args...)
25#endif
26
Harald Welte3ae27582010-03-26 21:24:24 +080027
Harald Welteb43bc042011-06-27 10:29:17 +020028void logp(int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
Harald Welte3ae27582010-03-26 21:24:24 +080029
Harald Weltebd598e32011-08-16 23:26:52 +020030/*! \brief Log a new message through the Osmocom logging framework
31 * \param[in] ss logging subsystem (e.g. \ref DLGLOBAL)
32 * \param[in] level logging level (e.g. \ref LOGL_NOTICE)
33 * \param[in] fmt format string
34 * \param[in] args variable argument list
35 */
Harald Welte3ae27582010-03-26 21:24:24 +080036#define LOGP(ss, level, fmt, args...) \
37 logp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
Harald Weltebd598e32011-08-16 23:26:52 +020038
39/*! \brief Continue a log message through the Osmocom logging framework
40 * \param[in] ss logging subsystem (e.g. \ref DLGLOBAL)
41 * \param[in] level logging level (e.g. \ref LOGL_NOTICE)
42 * \param[in] fmt format string
43 * \param[in] args variable argument list
44 */
Harald Welte3ae27582010-03-26 21:24:24 +080045#define LOGPC(ss, level, fmt, args...) \
46 logp2(ss, level, __FILE__, __LINE__, 1, fmt, ##args)
47
48/* different levels */
49#define LOGL_DEBUG 1 /* debugging information */
50#define LOGL_INFO 3
51#define LOGL_NOTICE 5 /* abnormal/unexpected condition */
52#define LOGL_ERROR 7 /* error condition, requires user action */
53#define LOGL_FATAL 8 /* fatal, program aborted */
54
55#define LOG_FILTER_ALL 0x0001
56
Harald Welteb43bc042011-06-27 10:29:17 +020057/* logging levels defined by the library itself */
58#define DLGLOBAL -1
Harald Welte1f0b8c22011-06-27 10:51:37 +020059#define DLLAPDM -2
Harald Welte892e6212011-07-19 14:31:44 +020060#define DLINP -3
61#define DLMUX -4
62#define DLMI -5
63#define DLMIB -6
Harald Welte2af43592011-07-29 15:12:41 +020064#define OSMO_NUM_DLIB 6
Harald Welteb43bc042011-06-27 10:29:17 +020065
Harald Welte3ae27582010-03-26 21:24:24 +080066struct log_category {
67 uint8_t loglevel;
68 uint8_t enabled;
69};
70
71struct log_info_cat {
72 const char *name;
73 const char *color;
74 const char *description;
75 uint8_t loglevel;
76 uint8_t enabled;
77};
78
79/* log context information, passed to filter */
80struct log_context {
81 void *ctx[LOG_MAX_CTX+1];
82};
83
84struct log_target;
85
86typedef int log_filter(const struct log_context *ctx,
87 struct log_target *target);
88
89struct log_info {
90 /* filter callback function */
91 log_filter *filter_fn;
92
93 /* per-category information */
Harald Welteb43bc042011-06-27 10:29:17 +020094 struct log_info_cat *cat;
Harald Welte3ae27582010-03-26 21:24:24 +080095 unsigned int num_cat;
Harald Welteb43bc042011-06-27 10:29:17 +020096 unsigned int num_cat_user;
Harald Welte3ae27582010-03-26 21:24:24 +080097};
98
Harald Welte28222962011-02-18 20:37:04 +010099enum log_target_type {
100 LOG_TGT_TYPE_VTY,
101 LOG_TGT_TYPE_SYSLOG,
102 LOG_TGT_TYPE_FILE,
103 LOG_TGT_TYPE_STDERR,
104};
105
Harald Welte3ae27582010-03-26 21:24:24 +0800106struct log_target {
107 struct llist_head entry;
108
109 int filter_map;
110 void *filter_data[LOG_MAX_FILTERS+1];
111
Harald Welteb43bc042011-06-27 10:29:17 +0200112 struct log_category *categories;
113
Harald Welte3ae27582010-03-26 21:24:24 +0800114 uint8_t loglevel;
Harald Welte87dbca12011-07-16 11:57:53 +0200115 unsigned int use_color:1;
116 unsigned int print_timestamp:1;
Harald Welte3ae27582010-03-26 21:24:24 +0800117
Harald Welte28222962011-02-18 20:37:04 +0100118 enum log_target_type type;
119
Harald Welte3ae27582010-03-26 21:24:24 +0800120 union {
121 struct {
122 FILE *out;
Harald Welte72d0c532010-08-25 19:24:00 +0200123 const char *fname;
Harald Welte0083cd32010-08-25 14:55:44 +0200124 } tgt_file;
Harald Welte3ae27582010-03-26 21:24:24 +0800125
126 struct {
127 int priority;
Harald Welte28222962011-02-18 20:37:04 +0100128 int facility;
Harald Welte3ae27582010-03-26 21:24:24 +0800129 } tgt_syslog;
130
131 struct {
132 void *vty;
133 } tgt_vty;
134 };
135
Harald Welte76e72ab2011-02-17 15:52:39 +0100136 void (*output) (struct log_target *target, unsigned int level,
137 const char *string);
Harald Welte3ae27582010-03-26 21:24:24 +0800138};
139
140/* use the above macros */
Harald Welteb43bc042011-06-27 10:29:17 +0200141void logp2(int subsys, unsigned int level, char *file,
Harald Welte3ae27582010-03-26 21:24:24 +0800142 int line, int cont, const char *format, ...)
143 __attribute__ ((format (printf, 6, 7)));
Harald Welteb43bc042011-06-27 10:29:17 +0200144int log_init(const struct log_info *inf, void *talloc_ctx);
Harald Welte3ae27582010-03-26 21:24:24 +0800145
146/* context management */
147void log_reset_context(void);
148int log_set_context(uint8_t ctx, void *value);
149
150/* filter on the targets */
151void log_set_all_filter(struct log_target *target, int);
152
153void log_set_use_color(struct log_target *target, int);
154void log_set_print_timestamp(struct log_target *target, int);
155void log_set_log_level(struct log_target *target, int log_level);
156void log_parse_category_mask(struct log_target *target, const char* mask);
157int log_parse_level(const char *lvl);
Harald Welte9ac22252010-05-11 11:19:40 +0200158const char *log_level_str(unsigned int lvl);
Harald Welte3ae27582010-03-26 21:24:24 +0800159int log_parse_category(const char *category);
160void log_set_category_filter(struct log_target *target, int category,
161 int enable, int level);
162
163/* management of the targets */
164struct log_target *log_target_create(void);
Harald Welte72d0c532010-08-25 19:24:00 +0200165void log_target_destroy(struct log_target *target);
Harald Welte3ae27582010-03-26 21:24:24 +0800166struct log_target *log_target_create_stderr(void);
Harald Welte72d0c532010-08-25 19:24:00 +0200167struct log_target *log_target_create_file(const char *fname);
Harald Welte46cfd772011-02-17 15:56:56 +0100168struct log_target *log_target_create_syslog(const char *ident, int option,
169 int facility);
Harald Welte72d0c532010-08-25 19:24:00 +0200170int log_target_file_reopen(struct log_target *tgt);
171
Harald Weltebd598e32011-08-16 23:26:52 +0200172/*! \brief Add a new logging target
173 */
Harald Welte3ae27582010-03-26 21:24:24 +0800174void log_add_target(struct log_target *target);
Harald Weltebd598e32011-08-16 23:26:52 +0200175
176/*! \brief Deelete an existing logging target
177 */
Harald Welte3ae27582010-03-26 21:24:24 +0800178void log_del_target(struct log_target *target);
179
Pablo Neira Ayuso04139f12011-03-09 13:05:08 +0100180/* Generate command string for VTY use */
181const char *log_vty_command_string(const struct log_info *info);
182const char *log_vty_command_description(const struct log_info *info);
Harald Welte7638af92010-05-11 16:39:22 +0200183
Harald Welte28222962011-02-18 20:37:04 +0100184struct log_target *log_target_find(int type, const char *fname);
185extern struct llist_head osmo_log_target_list;
186
Harald Welte3ae27582010-03-26 21:24:24 +0800187#endif /* _OSMOCORE_LOGGING_H */