
1: @node Syslog, Mathematics, Low-Level Terminal Interface, Top 2: @c %MENU% System logging and messaging 3: @chapter Syslog 4: 5: 6: This chapter describes facilities for issuing and logging messages of 7: system administration interest. This chapter has nothing to do with 8: programs issuing messages to their own users or keeping private logs 9: (One would typically do that with the facilities described in 10: @ref{I/O on Streams}). 11: 12: Most systems have a facility called ``Syslog'' that allows programs to 13: submit messages of interest to system administrators and can be 14: configured to pass these messages on in various ways, such as printing 15: on the console, mailing to a particular person, or recording in a log 16: file for future reference. 17: 18: A program uses the facilities in this chapter to submit such messages. 19: 20: @menu 21: * Overview of Syslog:: Overview of a system's Syslog facility 22: * Submitting Syslog Messages:: Functions to submit messages to Syslog 23: @end menu 24: 25: @node Overview of Syslog 26: @section Overview of Syslog 27: 28: System administrators have to deal with lots of different kinds of 29: messages from a plethora of subsystems within each system, and usually 30: lots of systems as well. For example, an FTP server might report every 31: connection it gets. The kernel might report hardware failures on a disk 32: drive. A DNS server might report usage statistics at regular intervals. 33: 34: Some of these messages need to be brought to a system administrator's 35: attention immediately. And it may not be just any system administrator 36: -- there may be a particular system administrator who deals with a 37: particular kind of message. Other messages just need to be recorded for 38: future reference if there is a problem. Still others may need to have 39: information extracted from them by an automated process that generates 40: monthly reports. 41: 42: To deal with these messages, most Unix systems have a facility called 43: "Syslog." It is generally based on a daemon called ``Syslogd'' 44: Syslogd listens for messages on a Unix domain socket named 45: @file{/dev/log}. Based on classification information in the messages 46: and its configuration file (usually @file{/etc/syslog.conf}), Syslogd 47: routes them in various ways. Some of the popular routings are: 48: 49: @itemize @bullet 50: @item 51: Write to the system console 52: @item 53: Mail to a specific user 54: @item 55: Write to a log file 56: @item 57: Pass to another daemon 58: @item 59: Discard 60: @end itemize 61: 62: Syslogd can also handle messages from other systems. It listens on the 63: @code{syslog} UDP port as well as the local socket for messages. 64: 65: Syslog can handle messages from the kernel itself. But the kernel 66: doesn't write to @file{/dev/log}; rather, another daemon (sometimes 67: called ``Klogd'') extracts messages from the kernel and passes them on to 68: Syslog as any other process would (and it properly identifies them as 69: messages from the kernel). 70: 71: Syslog can even handle messages that the kernel issued before Syslogd or 72: Klogd was running. A Linux kernel, for example, stores startup messages 73: in a kernel message ring and they are normally still there when Klogd 74: later starts up. Assuming Syslogd is running by the time Klogd starts, 75: Klogd then passes everything in the message ring to it. 76: 77: In order to classify messages for disposition, Syslog requires any process 78: that submits a message to it to provide two pieces of classification 79: information with it: 80: 81: @table @asis 82: @item facility 83: This identifies who submitted the message. There are a small number of 84: facilities defined. The kernel, the mail subsystem, and an FTP server 85: are examples of recognized facilities. For the complete list, 86: @xref{syslog; vsyslog}. Keep in mind that these are 87: essentially arbitrary classifications. "Mail subsystem" doesn't have any 88: more meaning than the system administrator gives to it. 89: 90: @item priority 91: This tells how important the content of the message is. Examples of 92: defined priority values are: debug, informational, warning, critical. 93: For the complete list, @xref{syslog; vsyslog}. Except for 94: the fact that the priorities have a defined order, the meaning of each 95: of these priorities is entirely determined by the system administrator. 96: 97: @end table 98: 99: A ``facility/priority'' is a number that indicates both the facility 100: and the priority. 101: 102: @strong{Warning:} This terminology is not universal. Some people use 103: ``level'' to refer to the priority and ``priority'' to refer to the 104: combination of facility and priority. A Linux kernel has a concept of a 105: message ``level,'' which corresponds both to a Syslog priority and to a 106: Syslog facility/priority (It can be both because the facility code for 107: the kernel is zero, and that makes priority and facility/priority the 108: same value). 109: 110: The GNU C library provides functions to submit messages to Syslog. They 111: do it by writing to the @file{/dev/log} socket. @xref{Submitting Syslog 112: Messages}. 113: 114: The GNU C library functions only work to submit messages to the Syslog 115: facility on the same system. To submit a message to the Syslog facility 116: on another system, use the socket I/O functions to write a UDP datagram 117: to the @code{syslog} UDP port on that system. @xref{Sockets}. 118: 119: 120: @node Submitting Syslog Messages 121: @section Submitting Syslog Messages 122: 123: The GNU C library provides functions to submit messages to the Syslog 124: facility: 125: 126: @menu 127: * openlog:: Open connection to Syslog 128: * syslog; vsyslog:: Submit message to Syslog 129: * closelog:: Close connection to Syslog 130: * setlogmask:: Cause certain messages to be ignored 131: * Syslog Example:: Example of all of the above 132: @end menu 133: 134: These functions only work to submit messages to the Syslog facility on 135: the same system. To submit a message to the Syslog facility on another 136: system, use the socket I/O functions to write a UDP datagram to the 137: @code{syslog} UDP port on that system. @xref{Sockets}. 138: 139: 140: 141: @node openlog 142: @subsection openlog 143: 144: The symbols referred to in this section are declared in the file 145: @file{syslog.h}. 146: 147: @comment syslog.h 148: @comment BSD 149: @deftypefun void openlog (const char *@var{ident}, int @var{option}, int @var{facility}) 150: 151: @code{openlog} opens or reopens a connection to Syslog in preparation 152: for submitting messages. 153: 154: @var{ident} is an arbitrary identification string which future 155: @code{syslog} invocations will prefix to each message. This is intended 156: to identify the source of the message, and people conventionally set it 157: to the name of the program that will submit the messages. 158: 159: If @var{ident} is NULL, or if @code{openlog} is not called, the default 160: identification string used in Syslog messages will be the program name, 161: taken from argv[0]. 162: 163: Please note that the string pointer @var{ident} will be retained 164: internally by the Syslog routines. You must not free the memory that 165: @var{ident} points to. It is also dangerous to pass a reference to an 166: automatic variable since leaving the scope would mean ending the 167: lifetime of the variable. If you want to change the @var{ident} string, 168: you must call @code{openlog} again; overwriting the string pointed to by 169: @var{ident} is not thread-safe. 170: 171: You can cause the Syslog routines to drop the reference to @var{ident} and 172: go back to the default string (the program name taken from argv[0]), by 173: calling @code{closelog}: @xref{closelog}. 174: 175: In particular, if you are writing code for a shared library that might get 176: loaded and then unloaded (e.g. a PAM module), and you use @code{openlog}, 177: you must call @code{closelog} before any point where your library might 178: get unloaded, as in this example: 179: 180: @smallexample 181: #include <syslog.h> 182: 183: void 184: shared_library_function (void) 185: @{ 186: openlog ("mylibrary", option, priority); 187: 188: syslog (LOG_INFO, "shared library has been invoked"); 189: 190: closelog (); 191: @} 192: @end smallexample 193: 194: Without the call to @code{closelog}, future invocations of @code{syslog} 195: by the program using the shared library may crash, if the library gets 196: unloaded and the memory containing the string @code{"mylibrary"} becomes 197: unmapped. This is a limitation of the BSD syslog interface. 198: 199: @code{openlog} may or may not open the @file{/dev/log} socket, depending 200: on @var{option}. If it does, it tries to open it and connect it as a 201: stream socket. If that doesn't work, it tries to open it and connect it 202: as a datagram socket. The socket has the ``Close on Exec'' attribute, 203: so the kernel will close it if the process performs an exec. 204: 205: You don't have to use @code{openlog}. If you call @code{syslog} without 206: having called @code{openlog}, @code{syslog} just opens the connection 207: implicitly and uses defaults for the information in @var{ident} and 208: @var{options}. 209: 210: @var{options} is a bit string, with the bits as defined by the following 211: single bit masks: 212: 213: @table @code 214: @item LOG_PERROR 215: If on, @code{openlog} sets up the connection so that any @code{syslog} 216: on this connection writes its message to the calling process' Standard 217: Error stream in addition to submitting it to Syslog. If off, @code{syslog} 218: does not write the message to Standard Error. 219: 220: @item LOG_CONS 221: If on, @code{openlog} sets up the connection so that a @code{syslog} on 222: this connection that fails to submit a message to Syslog writes the 223: message instead to system console. If off, @code{syslog} does not write 224: to the system console (but of course Syslog may write messages it 225: receives to the console). 226: 227: @item LOG_PID 228: When on, @code{openlog} sets up the connection so that a @code{syslog} 229: on this connection inserts the calling process' Process ID (PID) into 230: the message. When off, @code{openlog} does not insert the PID. 231: 232: @item LOG_NDELAY 233: When on, @code{openlog} opens and connects the @file{/dev/log} socket. 234: When off, a future @code{syslog} call must open and connect the socket. 235: 236: @strong{Portability note:} In early systems, the sense of this bit was 237: exactly the opposite. 238: 239: @item LOG_ODELAY 240: This bit does nothing. It exists for backward compatibility. 241: 242: @end table 243: 244: If any other bit in @var{options} is on, the result is undefined. 245: 246: @var{facility} is the default facility code for this connection. A 247: @code{syslog} on this connection that specifies default facility causes 248: this facility to be associated with the message. See @code{syslog} for 249: possible values. A value of zero means the default default, which is 250: @code{LOG_USER}. 251: 252: If a Syslog connection is already open when you call @code{openlog}, 253: @code{openlog} ``reopens'' the connection. Reopening is like opening 254: except that if you specify zero for the default facility code, the 255: default facility code simply remains unchanged and if you specify 256: LOG_NDELAY and the socket is already open and connected, @code{openlog} 257: just leaves it that way. 258: 259: @c There is a bug in closelog() (glibc 2.1.3) wherein it does not reset the 260: @c default log facility to LOG_USER, which means the default default log 261: @c facility could be whatever the default log facility was for a previous 262: @c Syslog connection. I have documented what the function should be rather 263: @c than what it is because I think if anyone ever gets concerned, the code 264: @c will change. 265: 266: @end deftypefun 267: 268: 269: @node syslog; vsyslog 270: @subsection syslog, vsyslog 271: 272: The symbols referred to in this section are declared in the file 273: @file{syslog.h}. 274: 275: @c syslog() is implemented as a call to vsyslog(). 276: @comment syslog.h 277: @comment BSD 278: @deftypefun void syslog (int @var{facility_priority}, char *@var{format}, ...) 279: 280: @code{syslog} submits a message to the Syslog facility. It does this by 281: writing to the Unix domain socket @code{/dev/log}. 282: 283: @code{syslog} submits the message with the facility and priority indicated 284: by @var{facility_priority}. The macro @code{LOG_MAKEPRI} generates a 285: facility/priority from a facility and a priority, as in the following 286: example: 287: 288: @smallexample 289: LOG_MAKEPRI(LOG_USER, LOG_WARNING) 290: @end smallexample 291: 292: The possible values for the facility code are (macros): 293: 294: @c Internally, there is also LOG_KERN, but LOG_KERN == 0, which means 295: @c if you try to use it here, just selects default. 296: 297: @vtable @code 298: @item LOG_USER 299: A miscellaneous user process 300: @item LOG_MAIL 301: Mail 302: @item LOG_DAEMON 303: A miscellaneous system daemon 304: @item LOG_AUTH 305: Security (authorization) 306: @item LOG_SYSLOG 307: Syslog 308: @item LOG_LPR 309: Central printer 310: @item LOG_NEWS 311: Network news (e.g. Usenet) 312: @item LOG_UUCP 313: UUCP 314: @item LOG_CRON 315: Cron and At 316: @item LOG_AUTHPRIV 317: Private security (authorization) 318: @item LOG_FTP 319: Ftp server 320: @item LOG_LOCAL0 321: Locally defined 322: @item LOG_LOCAL1 323: Locally defined 324: @item LOG_LOCAL2 325: Locally defined 326: @item LOG_LOCAL3 327: Locally defined 328: @item LOG_LOCAL4 329: Locally defined 330: @item LOG_LOCAL5 331: Locally defined 332: @item LOG_LOCAL6 333: Locally defined 334: @item LOG_LOCAL7 335: Locally defined 336: @end vtable 337: 338: Results are undefined if the facility code is anything else. 339: 340: @strong{note:} @code{syslog} recognizes one other facility code: that of 341: the kernel. But you can't specify that facility code with these 342: functions. If you try, it looks the same to @code{syslog} as if you are 343: requesting the default facility. But you wouldn't want to anyway, 344: because any program that uses the GNU C library is not the kernel. 345: 346: You can use just a priority code as @var{facility_priority}. In that 347: case, @code{syslog} assumes the default facility established when the 348: Syslog connection was opened. @xref{Syslog Example}. 349: 350: The possible values for the priority code are (macros): 351: 352: @vtable @code 353: @item LOG_EMERG 354: The message says the system is unusable. 355: @item LOG_ALERT 356: Action on the message must be taken immediately. 357: @item LOG_CRIT 358: The message states a critical condition. 359: @item LOG_ERR 360: The message describes an error. 361: @item LOG_WARNING 362: The message is a warning. 363: @item LOG_NOTICE 364: The message describes a normal but important event. 365: @item LOG_INFO 366: The message is purely informational. 367: @item LOG_DEBUG 368: The message is only for debugging purposes. 369: @end vtable 370: 371: Results are undefined if the priority code is anything else. 372: 373: If the process does not presently have a Syslog connection open (i.e., 374: it did not call @code{openlog}), @code{syslog} implicitly opens the 375: connection the same as @code{openlog} would, with the following defaults 376: for information that would otherwise be included in an @code{openlog} 377: call: The default identification string is the program name. The 378: default default facility is @code{LOG_USER}. The default for all the 379: connection options in @var{options} is as if those bits were off. 380: @code{syslog} leaves the Syslog connection open. 381: 382: If the @file{dev/log} socket is not open and connected, @code{syslog} 383: opens and connects it, the same as @code{openlog} with the 384: @code{LOG_NDELAY} option would. 385: 386: @code{syslog} leaves @file{/dev/log} open and connected unless its attempt 387: to send the message failed, in which case @code{syslog} closes it (with the 388: hope that a future implicit open will restore the Syslog connection to a 389: usable state). 390: 391: Example: 392: 393: @smallexample 394: 395: #include <syslog.h> 396: syslog (LOG_MAKEPRI(LOG_LOCAL1, LOG_ERROR), 397: "Unable to make network connection to %s. Error=%m", host); 398: 399: @end smallexample 400: 401: @end deftypefun 402: 403: 404: @comment syslog.h 405: @comment BSD 406: @deftypefun void vsyslog (int @var{facility_priority}, char *@var{format}, va_list arglist) 407: 408: This is functionally identical to @code{syslog}, with the BSD style variable 409: length argument. 410: 411: @end deftypefun 412: 413: 414: @node closelog 415: @subsection closelog 416: 417: The symbols referred to in this section are declared in the file 418: @file{syslog.h}. 419: 420: @comment syslog.h 421: @comment BSD 422: @deftypefun void closelog (void) 423: 424: @code{closelog} closes the current Syslog connection, if there is one. 425: This includes closing the @file{dev/log} socket, if it is open. 426: @code{closelog} also sets the identification string for Syslog messages 427: back to the default, if @code{openlog} was called with a non-NULL argument 428: to @var{ident}. The default identification string is the program name 429: taken from argv[0]. 430: 431: If you are writing shared library code that uses @code{openlog} to 432: generate custom syslog output, you should use @code{closelog} to drop the 433: GNU C library's internal reference to the @var{ident} pointer when you are 434: done. Please read the section on @code{openlog} for more information: 435: @xref{openlog}. 436: 437: @code{closelog} does not flush any buffers. You do not have to call 438: @code{closelog} before re-opening a Syslog connection with @code{initlog}. 439: Syslog connections are automatically closed on exec or exit. 440: 441: @end deftypefun 442: 443: 444: @node setlogmask 445: @subsection setlogmask 446: 447: The symbols referred to in this section are declared in the file 448: @file{syslog.h}. 449: 450: @comment syslog.h 451: @comment BSD 452: @deftypefun int setlogmask (int @var{mask}) 453: 454: @code{setlogmask} sets a mask (the ``logmask'') that determines which 455: future @code{syslog} calls shall be ignored. If a program has not 456: called @code{setlogmask}, @code{syslog} doesn't ignore any calls. You 457: can use @code{setlogmask} to specify that messages of particular 458: priorities shall be ignored in the future. 459: 460: A @code{setlogmask} call overrides any previous @code{setlogmask} call. 461: 462: Note that the logmask exists entirely independently of opening and 463: closing of Syslog connections. 464: 465: Setting the logmask has a similar effect to, but is not the same as, 466: configuring Syslog. The Syslog configuration may cause Syslog to 467: discard certain messages it receives, but the logmask causes certain 468: messages never to get submitted to Syslog in the first place. 469: 470: @var{mask} is a bit string with one bit corresponding to each of the 471: possible message priorities. If the bit is on, @code{syslog} handles 472: messages of that priority normally. If it is off, @code{syslog} 473: discards messages of that priority. Use the message priority macros 474: described in @ref{syslog; vsyslog} and the @code{LOG_MASK} to construct 475: an appropriate @var{mask} value, as in this example: 476: 477: @smallexample 478: LOG_MASK(LOG_EMERG) | LOG_MASK(LOG_ERROR) 479: @end smallexample 480: 481: or 482: 483: @smallexample 484: ~(LOG_MASK(LOG_INFO)) 485: @end smallexample 486: 487: There is also a @code{LOG_UPTO} macro, which generates a mask with the bits 488: on for a certain priority and all priorities above it: 489: 490: @smallexample 491: LOG_UPTO(LOG_ERROR) 492: @end smallexample 493: 494: The unfortunate naming of the macro is due to the fact that internally, 495: higher numbers are used for lower message priorities. 496: 497: @end deftypefun 498: 499: 500: @node Syslog Example 501: @subsection Syslog Example 502: 503: Here is an example of @code{openlog}, @code{syslog}, and @code{closelog}: 504: 505: This example sets the logmask so that debug and informational messages 506: get discarded without ever reaching Syslog. So the second @code{syslog} 507: in the example does nothing. 508: 509: @smallexample 510: #include <syslog.h> 511: 512: setlogmask (LOG_UPTO (LOG_NOTICE)); 513: 514: openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); 515: 516: syslog (LOG_NOTICE, "Program started by User %d", getuid ()); 517: syslog (LOG_INFO, "A tree falls in a forest"); 518: 519: closelog (); 520: 521: @end smallexample