1: /*
2: * Zebra logging funcions.
3: * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
4: *
5: * This file is part of GNU Zebra.
6: *
7: * GNU Zebra is free software; you can redistribute it and/or modify it
8: * under the terms of the GNU General Public License as published by the
9: * Free Software Foundation; either version 2, or (at your option) any
10: * later version.
11: *
12: * GNU Zebra is distributed in the hope that it will be useful, but
13: * WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15: * General Public License for more details.
16: *
17: * You should have received a copy of the GNU General Public License
18: * along with GNU Zebra; see the file COPYING. If not, write to the Free
19: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20: * 02111-1307, USA.
21: */
22:
23: #ifndef _ZEBRA_LOG_H
24: #define _ZEBRA_LOG_H
25:
26: #include <syslog.h>
27:
28: /* Here is some guidance on logging levels to use:
29: *
30: * LOG_DEBUG - For all messages that are enabled by optional debugging
31: * features, typically preceded by "if (IS...DEBUG...)"
32: * LOG_INFO - Information that may be of interest, but everything seems
33: * to be working properly.
34: * LOG_NOTICE - Only for message pertaining to daemon startup or shutdown.
35: * LOG_WARNING - Warning conditions: unexpected events, but the daemon believes
36: * it can continue to operate correctly.
37: * LOG_ERR - Error situations indicating malfunctions. Probably require
38: * attention.
39: *
40: * Note: LOG_CRIT, LOG_ALERT, and LOG_EMERG are currently not used anywhere,
41: * please use LOG_ERR instead.
42: */
43:
44: typedef enum
45: {
46: ZLOG_NONE,
47: ZLOG_DEFAULT,
48: ZLOG_ZEBRA,
49: ZLOG_RIP,
50: ZLOG_BGP,
51: ZLOG_OSPF,
52: ZLOG_RIPNG,
53: ZLOG_BABEL,
54: ZLOG_OSPF6,
55: ZLOG_ISIS,
56: ZLOG_PIM,
57: ZLOG_MASC
58: } zlog_proto_t;
59:
60: /* If maxlvl is set to ZLOG_DISABLED, then no messages will be sent
61: to that logging destination. */
62: #define ZLOG_DISABLED (LOG_EMERG-1)
63:
64: typedef enum
65: {
66: ZLOG_DEST_SYSLOG = 0,
67: ZLOG_DEST_STDOUT,
68: ZLOG_DEST_MONITOR,
69: ZLOG_DEST_FILE
70: } zlog_dest_t;
71: #define ZLOG_NUM_DESTS (ZLOG_DEST_FILE+1)
72:
73: struct zlog
74: {
75: const char *ident; /* daemon name (first arg to openlog) */
76: zlog_proto_t protocol;
77: int maxlvl[ZLOG_NUM_DESTS]; /* maximum priority to send to associated
78: logging destination */
79: int default_lvl; /* maxlvl to use if none is specified */
80: FILE *fp;
81: char *filename;
82: int facility; /* as per syslog facility */
83: int record_priority; /* should messages logged through stdio include the
84: priority of the message? */
85: int syslog_options; /* 2nd arg to openlog */
86: int timestamp_precision; /* # of digits of subsecond precision */
87: };
88:
89: /* Message structure. */
90: struct message
91: {
92: int key;
93: const char *str;
94: };
95:
96: /* Default logging strucutre. */
97: extern struct zlog *zlog_default;
98:
99: /* Open zlog function */
100: extern struct zlog *openzlog (const char *progname, zlog_proto_t protocol,
101: int syslog_options, int syslog_facility);
102:
103: /* Close zlog function. */
104: extern void closezlog (struct zlog *zl);
105:
106: /* GCC have printf type attribute check. */
107: #ifdef __GNUC__
108: #define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))
109: #else
110: #define PRINTF_ATTRIBUTE(a,b)
111: #endif /* __GNUC__ */
112:
113: /* Generic function for zlog. */
114: extern void zlog (struct zlog *zl, int priority, const char *format, ...)
115: PRINTF_ATTRIBUTE(3, 4);
116:
117: /* Handy zlog functions. */
118: extern void zlog_err (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
119: extern void zlog_warn (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
120: extern void zlog_info (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
121: extern void zlog_notice (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
122: extern void zlog_debug (const char *format, ...) PRINTF_ATTRIBUTE(1, 2);
123:
124: /* For bgpd's peer oriented log. */
125: extern void plog_err (struct zlog *, const char *format, ...)
126: PRINTF_ATTRIBUTE(2, 3);
127: extern void plog_warn (struct zlog *, const char *format, ...)
128: PRINTF_ATTRIBUTE(2, 3);
129: extern void plog_info (struct zlog *, const char *format, ...)
130: PRINTF_ATTRIBUTE(2, 3);
131: extern void plog_notice (struct zlog *, const char *format, ...)
132: PRINTF_ATTRIBUTE(2, 3);
133: extern void plog_debug (struct zlog *, const char *format, ...)
134: PRINTF_ATTRIBUTE(2, 3);
135:
136: extern void zlog_thread_info (int log_level);
137:
138: /* Set logging level for the given destination. If the log_level
139: argument is ZLOG_DISABLED, then the destination is disabled.
140: This function should not be used for file logging (use zlog_set_file
141: or zlog_reset_file instead). */
142: extern void zlog_set_level (struct zlog *zl, zlog_dest_t, int log_level);
143:
144: /* Set logging to the given filename at the specified level. */
145: extern int zlog_set_file (struct zlog *zl, const char *filename, int log_level);
146: /* Disable file logging. */
147: extern int zlog_reset_file (struct zlog *zl);
148:
149: /* Rotate log. */
150: extern int zlog_rotate (struct zlog *);
151:
152: /* For hackey message lookup and check */
153: #define LOOKUP_DEF(x, y, def) mes_lookup(x, x ## _max, y, def, #x)
154: #define LOOKUP(x, y) LOOKUP_DEF(x, y, "(no item found)")
155:
156: extern const char *lookup (const struct message *, int);
157: extern const char *mes_lookup (const struct message *meslist,
158: int max, int index,
159: const char *no_item, const char *mesname);
160:
161: extern const char *zlog_priority[];
162: extern const char *zlog_proto_names[];
163:
164: /* Safe version of strerror -- never returns NULL. */
165: extern const char *safe_strerror(int errnum);
166:
167: /* To be called when a fatal signal is caught. */
168: extern void zlog_signal(int signo, const char *action
169: #ifdef SA_SIGINFO
170: , siginfo_t *siginfo, void *program_counter
171: #endif
172: );
173:
174: /* Log a backtrace. */
175: extern void zlog_backtrace(int priority);
176:
177: /* Log a backtrace, but in an async-signal-safe way. Should not be
178: called unless the program is about to exit or abort, since it messes
179: up the state of zlog file pointers. If program_counter is non-NULL,
180: that is logged in addition to the current backtrace. */
181: extern void zlog_backtrace_sigsafe(int priority, void *program_counter);
182:
183: /* Puts a current timestamp in buf and returns the number of characters
184: written (not including the terminating NUL). The purpose of
185: this function is to avoid calls to localtime appearing all over the code.
186: It caches the most recent localtime result and can therefore
187: avoid multiple calls within the same second. If buflen is too small,
188: *buf will be set to '\0', and 0 will be returned. */
189: extern size_t quagga_timestamp(int timestamp_precision /* # subsecond digits */,
190: char *buf, size_t buflen);
191:
192: extern void zlog_hexdump(void *mem, unsigned int len);
193:
194: /* structure useful for avoiding repeated rendering of the same timestamp */
195: struct timestamp_control {
196: size_t len; /* length of rendered timestamp */
197: int precision; /* configuration parameter */
198: int already_rendered; /* should be initialized to 0 */
199: char buf[40]; /* will contain the rendered timestamp */
200: };
201:
202: /* Defines for use in command construction: */
203:
204: #define LOG_LEVELS "(emergencies|alerts|critical|errors|warnings|notifications|informational|debugging)"
205:
206: #define LOG_LEVEL_DESC \
207: "System is unusable\n" \
208: "Immediate action needed\n" \
209: "Critical conditions\n" \
210: "Error conditions\n" \
211: "Warning conditions\n" \
212: "Normal but significant conditions\n" \
213: "Informational messages\n" \
214: "Debugging messages\n"
215:
216: #define LOG_FACILITIES "(kern|user|mail|daemon|auth|syslog|lpr|news|uucp|cron|local0|local1|local2|local3|local4|local5|local6|local7)"
217:
218: #define LOG_FACILITY_DESC \
219: "Kernel\n" \
220: "User process\n" \
221: "Mail system\n" \
222: "System daemons\n" \
223: "Authorization system\n" \
224: "Syslog itself\n" \
225: "Line printer system\n" \
226: "USENET news\n" \
227: "Unix-to-Unix copy system\n" \
228: "Cron/at facility\n" \
229: "Local use\n" \
230: "Local use\n" \
231: "Local use\n" \
232: "Local use\n" \
233: "Local use\n" \
234: "Local use\n" \
235: "Local use\n" \
236: "Local use\n"
237:
238: #endif /* _ZEBRA_LOG_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>