Commit 97820be1 authored by Vinay Sajip's avatar Vinay Sajip

Issue #7086: Added TCP support to SysLogHandler and tidied up some anachronisms in the code.

parent edc26ad1
...@@ -763,11 +763,13 @@ functions. ...@@ -763,11 +763,13 @@ functions.
Does basic configuration for the logging system by creating a Does basic configuration for the logging system by creating a
:class:`StreamHandler` with a default :class:`Formatter` and adding it to the :class:`StreamHandler` with a default :class:`Formatter` and adding it to the
root logger. The function does nothing if any handlers have been defined for root logger. The functions :func:`debug`, :func:`info`, :func:`warning`,
the root logger. The functions :func:`debug`, :func:`info`, :func:`warning`,
:func:`error` and :func:`critical` will call :func:`basicConfig` automatically :func:`error` and :func:`critical` will call :func:`basicConfig` automatically
if no handlers are defined for the root logger. if no handlers are defined for the root logger.
This function does nothing if the root logger already has handlers
configured for it.
The following keyword arguments are supported. The following keyword arguments are supported.
+--------------+---------------------------------------------+ +--------------+---------------------------------------------+
...@@ -1957,16 +1959,22 @@ The :class:`SysLogHandler` class, located in the :mod:`logging.handlers` module, ...@@ -1957,16 +1959,22 @@ The :class:`SysLogHandler` class, located in the :mod:`logging.handlers` module,
supports sending logging messages to a remote or local Unix syslog. supports sending logging messages to a remote or local Unix syslog.
.. class:: SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER) .. class:: SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)
Returns a new instance of the :class:`SysLogHandler` class intended to Returns a new instance of the :class:`SysLogHandler` class intended to
communicate with a remote Unix machine whose address is given by *address* in communicate with a remote Unix machine whose address is given by *address* in
the form of a ``(host, port)`` tuple. If *address* is not specified, the form of a ``(host, port)`` tuple. If *address* is not specified,
``('localhost', 514)`` is used. The address is used to open a UDP socket. An ``('localhost', 514)`` is used. The address is used to open a socket. An
alternative to providing a ``(host, port)`` tuple is providing an address as a alternative to providing a ``(host, port)`` tuple is providing an address as a
string, for example "/dev/log". In this case, a Unix domain socket is used to string, for example "/dev/log". In this case, a Unix domain socket is used to
send the message to the syslog. If *facility* is not specified, send the message to the syslog. If *facility* is not specified,
:const:`LOG_USER` is used. :const:`LOG_USER` is used. The type of socket opened depends on the
*socktype* argument, which defaults to :const:`socket.SOCK_DGRAM` and thus
opens a UDP socket. To open a TCP socket (for use with the newer syslog
daemons such as rsyslog), specify a value of :const:`socket.SOCK_STREAM`.
.. versionchanged:: 3.2
*socktype* was added.
.. method:: close() .. method:: close()
......
...@@ -46,8 +46,8 @@ except ImportError: ...@@ -46,8 +46,8 @@ except ImportError:
__author__ = "Vinay Sajip <vinay_sajip@red-dove.com>" __author__ = "Vinay Sajip <vinay_sajip@red-dove.com>"
__status__ = "production" __status__ = "production"
__version__ = "0.5.0.7" __version__ = "0.5.0.9"
__date__ = "20 January 2009" __date__ = "09 October 2009"
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Miscellaneous module data # Miscellaneous module data
......
...@@ -19,7 +19,7 @@ Configuration functions for the logging package for Python. The core package ...@@ -19,7 +19,7 @@ Configuration functions for the logging package for Python. The core package
is based on PEP 282 and comments thereto in comp.lang.python, and influenced is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system. by Apache's log4j system.
Copyright (C) 2001-2008 Vinay Sajip. All Rights Reserved. Copyright (C) 2001-2009 Vinay Sajip. All Rights Reserved.
To use, simply 'import logging' and log away! To use, simply 'import logging' and log away!
""" """
......
# Copyright 2001-2007 by Vinay Sajip. All Rights Reserved. # Copyright 2001-2009 by Vinay Sajip. All Rights Reserved.
# #
# Permission to use, copy, modify, and distribute this software and its # Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted, # documentation for any purpose and without fee is hereby granted,
...@@ -41,6 +41,7 @@ DEFAULT_UDP_LOGGING_PORT = 9021 ...@@ -41,6 +41,7 @@ DEFAULT_UDP_LOGGING_PORT = 9021
DEFAULT_HTTP_LOGGING_PORT = 9022 DEFAULT_HTTP_LOGGING_PORT = 9022
DEFAULT_SOAP_LOGGING_PORT = 9023 DEFAULT_SOAP_LOGGING_PORT = 9023
SYSLOG_UDP_PORT = 514 SYSLOG_UDP_PORT = 514
SYSLOG_TCP_PORT = 514
_MIDNIGHT = 24 * 60 * 60 # number of seconds in a day _MIDNIGHT = 24 * 60 * 60 # number of seconds in a day
...@@ -155,7 +156,7 @@ class TimedRotatingFileHandler(BaseRotatingHandler): ...@@ -155,7 +156,7 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
If backupCount is > 0, when rollover is done, no more than backupCount If backupCount is > 0, when rollover is done, no more than backupCount
files are kept - the oldest ones are deleted. files are kept - the oldest ones are deleted.
""" """
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=False): def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False):
BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay) BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
self.when = when.upper() self.when = when.upper()
self.backupCount = backupCount self.backupCount = backupCount
...@@ -690,7 +691,8 @@ class SysLogHandler(logging.Handler): ...@@ -690,7 +691,8 @@ class SysLogHandler(logging.Handler):
"CRITICAL" : "critical" "CRITICAL" : "critical"
} }
def __init__(self, address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER): def __init__(self, address=('localhost', SYSLOG_UDP_PORT),
facility=LOG_USER, socktype=socket.SOCK_DGRAM):
""" """
Initialize a handler. Initialize a handler.
...@@ -702,13 +704,16 @@ class SysLogHandler(logging.Handler): ...@@ -702,13 +704,16 @@ class SysLogHandler(logging.Handler):
self.address = address self.address = address
self.facility = facility self.facility = facility
self.socktype = socktype
if isinstance(address, str): if isinstance(address, str):
self.unixsocket = 1 self.unixsocket = 1
self._connect_unixsocket(address) self._connect_unixsocket(address)
else: else:
self.unixsocket = 0 self.unixsocket = 0
self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.socket = socket.socket(socket.AF_INET, socktype)
if socktype == socket.SOCK_STREAM:
self.socket.connect(address)
self.formatter = None self.formatter = None
def _connect_unixsocket(self, address): def _connect_unixsocket(self, address):
...@@ -781,8 +786,10 @@ class SysLogHandler(logging.Handler): ...@@ -781,8 +786,10 @@ class SysLogHandler(logging.Handler):
except socket.error: except socket.error:
self._connect_unixsocket(self.address) self._connect_unixsocket(self.address)
self.socket.send(msg) self.socket.send(msg)
else: elif self.socktype == socket.SOCK_DGRAM:
self.socket.sendto(msg, self.address) self.socket.sendto(msg, self.address)
else:
self.socket.sendall(msg)
except (KeyboardInterrupt, SystemExit): except (KeyboardInterrupt, SystemExit):
raise raise
except: except:
......
...@@ -87,6 +87,9 @@ C-API ...@@ -87,6 +87,9 @@ C-API
Library Library
------- -------
- Issue #7086: Added TCP support to SysLogHandler, and tidied up some
anachronisms in the code which were a relic of 1.5.2 compatibility.
- Issue #7082: When falling back to the MIME 'name' parameter, the - Issue #7082: When falling back to the MIME 'name' parameter, the
correct place to look for it is the Content-Type header. correct place to look for it is the Content-Type header.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment