mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			579 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			579 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| @node Syslog, Mathematics, Low-Level Terminal Interface, Top
 | |
| @c %MENU% System logging and messaging
 | |
| @chapter Syslog
 | |
| 
 | |
| 
 | |
| This chapter describes facilities for issuing and logging messages of
 | |
| system administration interest.  This chapter has nothing to do with
 | |
| programs issuing messages to their own users or keeping private logs
 | |
| (One would typically do that with the facilities described in
 | |
| @ref{I/O on Streams}).
 | |
| 
 | |
| Most systems have a facility called ``Syslog'' that allows programs to
 | |
| submit messages of interest to system administrators and can be
 | |
| configured to pass these messages on in various ways, such as printing
 | |
| on the console, mailing to a particular person, or recording in a log
 | |
| file for future reference.
 | |
| 
 | |
| A program uses the facilities in this chapter to submit such messages.
 | |
| 
 | |
| @menu
 | |
| * Overview of Syslog::           Overview of a system's Syslog facility
 | |
| * Submitting Syslog Messages::   Functions to submit messages to Syslog
 | |
| @end menu
 | |
| 
 | |
| @node Overview of Syslog
 | |
| @section Overview of Syslog
 | |
| 
 | |
| System administrators have to deal with lots of different kinds of
 | |
| messages from a plethora of subsystems within each system, and usually
 | |
| lots of systems as well.  For example, an FTP server might report every
 | |
| connection it gets.  The kernel might report hardware failures on a disk
 | |
| drive.  A DNS server might report usage statistics at regular intervals.
 | |
| 
 | |
| Some of these messages need to be brought to a system administrator's
 | |
| attention immediately.  And it may not be just any system administrator
 | |
| -- there may be a particular system administrator who deals with a
 | |
| particular kind of message.  Other messages just need to be recorded for
 | |
| future reference if there is a problem.  Still others may need to have
 | |
| information extracted from them by an automated process that generates
 | |
| monthly reports.
 | |
| 
 | |
| To deal with these messages, most Unix systems have a facility called
 | |
| "Syslog."  It is generally based on a daemon called ``Syslogd''
 | |
| Syslogd listens for messages on a Unix domain socket named
 | |
| @file{/dev/log}.  Based on classification information in the messages
 | |
| and its configuration file (usually @file{/etc/syslog.conf}), Syslogd
 | |
| routes them in various ways.  Some of the popular routings are:
 | |
| 
 | |
| @itemize @bullet
 | |
| @item
 | |
| Write to the system console
 | |
| @item
 | |
| Mail to a specific user
 | |
| @item
 | |
| Write to a log file
 | |
| @item
 | |
| Pass to another daemon
 | |
| @item
 | |
| Discard
 | |
| @end itemize
 | |
| 
 | |
| Syslogd can also handle messages from other systems.  It listens on the
 | |
| @code{syslog} UDP port as well as the local socket for messages.
 | |
| 
 | |
| Syslog can handle messages from the kernel itself.  But the kernel
 | |
| doesn't write to @file{/dev/log}; rather, another daemon (sometimes
 | |
| called ``Klogd'') extracts messages from the kernel and passes them on to
 | |
| Syslog as any other process would (and it properly identifies them as
 | |
| messages from the kernel).
 | |
| 
 | |
| Syslog can even handle messages that the kernel issued before Syslogd or
 | |
| Klogd was running.  A Linux kernel, for example, stores startup messages
 | |
| in a kernel message ring and they are normally still there when Klogd
 | |
| later starts up.  Assuming Syslogd is running by the time Klogd starts,
 | |
| Klogd then passes everything in the message ring to it.
 | |
| 
 | |
| In order to classify messages for disposition, Syslog requires any process
 | |
| that submits a message to it to provide two pieces of classification
 | |
| information with it:
 | |
| 
 | |
| @table @asis
 | |
| @item facility
 | |
| This identifies who submitted the message.  There are a small number of
 | |
| facilities defined.  The kernel, the mail subsystem, and an FTP server
 | |
| are examples of recognized facilities.  For the complete list,
 | |
| @xref{syslog; vsyslog}.  Keep in mind that these are
 | |
| essentially arbitrary classifications.  "Mail subsystem" doesn't have any
 | |
| more meaning than the system administrator gives to it.
 | |
| 
 | |
| @item priority
 | |
| This tells how important the content of the message is.  Examples of
 | |
| defined priority values are: debug, informational, warning, critical.
 | |
| For the complete list, see @ref{syslog; vsyslog}.  Except for
 | |
