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

.. module:: syslog
   :platform: Unix
   :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...')
