Merged revisions 85533 via svnmerge from
[asterisk/asterisk.git] / include / asterisk / logger.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*!
20   \file logger.h
21   \brief Support for logging to various files, console and syslog
22         Configuration in file logger.conf
23 */
24
25 #ifndef _ASTERISK_LOGGER_H
26 #define _ASTERISK_LOGGER_H
27
28 #include "asterisk/compat.h"
29 #include "asterisk/options.h"
30
31 #include <stdarg.h>
32
33 #if defined(__cplusplus) || defined(c_plusplus)
34 extern "C" {
35 #endif
36
37 #define EVENTLOG "event_log"
38 #define QUEUELOG        "queue_log"
39
40 #define DEBUG_M(a) { \
41         a; \
42 }
43
44 #define VERBOSE_PREFIX_1 " "
45 #define VERBOSE_PREFIX_2 "  == "
46 #define VERBOSE_PREFIX_3 "    -- "
47 #define VERBOSE_PREFIX_4 "       > "
48
49 /*! Used for sending a log message */
50 /*!
51         \brief This is the standard logger function.  Probably the only way you will invoke it would be something like this:
52         ast_log(LOG_WHATEVER, "Problem with the %s Captain.  We should get some more.  Will %d be enough?\n", "flux capacitor", 10);
53         where WHATEVER is one of ERROR, DEBUG, EVENT, NOTICE, or WARNING depending
54         on which log you wish to output to. These are implemented as macros, that
55         will provide the function with the needed arguments.
56
57         \param level    Type of log event
58         \param file     Will be provided by the LOG_* macro
59         \param line     Will be provided by the LOG_* macro
60         \param function Will be provided by the LOG_* macro
61         \param fmt      This is what is important.  The format is the same as your favorite breed of printf.  You know how that works, right? :-)
62  */
63
64 void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)
65         __attribute__ ((format (printf, 5, 6)));
66
67 void ast_backtrace(void);
68
69 void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt, ...)
70         __attribute__ ((format (printf, 5, 6)));
71
72 /*! Send a verbose message (based on verbose level)
73         \brief This works like ast_log, but prints verbose messages to the console depending on verbosity level set.
74         ast_verbose(VERBOSE_PREFIX_3 "Whatever %s is happening\n", "nothing");
75         This will print the message to the console if the verbose level is set to a level >= 3
76         Note the abscence of a comma after the VERBOSE_PREFIX_3.  This is important.
77         VERBOSE_PREFIX_1 through VERBOSE_PREFIX_3 are defined.
78  */
79 void ast_verbose(const char *fmt, ...)
80         __attribute__ ((format (printf, 1, 2)));
81
82 int ast_register_verbose(void (*verboser)(const char *string));
83 int ast_unregister_verbose(void (*verboser)(const char *string));
84
85 void ast_console_puts(const char *string);
86
87 void ast_console_puts_mutable(const char *string);
88 void ast_console_toggle_mute(int fd, int silent);
89
90 #define _A_ __FILE__, __LINE__, __PRETTY_FUNCTION__
91
92 #ifdef LOG_DEBUG
93 #undef LOG_DEBUG
94 #endif
95 #define __LOG_DEBUG    0
96 #define LOG_DEBUG      __LOG_DEBUG, _A_
97
98 #ifdef LOG_EVENT
99 #undef LOG_EVENT
100 #endif
101 #define __LOG_EVENT    1
102 #define LOG_EVENT      __LOG_EVENT, _A_
103
104 #ifdef LOG_NOTICE
105 #undef LOG_NOTICE
106 #endif
107 #define __LOG_NOTICE   2
108 #define LOG_NOTICE     __LOG_NOTICE, _A_
109
110 #ifdef LOG_WARNING
111 #undef LOG_WARNING
112 #endif
113 #define __LOG_WARNING  3
114 #define LOG_WARNING    __LOG_WARNING, _A_
115
116 #ifdef LOG_ERROR
117 #undef LOG_ERROR
118 #endif
119 #define __LOG_ERROR    4
120 #define LOG_ERROR      __LOG_ERROR, _A_
121
122 #ifdef LOG_VERBOSE
123 #undef LOG_VERBOSE
124 #endif
125 #define __LOG_VERBOSE  5
126 #define LOG_VERBOSE    __LOG_VERBOSE, _A_
127
128 #ifdef LOG_DTMF
129 #undef LOG_DTMF
130 #endif
131 #define __LOG_DTMF  6
132 #define LOG_DTMF    __LOG_DTMF, _A_
133
134 /*!
135  * \brief Get the debug level for a file
136  * \arg file the filename
137  * \return the debug level
138  */
139 unsigned int ast_debug_get_by_file(const char *file);
140
141 /*!
142  * \brief Get the debug level for a file
143  * \arg file the filename
144  * \return the debug level
145  */
146 unsigned int ast_verbose_get_by_file(const char *file);
147
148 /*!
149  * \brief Log a DEBUG message
150  * \param level The minimum value of option_debug for this message
151  *        to get logged
152  */
153 #define ast_debug(level, ...) do {       \
154         if (option_debug >= (level) || (ast_opt_dbg_file && ast_debug_get_by_file(__FILE__) >= (level)) ) \
155                 ast_log(LOG_DEBUG, __VA_ARGS__); \
156 } while (0)
157
158 #define ast_verb(level, ...) do { \
159         if (option_verbose >= (level) || (ast_opt_verb_file && ast_verbose_get_by_file(__FILE__) >= (level)) ) { \
160                 if (level >= 4) \
161                         ast_verbose(VERBOSE_PREFIX_4 __VA_ARGS__); \
162                 else if (level == 3) \
163                         ast_verbose(VERBOSE_PREFIX_3 __VA_ARGS__); \
164                 else if (level == 2) \
165                         ast_verbose(VERBOSE_PREFIX_2 __VA_ARGS__); \
166                 else if (level == 1) \
167                         ast_verbose(VERBOSE_PREFIX_1 __VA_ARGS__); \
168                 else \
169                         ast_verbose(__VA_ARGS__); \
170         } \
171 } while (0)
172
173 #if defined(__cplusplus) || defined(c_plusplus)
174 }
175 #endif
176
177 #endif /* _ASTERISK_LOGGER_H */