@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
