ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 1 | /* |
ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 2 | * Zebra logging funcions. |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 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 | |
ajs | 5e76477 | 2004-12-03 19:03:33 +0000 | [diff] [blame] | 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 | |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 44 | typedef enum |
| 45 | { |
| 46 | ZLOG_NONE, |
| 47 | ZLOG_DEFAULT, |
| 48 | ZLOG_ZEBRA, |
| 49 | ZLOG_RIP, |
| 50 | ZLOG_BGP, |
| 51 | ZLOG_OSPF, |
Paul Jakma | 5734509 | 2011-12-25 17:52:09 +0100 | [diff] [blame] | 52 | ZLOG_RIPNG, |
| 53 | ZLOG_BABEL, |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 54 | ZLOG_OSPF6, |
jardin | 9e867fe | 2003-12-23 08:56:18 +0000 | [diff] [blame] | 55 | ZLOG_ISIS, |
Everton Marques | 871dbcf | 2009-08-11 15:43:05 -0300 | [diff] [blame] | 56 | ZLOG_PIM, |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 57 | ZLOG_MASC |
| 58 | } zlog_proto_t; |
| 59 | |
ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 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 | |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 73 | struct zlog |
| 74 | { |
ajs | 7d149b8 | 2004-11-28 23:00:01 +0000 | [diff] [blame] | 75 | const char *ident; /* daemon name (first arg to openlog) */ |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 76 | zlog_proto_t protocol; |
ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 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 */ |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 80 | FILE *fp; |
| 81 | char *filename; |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 82 | int facility; /* as per syslog facility */ |
ajs | 7d149b8 | 2004-11-28 23:00:01 +0000 | [diff] [blame] | 83 | int record_priority; /* should messages logged through stdio include the |
| 84 | priority of the message? */ |
| 85 | int syslog_options; /* 2nd arg to openlog */ |
Andrew J. Schorr | 1ed72e0 | 2007-04-28 22:14:10 +0000 | [diff] [blame] | 86 | int timestamp_precision; /* # of digits of subsecond precision */ |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 87 | }; |
| 88 | |
| 89 | /* Message structure. */ |
| 90 | struct message |
| 91 | { |
| 92 | int key; |
hasso | b04c699 | 2004-10-04 19:10:31 +0000 | [diff] [blame] | 93 | const char *str; |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 94 | }; |
| 95 | |
| 96 | /* Default logging strucutre. */ |
| 97 | extern struct zlog *zlog_default; |
| 98 | |
| 99 | /* Open zlog function */ |
paul | 8cc4198 | 2005-05-06 21:25:49 +0000 | [diff] [blame] | 100 | extern struct zlog *openzlog (const char *progname, zlog_proto_t protocol, |
| 101 | int syslog_options, int syslog_facility); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 102 | |
| 103 | /* Close zlog function. */ |
paul | 8cc4198 | 2005-05-06 21:25:49 +0000 | [diff] [blame] | 104 | extern void closezlog (struct zlog *zl); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 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. */ |
Stephen Hemminger | 80c375e | 2008-08-08 15:15:23 -0700 | [diff] [blame] | 114 | extern void zlog (struct zlog *zl, int priority, const char *format, ...) |
| 115 | PRINTF_ATTRIBUTE(3, 4); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 116 | |
| 117 | /* Handy zlog functions. */ |
paul | 8cc4198 | 2005-05-06 21:25:49 +0000 | [diff] [blame] | 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); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 123 | |
| 124 | /* For bgpd's peer oriented log. */ |
Stephen Hemminger | 80c375e | 2008-08-08 15:15:23 -0700 | [diff] [blame] | 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); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 135 | |
David Lamparter | 615f9f1 | 2013-11-18 23:52:02 +0100 | [diff] [blame] | 136 | extern void zlog_thread_info (int log_level); |
| 137 | |
ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 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). */ |
paul | 8cc4198 | 2005-05-06 21:25:49 +0000 | [diff] [blame] | 142 | extern void zlog_set_level (struct zlog *zl, zlog_dest_t, int log_level); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 143 | |
ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 144 | /* Set logging to the given filename at the specified level. */ |
paul | 8cc4198 | 2005-05-06 21:25:49 +0000 | [diff] [blame] | 145 | extern int zlog_set_file (struct zlog *zl, const char *filename, int log_level); |
ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 146 | /* Disable file logging. */ |
paul | 8cc4198 | 2005-05-06 21:25:49 +0000 | [diff] [blame] | 147 | extern int zlog_reset_file (struct zlog *zl); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 148 | |
| 149 | /* Rotate log. */ |
paul | 8cc4198 | 2005-05-06 21:25:49 +0000 | [diff] [blame] | 150 | extern int zlog_rotate (struct zlog *); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 151 | |
Leonid Rosenboim | 1e0ce7c | 2012-12-07 21:31:07 +0000 | [diff] [blame] | 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)") |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 155 | |
Stephen Hemminger | 1423c80 | 2008-08-14 17:59:25 +0100 | [diff] [blame] | 156 | extern const char *lookup (const struct message *, int); |
Stephen Hemminger | 8e4c093 | 2009-05-15 09:47:34 -0700 | [diff] [blame] | 157 | extern const char *mes_lookup (const struct message *meslist, |
Paul Jakma | 11486b5 | 2008-02-28 23:26:02 +0000 | [diff] [blame] | 158 | int max, int index, |
Dmitrij Tejblum | 51abba5 | 2011-09-21 17:41:41 +0400 | [diff] [blame] | 159 | const char *no_item, const char *mesname); |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 160 | |
| 161 | extern const char *zlog_priority[]; |
ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 162 | extern const char *zlog_proto_names[]; |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 163 | |
ajs | ca35976 | 2004-11-19 23:40:16 +0000 | [diff] [blame] | 164 | /* Safe version of strerror -- never returns NULL. */ |
| 165 | extern const char *safe_strerror(int errnum); |
| 166 | |
ajs | 59a06a9 | 2004-11-23 18:19:14 +0000 | [diff] [blame] | 167 | /* To be called when a fatal signal is caught. */ |
ajs | 3136427 | 2005-01-18 22:18:59 +0000 | [diff] [blame] | 168 | extern void zlog_signal(int signo, const char *action |
| 169 | #ifdef SA_SIGINFO |
| 170 | , siginfo_t *siginfo, void *program_counter |
| 171 | #endif |
| 172 | ); |
ajs | 59a06a9 | 2004-11-23 18:19:14 +0000 | [diff] [blame] | 173 | |
ajs | 063ee52 | 2004-11-26 18:11:14 +0000 | [diff] [blame] | 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 |
ajs | 239c26f | 2005-01-17 15:22:28 +0000 | [diff] [blame] | 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); |
ajs | 063ee52 | 2004-11-26 18:11:14 +0000 | [diff] [blame] | 182 | |
Andrew J. Schorr | 1ed72e0 | 2007-04-28 22:14:10 +0000 | [diff] [blame] | 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. */ |
Christian Franke | 880e31c | 2016-05-03 19:59:40 +0200 | [diff] [blame] | 189 | #define QUAGGA_TIMESTAMP_LEN 40 |
Andrew J. Schorr | 1ed72e0 | 2007-04-28 22:14:10 +0000 | [diff] [blame] | 190 | extern size_t quagga_timestamp(int timestamp_precision /* # subsecond digits */, |
| 191 | char *buf, size_t buflen); |
| 192 | |
Daniel Walton | c8af680 | 2015-10-21 06:56:44 -0700 | [diff] [blame] | 193 | extern void zlog_hexdump(void *mem, unsigned int len); |
| 194 | |
Andrew J. Schorr | 1ed72e0 | 2007-04-28 22:14:10 +0000 | [diff] [blame] | 195 | /* structure useful for avoiding repeated rendering of the same timestamp */ |
| 196 | struct timestamp_control { |
| 197 | size_t len; /* length of rendered timestamp */ |
| 198 | int precision; /* configuration parameter */ |
| 199 | int already_rendered; /* should be initialized to 0 */ |
Christian Franke | 880e31c | 2016-05-03 19:59:40 +0200 | [diff] [blame] | 200 | char buf[QUAGGA_TIMESTAMP_LEN]; /* will contain the rendered timestamp */ |
Andrew J. Schorr | 1ed72e0 | 2007-04-28 22:14:10 +0000 | [diff] [blame] | 201 | }; |
| 202 | |
ajs | 274a4a4 | 2004-12-07 15:39:31 +0000 | [diff] [blame] | 203 | /* Defines for use in command construction: */ |
| 204 | |
| 205 | #define LOG_LEVELS "(emergencies|alerts|critical|errors|warnings|notifications|informational|debugging)" |
| 206 | |
| 207 | #define LOG_LEVEL_DESC \ |
| 208 | "System is unusable\n" \ |
| 209 | "Immediate action needed\n" \ |
| 210 | "Critical conditions\n" \ |
| 211 | "Error conditions\n" \ |
| 212 | "Warning conditions\n" \ |
| 213 | "Normal but significant conditions\n" \ |
| 214 | "Informational messages\n" \ |
| 215 | "Debugging messages\n" |
| 216 | |
| 217 | #define LOG_FACILITIES "(kern|user|mail|daemon|auth|syslog|lpr|news|uucp|cron|local0|local1|local2|local3|local4|local5|local6|local7)" |
| 218 | |
| 219 | #define LOG_FACILITY_DESC \ |
| 220 | "Kernel\n" \ |
| 221 | "User process\n" \ |
| 222 | "Mail system\n" \ |
| 223 | "System daemons\n" \ |
| 224 | "Authorization system\n" \ |
| 225 | "Syslog itself\n" \ |
| 226 | "Line printer system\n" \ |
| 227 | "USENET news\n" \ |
| 228 | "Unix-to-Unix copy system\n" \ |
| 229 | "Cron/at facility\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 | "Local use\n" |
| 238 | |
paul | 718e374 | 2002-12-13 20:15:29 +0000 | [diff] [blame] | 239 | #endif /* _ZEBRA_LOG_H */ |