| the fact that the priorities have a defined order, the meaning of each
 | |
| of these priorities is entirely determined by the system administrator.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| A ``facility/priority'' is a number that indicates both the facility
 | |
| and the priority.
 | |
| 
 | |
| @strong{Warning:} This terminology is not universal.  Some people use
 | |
| ``level'' to refer to the priority and ``priority'' to refer to the
 | |
| combination of facility and priority.  A Linux kernel has a concept of a
 | |
| message ``level,'' which corresponds both to a Syslog priority and to a
 | |
| Syslog facility/priority (It can be both because the facility code for
 | |
| the kernel is zero, and that makes priority and facility/priority the
 | |
| same value).
 | |
| 
 | |
| @Theglibc{} provides functions to submit messages to Syslog.  They
 | |
| do it by writing to the @file{/dev/log} socket.  @xref{Submitting Syslog
 | |
| Messages}.
 | |
| 
 | |
| The @glibcadj{} functions only work to submit messages to the Syslog
 | |
| facility on the same system.  To submit a message to the Syslog facility
 | |
| on another system, use the socket I/O functions to write a UDP datagram
 | |
| to the @code{syslog} UDP port on that system.  @xref{Sockets}.
 | |
| 
 | |
| 
 | |
| @node Submitting Syslog Messages
 | |
| @section Submitting Syslog Messages
 | |
| 
 | |
| @Theglibc{} provides functions to submit messages to the Syslog
 | |
| facility:
 | |
| 
 | |
| @menu
 | |
| * openlog::                      Open connection to Syslog
 | |
| * syslog; vsyslog::              Submit message to Syslog
 | |
| * closelog::                     Close connection to Syslog
 | |
| * setlogmask::                   Cause certain messages to be ignored
 | |
| * Syslog Example::               Example of all of the above
 | |
| @end menu
 | |
| 
 | |
| These functions only work to submit messages to the Syslog facility on
 | |
| the same system.  To submit a message to the Syslog facility on another
 | |
| system, use the socket I/O functions to write a UDP datagram to the
 | |
| @code{syslog} UDP port on that system.  @xref{Sockets}.
 | |
| 
 | |
| 
 | |
| 
 | |
| @node openlog
 | |
| @subsection openlog
 | |
| 
 | |
| The symbols referred to in this section are declared in the file
 | |
| @file{syslog.h}.
 | |
| 
 | |
| @comment syslog.h
 | |
| @comment BSD
 | |
| @deftypefun void openlog (const char *@var{ident}, int @var{option}, int @var{facility})
 | |
| @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}}
 | |
| @c openlog @asulock @aculock @acsfd
 | |
| @c  libc_lock_lock @asulock @aculock
 | |
| @c  openlog_internal @acsfd [always guarded by syslog_lock, so no race]
 | |
| @c   strncpy dup ok
 | |
| @c   socket dup @acsfd
 | |
| @c   fcntl dup ok
 | |
| @c   connect dup ok
 | |
| @c   close dup @acsfd
 | |
| @c  cancel_handler(NULL) @aculock
 | |
| @c   libc_lock_unlock @aculock
 | |
| 
 | |
| @code{openlog} opens or reopens a connection to Syslog in preparation
 | |
| for submitting messages.
 | |
| 
 | |
| @var{ident} is an arbitrary identification string which future
 | |
| @code{syslog} invocations will prefix to each message.  This is intended
 | |
| to identify the source of the message, and people conventionally set it
 | |
| to the name of the program that will submit the messages.
 | |
| 
 | |
| If @var{ident} is NULL, or if @code{openlog} is not called, the default
 | |
| identification string used in Syslog messages will be the program name,
 | |
| taken from argv[0].
 | |
| 
 | |
| Please note that the string pointer @var{ident} will be retained
 | |
| internally by the Syslog routines.  You must not free the memory that
 | |
| @var{ident} points to.  It is also dangerous to pass a reference to an
 | |
| automatic variable since leaving the scope would mean ending the
 | |
| lifetime of the variable.  If you want to change the @var{ident} string,
 | |
| you must call @code{openlog} again; overwriting the string pointed to by
 | |
| @var{ident} is not thread-safe.
 | |
| 
 | |
| You can cause the Syslog routines to drop the reference to @var{ident} and
 | |
| go back to the default string (the program name taken from argv[0]), by
 | |
| calling @code{closelog}: @xref{closelog}.
 | |
| 
 | |
| In particular, if you are writing code for a shared library that might get
 | |
