blob: 94762118eab7e761b204f32f451565efd9008b4d [file] [log] [blame]
Harald Welte3ae27582010-03-26 21:24:24 +08001#ifndef _OSMOCORE_LOGGING_H
2#define _OSMOCORE_LOGGING_H
3
Harald Welte18fc4652011-08-17 14:14:17 +02004/*! \defgroup logging Osmocom logging framework
5 * @{
Harald Weltebd598e32011-08-16 23:26:52 +02006 */
7
Harald Welte18fc4652011-08-17 14:14:17 +02008/*! \file logging.h */
9
Harald Welte3ae27582010-03-26 21:24:24 +080010#include <stdio.h>
11#include <stdint.h>
Pablo Neira Ayuso83419342011-03-22 16:36:13 +010012#include <osmocom/core/linuxlist.h>
Harald Welte3ae27582010-03-26 21:24:24 +080013
Harald Weltebd598e32011-08-16 23:26:52 +020014/*! \brief Maximum number of logging contexts */
Harald Welte3ae27582010-03-26 21:24:24 +080015#define LOG_MAX_CTX 8
Harald Weltebd598e32011-08-16 23:26:52 +020016/*! \brief Maximum number of logging filters */
Harald Welte3ae27582010-03-26 21:24:24 +080017#define LOG_MAX_FILTERS 8
18
19#define DEBUG
20
21#ifdef DEBUG
22#define DEBUGP(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 0, fmt, ## args)
23#define DEBUGPC(ss, fmt, args...) logp(ss, __FILE__, __LINE__, 1, fmt, ## args)
24#else
25#define DEBUGP(xss, fmt, args...)
26#define DEBUGPC(ss, fmt, args...)
27#endif
28
Harald Welte3ae27582010-03-26 21:24:24 +080029
Harald Welteb43bc042011-06-27 10:29:17 +020030void logp(int subsys, char *file, int line, int cont, const char *format, ...) __attribute__ ((format (printf, 5, 6)));
Harald Welte3ae27582010-03-26 21:24:24 +080031
Harald Weltebd598e32011-08-16 23:26:52 +020032/*! \brief Log a new message through the Osmocom logging framework
33 * \param[in] ss logging subsystem (e.g. \ref DLGLOBAL)
34 * \param[in] level logging level (e.g. \ref LOGL_NOTICE)
35 * \param[in] fmt format string
36 * \param[in] args variable argument list
37 */
Harald Welte3ae27582010-03-26 21:24:24 +080038#define LOGP(ss, level, fmt, args...) \
39 logp2(ss, level, __FILE__, __LINE__, 0, fmt, ##args)
Harald Weltebd598e32011-08-16 23:26:52 +020040
41/*! \brief Continue a log message through the Osmocom logging framework
42 * \param[in] ss logging subsystem (e.g. \ref DLGLOBAL)
43 * \param[in] level logging level (e.g. \ref LOGL_NOTICE)
44 * \param[in] fmt format string
45 * \param[in] args variable argument list
46 */
Harald Welte3ae27582010-03-26 21:24:24 +080047#define LOGPC(ss, level, fmt, args...) \
48 logp2(ss, level, __FILE__, __LINE__, 1, fmt, ##args)
49
Harald Welte18fc4652011-08-17 14:14:17 +020050/*! \brief different log levels */
51#define LOGL_DEBUG 1 /*!< \brief debugging information */
Harald Welte3ae27582010-03-26 21:24:24 +080052#define LOGL_INFO 3
Harald Welte18fc4652011-08-17 14:14:17 +020053#define LOGL_NOTICE 5 /*!< \brief abnormal/unexpected condition */
54#define LOGL_ERROR 7 /*!< \brief error condition, requires user action */
55#define LOGL_FATAL 8 /*!< \brief fatal, program aborted */
Harald Welte3ae27582010-03-26 21:24:24 +080056
57#define LOG_FILTER_ALL 0x0001
58
Harald Welteb43bc042011-06-27 10:29:17 +020059/* logging levels defined by the library itself */
60#define DLGLOBAL -1
Harald Welte1f0b8c22011-06-27 10:51:37 +020061#define DLLAPDM -2
Harald Welte892e6212011-07-19 14:31:44 +020062#define DLINP -3
63#define DLMUX -4
64#define DLMI -5
65#define DLMIB -6
Harald Welte2af43592011-07-29 15:12:41 +020066#define OSMO_NUM_DLIB 6
Harald Welteb43bc042011-06-27 10:29:17 +020067
Harald Welte3ae27582010-03-26 21:24:24 +080068struct log_category {
69 uint8_t loglevel;
70 uint8_t enabled;
71};
72
Harald Welte18fc4652011-08-17 14:14:17 +020073/*! \brief Information regarding one logging category */
Harald Welte3ae27582010-03-26 21:24:24 +080074struct log_info_cat {
Harald Welte18fc4652011-08-17 14:14:17 +020075 const char *name; /*!< name of category */
76 const char *color; /*!< color string for cateyory */
77 const char *description; /*!< description text */
78 uint8_t loglevel; /*!< currently selected log-level */
79 uint8_t enabled; /*!< is this category enabled or not */
Harald Welte3ae27582010-03-26 21:24:24 +080080};
81
Harald Welte18fc4652011-08-17 14:14:17 +020082/*! \brief Log context information, passed to filter */
Harald Welte3ae27582010-03-26 21:24:24 +080083struct log_context {
84 void *ctx[LOG_MAX_CTX+1];
85};
86
87struct log_target;
88
Harald Welte18fc4652011-08-17 14:14:17 +020089/*! \brief Log filter function */
Harald Welte3ae27582010-03-26 21:24:24 +080090typedef int log_filter(const struct log_context *ctx,
91 struct log_target *target);
92
Harald Welte18fc4652011-08-17 14:14:17 +020093/*! \brief Logging configuration, passed to \ref log_init */
Harald Welte3ae27582010-03-26 21:24:24 +080094struct log_info {
Harald Welte18fc4652011-08-17 14:14:17 +020095 /* \brief filter callback function */
Harald Welte3ae27582010-03-26 21:24:24 +080096 log_filter *filter_fn;
97
Harald Welte18fc4652011-08-17 14:14:17 +020098 /*! \brief per-category information */
Harald Welteb43bc042011-06-27 10:29:17 +020099 struct log_info_cat *cat;
Harald Welte18fc4652011-08-17 14:14:17 +0200100 /*! \brief total number of categories */
Harald Welte3ae27582010-03-26 21:24:24 +0800101 unsigned int num_cat;
Harald Welte18fc4652011-08-17 14:14:17 +0200102 /*! \brief total number of user categories (not library) */
Harald Welteb43bc042011-06-27 10:29:17 +0200103 unsigned int num_cat_user;
Harald Welte3ae27582010-03-26 21:24:24 +0800104};
105
Harald Welte18fc4652011-08-17 14:14:17 +0200106/*! \brief Type of logging target */
Harald Welte28222962011-02-18 20:37:04 +0100107enum log_target_type {
Harald Welte18fc4652011-08-17 14:14:17 +0200108 LOG_TGT_TYPE_VTY, /*!< \brief VTY logging */
109 LOG_TGT_TYPE_SYSLOG, /*!< \brief syslog based logging */
110 LOG_TGT_TYPE_FILE, /*!< \brief text file logging */
111 LOG_TGT_TYPE_STDERR, /*!< \brief stderr logging */
Harald Welte28222962011-02-18 20:37:04 +0100112};
113
Harald Welte18fc4652011-08-17 14:14:17 +0200114/*! \brief structure representing a logging target */
Harald Welte3ae27582010-03-26 21:24:24 +0800115struct log_target {
Harald Welte18fc4652011-08-17 14:14:17 +0200116 struct llist_head entry; /*!< \brief linked list */
Harald Welte3ae27582010-03-26 21:24:24 +0800117
Harald Welte18fc4652011-08-17 14:14:17 +0200118 /*! \brief Internal data for filtering */
Harald Welte3ae27582010-03-26 21:24:24 +0800119 int filter_map;
Harald Welte18fc4652011-08-17 14:14:17 +0200120 /*! \brief Internal data for filtering */
Harald Welte3ae27582010-03-26 21:24:24 +0800121 void *filter_data[LOG_MAX_FILTERS+1];
122
Harald Welte18fc4652011-08-17 14:14:17 +0200123 /*! \brief logging categories */
Harald Welteb43bc042011-06-27 10:29:17 +0200124 struct log_category *categories;
125
Harald Welte18fc4652011-08-17 14:14:17 +0200126 /*! \brief global log level */
Harald Welte3ae27582010-03-26 21:24:24 +0800127 uint8_t loglevel;
Harald Welte18fc4652011-08-17 14:14:17 +0200128 /*! \brief should color be used when printing log messages? */
Harald Welte87dbca12011-07-16 11:57:53 +0200129 unsigned int use_color:1;
Harald Welte18fc4652011-08-17 14:14:17 +0200130 /*! \brief should log messages be prefixed with a timestamp? */
Harald Welte87dbca12011-07-16 11:57:53 +0200131 unsigned int print_timestamp:1;
Harald Welte3ae27582010-03-26 21:24:24 +0800132
Harald Welte18fc4652011-08-17 14:14:17 +0200133 /*! \brief the type of this log taget */
Harald Welte28222962011-02-18 20:37:04 +0100134 enum log_target_type type;
135
Harald Welte3ae27582010-03-26 21:24:24 +0800136 union {
137 struct {
138 FILE *out;
Harald Welte72d0c532010-08-25 19:24:00 +0200139 const char *fname;
Harald Welte0083cd32010-08-25 14:55:44 +0200140 } tgt_file;
Harald Welte3ae27582010-03-26 21:24:24 +0800141
142 struct {
143 int priority;
Harald Welte28222962011-02-18 20:37:04 +0100144 int facility;
Harald Welte3ae27582010-03-26 21:24:24 +0800145 } tgt_syslog;
146
147 struct {
148 void *vty;
149 } tgt_vty;
150 };
151
Harald Welte18fc4652011-08-17 14:14:17 +0200152 /*! \brief call-back function to be called when the logging framework
153 * wants to log somethnig.
154 * \param[[in] target logging target
155 * \param[in] level log level of currnet message
156 * \param[in] string the string that is to be written to the log
157 */
Harald Welte76e72ab2011-02-17 15:52:39 +0100158 void (*output) (struct log_target *target, unsigned int level,
159 const char *string);
Harald Welte3ae27582010-03-26 21:24:24 +0800160};
161
162/* use the above macros */
Harald Welteb43bc042011-06-27 10:29:17 +0200163void logp2(int subsys, unsigned int level, char *file,
Harald Welte3ae27582010-03-26 21:24:24 +0800164 int line, int cont, const char *format, ...)
165 __attribute__ ((format (printf, 6, 7)));
Harald Welteb43bc042011-06-27 10:29:17 +0200166int log_init(const struct log_info *inf, void *talloc_ctx);
Harald Welte3ae27582010-03-26 21:24:24 +0800167
168/* context management */
169void log_reset_context(void);
170int log_set_context(uint8_t ctx, void *value);
171
172/* filter on the targets */
173void log_set_all_filter(struct log_target *target, int);
174
175void log_set_use_color(struct log_target *target, int);
176void log_set_print_timestamp(struct log_target *target, int);
177void log_set_log_level(struct log_target *target, int log_level);
178void log_parse_category_mask(struct log_target *target, const char* mask);
179int log_parse_level(const char *lvl);
Harald Welte9ac22252010-05-11 11:19:40 +0200180const char *log_level_str(unsigned int lvl);
Harald Welte3ae27582010-03-26 21:24:24 +0800181int log_parse_category(const char *category);
182void log_set_category_filter(struct log_target *target, int category,
183 int enable, int level);
184
185/* management of the targets */
186struct log_target *log_target_create(void);
Harald Welte72d0c532010-08-25 19:24:00 +0200187void log_target_destroy(struct log_target *target);
Harald Welte3ae27582010-03-26 21:24:24 +0800188struct log_target *log_target_create_stderr(void);
Harald Welte72d0c532010-08-25 19:24:00 +0200189struct log_target *log_target_create_file(const char *fname);
Harald Welte46cfd772011-02-17 15:56:56 +0100190struct log_target *log_target_create_syslog(const char *ident, int option,
191 int facility);
Harald Welte72d0c532010-08-25 19:24:00 +0200192int log_target_file_reopen(struct log_target *tgt);
193
Harald Welte3ae27582010-03-26 21:24:24 +0800194void log_add_target(struct log_target *target);
195void log_del_target(struct log_target *target);
196
Pablo Neira Ayuso04139f12011-03-09 13:05:08 +0100197/* Generate command string for VTY use */
198const char *log_vty_command_string(const struct log_info *info);
199const char *log_vty_command_description(const struct log_info *info);
Harald Welte7638af92010-05-11 16:39:22 +0200200
Harald Welte28222962011-02-18 20:37:04 +0100201struct log_target *log_target_find(int type, const char *fname);
202extern struct llist_head osmo_log_target_list;
203
Harald Welte18fc4652011-08-17 14:14:17 +0200204/*! }@ */
205
Harald Welte3ae27582010-03-26 21:24:24 +0800206#endif /* _OSMOCORE_LOGGING_H */