:mod:`!syslog` --- Unix syslog library routines
===============================================

.. module:: syslog
   :synopsis: An interface to the Unix syslog library routines.

--------------

This module provides an interface to the Unix ``syslog`` library routines.
Refer to the Unix manual pages for a detailed description of the ``syslog``
facility.

.. availability:: Unix, not WASI, not iOS.

This module wraps the system ``syslog`` family of routines.  A pure Python
library that can speak to a syslog server is available in the
:mod:`logging.handlers` module as :class:`~logging.handlers.SysLogHandler`.

The module defines the following functions:


.. function:: syslog(message)
              syslog(priority, message)

   Send the string *message* to the system logger.  A trailing newline is added
   if necessary.  Each message is tagged with a priority composed of a
   *facility* and a *level*.  The optional *priority* argument, which defaults
   to :const:`LOG_INFO`, determines the message priority.  If the facility is
   not encoded in *priority* using logical-or (``LOG_INFO | LOG_USER``), the
   value given in the :func:`openlog` call is used.

   If :func:`openlog` has not been called prior to the call to :func:`syslog`,
   :func:`openlog` will be called with no arguments.

   .. audit-event:: syslog.syslog priority,message syslog.syslog

   .. versionchanged:: 3.2
      In previous versions, :func:`openlog` would not be called automatically if
      it wasn't called prior to the call to :func:`syslog`, deferring to the syslog
      implementation to call ``openlog()``.

   .. versionchanged:: 3.12
      This function is restricted in subinterpreters.
      (Only code that runs in multiple interpreters is affected and
      the restriction is not relevant for most users.)
      :func:`openlog` must be called in the main interpreter before :func:`syslog` may be used
      in a subinterpreter.  Otherwise it will raise :exc:`RuntimeError`.


.. function:: openlog([ident[, logoption[, facility]]])

   Logging options of subsequent :func:`syslog` calls can be set by calling
   :func:`openlog`.  :func:`syslog` will call :func:`openlog` with no arguments
   if the log is not currently open.

   The optional *ident* keyword argument is a string which is prepended to every
   message, and defaults to ``sys.argv[0]`` with leading path components
   stripped.  The optional *logoption* keyword argument (default is 0) is a bit
   field -- see below for possible values to combine.  The optional *facility*
   keyword argument (default is :const:`LOG_USER`) sets the default facility for
   messages which do not have a facility explicitly encoded.

   .. audit-event:: syslog.openlog ident,logoption,facility syslog.openlog

   .. versionchanged:: 3.2
      In previous versions, keyword arguments were not allowed, and *ident* was
      required.

   .. versionchanged:: 3.12
      This function is restricted in subinterpreters.
      (Only code that runs in multiple interpreters is affected and
      the restriction is not relevant for most users.)
      This may only be called in the main interpreter.
      It will raise :exc:`RuntimeError` if called in a subinterpreter.


.. function:: closelog()

   Reset the syslog module values and call the system library ``closelog()``.

   This causes the module to behave as it does when initially imported.  For
   example, :func:`openlog` will be called on the first :func:`syslog` call (if
   :func:`openlog` hasn't already been called), and *ident* and other
   :func:`openlog` parameters are reset to defaults.

   .. audit-event:: syslog.closelog "" syslog.closelog

   .. versionchanged:: 3.12
      This function is restricted in subinterpreters.
      (Only code that runs in multiple interpreters is affected and
      the restriction is not relevant for most users.)
      This may only be called in the main interpreter.
      It will raise :exc:`RuntimeError` if called in a subinterpreter.


.. function:: setlogmask(maskpri)

   Set the priority mask to *maskpri* and return the previous mask value.  Calls
   to :func:`syslog` with a priority level not set in *maskpri* are ignored.
   The default is to log all priorities.  The function ``LOG_MASK(pri)``
   calculates the mask for the individual priority *pri*.  The function
   ``LOG_UPTO(pri)`` calculates the mask for all priorities up to and including
   *pri*.

   .. audit-event:: syslog.setlogmask maskpri syslog.setlogmask

The module defines the following constants:


.. data:: LOG_EMERG
          LOG_ALERT
          LOG_CRIT
          LOG_ERR
          LOG_WARNING
          LOG_NOTICE
          LOG_INFO
          LOG_DEBUG

   Priority levels (high to low).


.. data:: LOG_AUTH
          LOG_AUTHPRIV
          LOG_CRON
          LOG_DAEMON
          LOG_FTP
          LOG_INSTALL
          LOG_KERN
          LOG_LAUNCHD
          LOG_LPR
          LOG_MAIL
          LOG_NETINFO
          LOG_NEWS
          LOG_RAS
          LOG_REMOTEAUTH
          LOG_SYSLOG
          LOG_USER
          LOG_UUCP
          LOG_LOCAL0
          LOG_LOCAL1
          LOG_LOCAL2
          LOG_LOCAL3
          LOG_LOCAL4
          LOG_LOCAL5
          LOG_LOCAL6
          LOG_LOCAL7

   Facilities, depending on availability in ``<syslog.h>`` for :const:`LOG_AUTHPRIV`,
   :const:`LOG_FTP`, :const:`LOG_NETINFO`, :const:`LOG_REMOTEAUTH`,
   :const:`LOG_INSTALL` and :const:`LOG_RAS`.

   .. versionchanged:: 3.13
       Added :const:`LOG_FTP`, :const:`LOG_NETINFO`, :const:`LOG_REMOTEAUTH`,
       :const:`LOG_INSTALL`, :const:`LOG_RAS`, and :const:`LOG_LAUNCHD`.

.. data:: LOG_PID
          LOG_CONS
          LOG_NDELAY
          LOG_ODELAY
          LOG_NOWAIT
          LOG_PERROR

   Log options, depending on availability in ``<syslog.h>`` for
   :const:`LOG_ODELAY`, :const:`LOG_NOWAIT` and :const:`LOG_PERROR`.


Examples
--------

Simple example
~~~~~~~~~~~~~~

A simple set of examples::

   import syslog

   syslog.syslog('Processing started')
   if error:
       syslog.syslog(syslog.LOG_ERR, 'Processing started')

An example of setting some log options, these would include the process ID in
logged messages, and write the messages to the destination facility used for
mail logging::

   syslog.openlog(logoption=syslog.LOG_PID, facility=syslog.LOG_MAIL)
   syslog.syslog('E-mail processing initiated...')