| loaded and then unloaded (e.g. a PAM module), and you use @code{openlog},
 | |
| you must call @code{closelog} before any point where your library might
 | |
| get unloaded, as in this example:
 | |
| 
 | |
| @smallexample
 | |
| #include <syslog.h>
 | |
| 
 | |
| void
 | |
| shared_library_function (void)
 | |
| @{
 | |
|   openlog ("mylibrary", option, priority);
 | |
| 
 | |
|   syslog (LOG_INFO, "shared library has been invoked");
 | |
| 
 | |
|   closelog ();
 | |
| @}
 | |
| @end smallexample
 | |
| 
 | |
| Without the call to @code{closelog}, future invocations of @code{syslog}
 | |
| by the program using the shared library may crash, if the library gets
 | |
| unloaded and the memory containing the string @code{"mylibrary"} becomes
 | |
| unmapped.  This is a limitation of the BSD syslog interface.
 | |
| 
 | |
| @code{openlog} may or may not open the @file{/dev/log} socket, depending
 | |
| on @var{option}.  If it does, it tries to open it and connect it as a
 | |
| stream socket.  If that doesn't work, it tries to open it and connect it
 | |
| as a datagram socket.  The socket has the ``Close on Exec'' attribute,
 | |
| so the kernel will close it if the process performs an exec.
 | |
| 
 | |
| You don't have to use @code{openlog}.  If you call @code{syslog} without
 | |
| having called @code{openlog}, @code{syslog} just opens the connection
 | |
| implicitly and uses defaults for the information in @var{ident} and
 | |
| @var{options}.
 | |
| 
 | |
| @var{options} is a bit string, with the bits as defined by the following
 | |
| single bit masks:
 | |
| 
 | |
| @table @code
 | |
| @item LOG_PERROR
 | |
| If on, @code{openlog} sets up the connection so that any @code{syslog}
 | |
| on this connection writes its message to the calling process' Standard
 | |
| Error stream in addition to submitting it to Syslog.  If off, @code{syslog}
 | |
| does not write the message to Standard Error.
 | |
| 
 | |
| @item LOG_CONS
 | |
| If on, @code{openlog} sets up the connection so that a @code{syslog} on
 | |
| this connection that fails to submit a message to Syslog writes the
 | |
| message instead to system console.  If off, @code{syslog} does not write
 | |
| to the system console (but of course Syslog may write messages it
 | |
| receives to the console).
 | |
| 
 | |
| @item LOG_PID
 | |
| When on, @code{openlog} sets up the connection so that a @code{syslog}
 | |
| on this connection inserts the calling process' Process ID (PID) into
 | |
| the message.  When off, @code{openlog} does not insert the PID.
 | |
| 
 | |
| @item LOG_NDELAY
 | |
| When on, @code{openlog} opens and connects the @file{/dev/log} socket.
 | |
| When off, a future @code{syslog} call must open and connect the socket.
 | |
| 
 | |
| @strong{Portability note:}  In early systems, the sense of this bit was
 | |
| exactly the opposite.
 | |
| 
 | |
| @item LOG_ODELAY
 | |
| This bit does nothing.  It exists for backward compatibility.
 | |
| 
 | |
| @end table
 | |
| 
 | |
| If any other bit in @var{options} is on, the result is undefined.
 | |
| 
 | |
| @var{facility} is the default facility code for this connection.  A
 | |
| @code{syslog} on this connection that specifies default facility causes
 | |
| this facility to be associated with the message.  See @code{syslog} for
 | |
| possible values.  A value of zero means the default default, which is
 | |
| @code{LOG_USER}.
 | |
| 
 | |
| If a Syslog connection is already open when you call @code{openlog},
 | |
| @code{openlog} ``reopens'' the connection.  Reopening is like opening
 | |
| except that if you specify zero for the default facility code, the
 | |
| default facility code simply remains unchanged and if you specify
 | |
| LOG_NDELAY and the socket is already open and connected, @code{openlog}
 | |
| just leaves it that way.
 | |
| 
 | |
| @c There is a bug in closelog() (glibc 2.1.3) wherein it does not reset the
 | |
| @c default log facility to LOG_USER, which means the default default log
 | |
| @c facility could be whatever the default log facility was for a previous
 | |
| @c Syslog connection.  I have documented what the function should be rather
 | |
| @c than what it is because I think if anyone ever gets concerned, the code
 | |
| @c will change.
 | |
| 
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node syslog; vsyslog
 | |
| @subsection syslog, vsyslog
 | |
| 
 | |
| The symbols referred to in this section are declared in the file
 | |
| @file{syslog.h}.
 | |
| 
 | |
| @c syslog() is implemented as a call to vsyslog().
 | |
| @comment syslog.h
 | |
| @comment BSD
 | |
| @deftypefun void syslog (int @var{facility_priority}, const char *@var{format}, @dots{})
 | |
| @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
 | |
| @c syslog @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
 | |
| @c  va_start dup ok
 | |
| @c  vsyslog_chk @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
 | |
| @c   syslog(INTERNALLOG) dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
 | |
| @c   open_memstream @ascuheap @acsmem
 | |
| @c   stpcpy dup ok
 | |
| @c   getpid dup ok
 | |
| @c   mempcpy dup ok
 | |
| @c   fsetlocking [no @mtasurace:stream @asulock for exclusive stream]
 | |
| @c   fprintf @mtslocale @ascuheap @acsmem [no @asucorrupt @aculock @acucorrupt on temp memstream]
 | |
| @c   time dup ok
 | |
| @c   localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
 | |
| @c   strftime_l(C) dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
 | |
| @c   ftell dup ok [no @asucorrupt @aculock @acucorrupt on temp memstream]
 | |
| @c   fputs_unlocked dup ok [no @mtasurace:stream @asucorrupt @acucorrupt on temp memstream]
 | |
| @c   putc_unlocked dup ok [no @mtasurace:stream @asucorrupt @acucorrupt on temp memstream]
 | |
| @c   vfprintf/vfprintf_chk dup @mtslocale @ascuheap @acsmem [no @mtasurace:stream @asucorrupt @acucorrupt on temp memstream]
 | |
| @c   fclose dup @ascuheap @acsmem [no @asulock @aculock @acsfd on caller-locked memstream]
 | |
| @c   writev dup ok
 | |
| @c   libc_lock_lock dup @asulock @aculock
 | |
| @c   memset dup ok
 | |
| @c   sigemptyset dup ok
 | |
| @c   sigaction(SIGPIPE) dup @mtasusig:PIPE @acusig:PIPE
 | |
| @c   openlog_internal dup @acsfd
 | |
| @c   send dup ok
 | |
| @c   closelog_internal dup @acsfd
 | |
| @c   open dup @acsfd
 | |
| @c   dprintf dup ok
 | |
| @c   libc_lock_unlock @asulock @aculock
 | |
| @c   free dup @acsuheap @acsmem
 | |
| @c  va_end dup ok
 | |
| 
 | |
| @code{syslog} submits a message to the Syslog facility.  It does this by
 | |
| writing to the Unix domain socket @code{/dev/log}.
 | |
| 
 | |
| @code{syslog} submits the message with the facility and priority indicated
 | |
| by @var{facility_priority}.  The macro @code{LOG_MAKEPRI} generates a
 | |
| facility/priority from a facility and a priority, as in the following
 | |
| example:
 | |
| 
 | |
| @smallexample
 | |
| LOG_MAKEPRI(LOG_USER, LOG_WARNING)
 | |
| @end smallexample
 | |
| 
 | |
| The possible values for the facility code are (macros):
 | |
| 
 | |
| @c Internally, there is also LOG_KERN, but LOG_KERN == 0, which means
 | |
| @c if you try to use it here, just selects default.
 | |
| 
 | |
| @vtable @code
 | |
| @item LOG_USER
 | |
| A miscellaneous user process
 | |
| @item LOG_MAIL
 | |
| Mail
 | |
| @item LOG_DAEMON
 | |
| A miscellaneous system daemon
 | |
| @item LOG_AUTH
 | |
| Security (authorization)
 | |
| @item LOG_SYSLOG
 | |
| Syslog
 | |
| @item LOG_LPR
 | |
| Central printer
 | |
| @item LOG_NEWS
 | |
| Network news (e.g. Usenet)
 | |
| @item LOG_UUCP
 | |
| UUCP
 | |
| @item LOG_CRON
 | |
| Cron and At
 | |
| @item LOG_AUTHPRIV
 | |
| Private security (authorization)
 | |
| @item LOG_FTP
 | |
| Ftp server
 | |
| @item LOG_LOCAL0
 | |
| Locally defined
 | |
| @item LOG_LOCAL1
 | |
| Locally defined
 | |
| @item LOG_LOCAL2
 | |
| Locally defined
 | |
| @item LOG_LOCAL3
 | |
| Locally defined
 | |
| @item LOG_LOCAL4
 | |
| Locally defined
 | |
| @item LOG_LOCAL5
 | |
| Locally defined
 | |
| @item LOG_LOCAL6
 | |
| Locally defined
 | |
| @item LOG_LOCAL7
 | |
| Locally defined
 | |
| @end vtable
 | |
| 
 | |
| Results are undefined if the facility code is anything else.
 | |
| 
 | |
| @strong{NB:} @code{syslog} recognizes one other facility code: that of
 | |
| the kernel.  But you can't specify that facility code with these
 | |
| functions.  If you try, it looks the same to @code{syslog} as if you are
 | |
| requesting the default facility.  But you wouldn't want to anyway,
 | |
| because any program that uses @theglibc{} is not the kernel.
 | |
| 
 | |
| You can use just a priority code as @var{facility_priority}.  In that
 | |
| case, @code{syslog} assumes the default facility established when the
 | |
| Syslog connection was opened.  @xref{Syslog Example}.
 | |
| 
 | |
| The possible values for the priority code are (macros):
 | |
| 
 | |
| @vtable @code
 | |
| @item LOG_EMERG
 | |
| The message says the system is unusable.
 | |
| @item LOG_ALERT
 | |
| Action on the message must be taken immediately.
 | |
| @item LOG_CRIT
 | |
| The message states a critical condition.
 | |
| @item LOG_ERR
 | |
| The message describes an error.
 | |
| @item LOG_WARNING
 | |
| The message is a warning.
 | |
| @item LOG_NOTICE
 | |
| The message describes a normal but important event.
 | |
| @item LOG_INFO
 | |
| The message is purely informational.
 | |
| @item LOG_DEBUG
 | |
| The message is only for debugging purposes.
 | |
| @end vtable
 | |
| 
 | |
| Results are undefined if the priority code is anything else.
 | |
| 
 | |
| If the process does not presently have a Syslog connection open (i.e.,
 | |
| it did not call @code{openlog}), @code{syslog} implicitly opens the
 | |
| connection the same as @code{openlog} would, with the following defaults
 | |
| for information that would otherwise be included in an @code{openlog}
 | |
| call: The default identification string is the program name.  The
 | |
| default default facility is @code{LOG_USER}.  The default for all the
 | |
| connection options in @var{options} is as if those bits were off.
 | |
| @code{syslog} leaves the Syslog connection open.
 | |
| 
 | |
| If the @file{/dev/log} socket is not open and connected, @code{syslog}
 | |
| opens and connects it, the same as @code{openlog} with the
 | |
| @code{LOG_NDELAY} option would.
 | |
| 
 | |
| @code{syslog} leaves @file{/dev/log} open and connected unless its attempt
 | |
| to send the message failed, in which case @code{syslog} closes it (with the
 | |
| hope that a future implicit open will restore the Syslog connection to a
 | |
| usable state).
 | |
| 
 | |
| Example:
 | |
| 
 | |
| @smallexample
 | |
| 
 | |
| #include <syslog.h>
 | |
| syslog (LOG_MAKEPRI(LOG_LOCAL1, LOG_ERROR),
 | |
|         "Unable to make network connection to %s.  Error=%m", host);
 | |
| 
 | |
| @end smallexample
 | |
| 
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @comment syslog.h
 | |
| @comment BSD
 | |
| @deftypefun void vsyslog (int @var{facility_priority}, const char *@var{format}, va_list @var{arglist})
 | |
| @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}}
 | |
| @c vsyslog @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
 | |
| @c  vsyslog_chk dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd
 | |
| 
 | |
| This is functionally identical to @code{syslog}, with the BSD style variable
 | |
| length argument.
 | |
| 
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node closelog
 | |
| @subsection closelog
 | |
| 
 | |
| The symbols referred to in this section are declared in the file
 | |
| @file{syslog.h}.
 | |
| 
 | |
| @comment syslog.h
 | |
| @comment BSD
 | |
| @deftypefun void closelog (void)
 | |
| @safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{} @acsfd{}}}
 | |
| @c closelog @asulock @aculock @acsfd
 | |
| @c  libc_lock_lock @asulock @aculock
 | |
| @c  closelog_internal @acsfd [always guarded by syslog_lock, so no race]
 | |
| @c   close dup@acsfd
 | |
| @c  cancel_handler(NULL) @aculock
 | |
| @c   libc_lock_unlock @aculock
 | |
| 
 | |
| @code{closelog} closes the current Syslog connection, if there is one.
 | |
| This includes closing the @file{/dev/log} socket, if it is open.
 | |
| @code{closelog} also sets the identification string for Syslog messages
 | |
| back to the default, if @code{openlog} was called with a non-NULL argument
 | |
| to @var{ident}.  The default identification string is the program name
 | |
| taken from argv[0].
 | |
| 
 | |
| If you are writing shared library code that uses @code{openlog} to
 | |
| generate custom syslog output, you should use @code{closelog} to drop
 | |
| @theglibc{}'s internal reference to the @var{ident} pointer when you are
 | |
| done.  Please read the section on @code{openlog} for more information:
 | |
| @xref{openlog}.
 | |
| 
 | |
| @code{closelog} does not flush any buffers.  You do not have to call
 | |
| @code{closelog} before re-opening a Syslog connection with @code{openlog}.
 | |
| Syslog connections are automatically closed on exec or exit.
 | |
| 
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node setlogmask
 | |
| @subsection setlogmask
 | |
| 
 | |
| The symbols referred to in this section are declared in the file
 | |
| @file{syslog.h}.
 | |
| 
 | |
| @comment syslog.h
 | |
| @comment BSD
 | |
| @deftypefun int setlogmask (int @var{mask})
 | |
| @safety{@prelim{}@mtunsafe{@mtasurace{:LogMask}}@asunsafe{}@acsafe{}}
 | |
| @c Read and modify are not guarded by syslog_lock, so concurrent changes
 | |
| @c or even uses are undefined.  This should use an atomic swap instead,
 | |
| @c at least for modifications.
 | |
| 
 | |
| @code{setlogmask} sets a mask (the ``logmask'') that determines which
 | |
| future @code{syslog} calls shall be ignored.  If a program has not
 | |
| called @code{setlogmask}, @code{syslog} doesn't ignore any calls.  You
 | |
| can use @code{setlogmask} to specify that messages of particular
 | |
| priorities shall be ignored in the future.
 | |
| 
 | |
| A @code{setlogmask} call overrides any previous @code{setlogmask} call.
 | |
| 
 | |
| Note that the logmask exists entirely independently of opening and
 | |
| closing of Syslog connections.
 | |
| 
 | |
| Setting the logmask has a similar effect to, but is not the same as,
 | |
| configuring Syslog.  The Syslog configuration may cause Syslog to
 | |
| discard certain messages it receives, but the logmask causes certain
 | |
| messages never to get submitted to Syslog in the first place.
 | |
| 
 | |
| @var{mask} is a bit string with one bit corresponding to each of the
 | |
| possible message priorities.  If the bit is on, @code{syslog} handles
 | |
| messages of that priority normally.  If it is off, @code{syslog}
 | |
| discards messages of that priority.  Use the message priority macros
 | |
| described in @ref{syslog; vsyslog} and the @code{LOG_MASK} to construct
 | |
| an appropriate @var{mask} value, as in this example:
 | |
| 
 | |
| @smallexample
 | |
| LOG_MASK(LOG_EMERG) | LOG_MASK(LOG_ERROR)
 | |
| @end smallexample
 | |
| 
 | |
| or
 | |
| 
 | |
| @smallexample
 | |
| ~(LOG_MASK(LOG_INFO))
 | |
| @end smallexample
 | |
| 
 | |
| There is also a @code{LOG_UPTO} macro, which generates a mask with the bits
 | |
| on for a certain priority and all priorities above it:
 | |
| 
 | |
| @smallexample
 | |
| LOG_UPTO(LOG_ERROR)
 | |
| @end smallexample
 | |
| 
 | |
| The unfortunate naming of the macro is due to the fact that internally,
 | |
| higher numbers are used for lower message priorities.
 | |
| 
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node Syslog Example
 | |
| @subsection Syslog Example
 | |
| 
 | |
| Here is an example of @code{openlog}, @code{syslog}, and @code{closelog}:
 | |
| 
 | |
| This example sets the logmask so that debug and informational messages
 | |
| get discarded without ever reaching Syslog.  So the second @code{syslog}
 | |
| in the example does nothing.
 | |
| 
 | |
| @smallexample
 | |
| #include <syslog.h>
 | |
| 
 | |
| setlogmask (LOG_UPTO (LOG_NOTICE));
 | |
| 
 | |
| openlog ("exampleprog", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
 | |
| 
 | |
| syslog (LOG_NOTICE, "Program started by User %d", getuid ());
 | |
| syslog (LOG_INFO, "A tree falls in a forest");
 | |
| 
 | |
| closelog ();
 | |
| 
 | |
| @end smallexample
 |