Issue with logging.config

Peter Otten __peter__ at web.de
Tue Jul 13 08:02:38 EDT 2010


Joe Hughes wrote:

> I'm doing some work with logging.config and I'm running into an
> interesting situation.  I've run this by python-help, but that didn't help
> so I thought I would send to the list.  Here is the config file
> 
> [loggers]
> keys=root,log,syslog
> 
> [handlers]
> keys=console,log,syslog
> 
> [formatters]
> keys=rootFormat,logFormat,syslogFormat
> 
> [logger_root]
> level=DEBUG
> handlers=console
> 
> [logger_log]
> level=DEBUG
> handlers=log
> qualname=log
> 
> [logger_syslog]
> level=DEBUG
> handlers=syslog
> qualname=syslog
> 
> [handler_console]
> class=StreamHandler
> level=DEBUG
> formatter=rootFormat
> args=(sys.stdout,)
> 
> [handler_log]
> class=handlers.RotatingFileHandler
> level=DEBUG
> formatter=logFormat
> args=('E:\local\Logs\syslog_interface.txt', 'a', 10000000, 10)
> propagate=0
> 
> [handler_syslog]
> class=handlers.SysLogHandler
> level=DEBUG
> formatter=syslogFormat
> host=141.232.41.205
> port=handlers.SYSLOG_UDP_PORT
> facility=LOG_LOCAL0
> 
args=(('141.232.41.205',handlers.SYSLOG_UDP_PORT),handlers.SysLogHandler.LOG_LOCAL0)
> 
> [formatter_rootFormat]
> format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
> 
> [formatter_logFormat]
> format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
> 
> [formatter_syslogFormat]
> format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
> 
> and the python code
> 
> ########################################################################
> # Imports
> ########################################################################
> import logging
> import logging.config
> import os
> import re
> from threading import Thread
> 
> ########################################################################
> # Constants
> ########################################################################
> CONFIG_FILENAME = 'E:\local\Config\syslog_interface.conf'
> MCU_LIST_FILENAME = 'E:\local\Scada_Devices\mcu.txt'
> 
> ########################################################################
> # Classes
> ########################################################################
> 
> ########
> # PingIt
> ########
> class PingIt(Thread):
>     def __init__(self, mcuIP):
>         Thread.__init__(self)
>         self.ip = mcuIP
>         self.status = -1
> 
>     def run(self):
>         pinging = os.popen("ping -n 2 " + self.ip, 'r')
> 
>         while 1:
>             line = pinging.readline()
> 
>             if not line:
>                 break
> 
>             gotResponse = re.findall(PingIt.lifeline, line)
> 
>             if gotResponse:
>                 self.status = int(gotResponse[0])
> 
> ########################################################################
> # Main Routine
> ########################################################################
> #
> # Get the logger configuration information
> #
> logging.config.fileConfig(CONFIG_FILENAME)
> 
> #
> # Check if running from command line and create logger
> #
> if os.environ.get('PROMPT'):
>     #
>     # create logger for output to stdout
>     #
>     logger = logging.getLogger('root')
> else:
>     #
>     # create logger for output to logfile
>     #
>     logger = logging.getLogger('log')
> 
> #
> # Create logger for syslog output
> #
> syslog = logging.getLogger('syslog')
> 
> #
> # Declare variables
> #
> PingIt.lifeline = re.compile(r"Received = (\d)")
> mcu_dict = {}
> ping_list = []
> status = ("Not responding", "Responded to only 1 ping of 2", "Alive")
> 
> #
> # Open the MCU file
> #
> mcu_file = open(MCU_LIST_FILENAME, 'r')
> 
> #
> # Loop through the contents of the MCU file and ping the IPs
> #
> for mcu in mcu_file:
>     #
>     # mcu file contents example
>     # 192.168.97.227 MCU_HMSTD
>     #
>     # mcu_info[0] = MCU IP Address
>     # mcu_info[1] = MCU Name
>     #
>     mcu_info = mcu.split()
>     mcu_dict[mcu_info[0]] = mcu_info[1]
>     current = PingIt(mcu_info[0])
>     logger.info("Pinging " + mcu_info[1])
>     ping_list.append(current)
>     current.start()
> 
> #
> # Loop through ping list and print the response
> #
> for pinged in ping_list:
>     pinged.join()
>     logger.info("Status - " + mcu_dict[pinged.ip] + " is " +
>     status[pinged.status]) syslog.info("Status - " + mcu_dict[pinged.ip] +
>     " is " + status[pinged.status])
> 
> This is the output from the code
> 
> 2010-07-06 14:43:58,280 - log - INFO - Status - netboss2 is Not responding
> msg =  <134>2010-07-06 14:43:58,312 - syslog - INFO - Status - netboss2 is
> Not responding
> address =  ('141.232.41.205', 514)
> Traceback (most recent call last):
>   File "C:\Python31\lib\logging\handlers.py", line 786, in emit
>     self.socket.sendto(msg, self.address)
> TypeError: sendto() takes exactly 3 arguments (2 given)
> 2010-07-06 14:43:58,312 - syslog - INFO - Status - netboss2 is Not
> responding
> 
> This is the handlers.py code from the library.  I added the print
> statement to figure out why it is asking for three args but only getting
> two.
> 
> Line 777 of handlers.py
> 
>         try:
>             if self.unixsocket:
>                 try:
>                     self.socket.send(msg)
>                 except socket.error:
>                     self._connect_unixsocket(self.address)
>                     self.socket.send(msg)
>             else:
>                 print('msg = ', msg, '\naddress = ', self.address)
>                 self.socket.sendto(msg, self.address)
>         except (KeyboardInterrupt, SystemExit):
>             raise
>         except:
>             self.handleError(record)
> 
> line 790 of handlers.py
> 
> This is Python/Idle 3.1.2 on Windows 2003 Server.  If anyone has an idea
> about why this happening I would appreciate knowing what the issue is.

The error can be reproduced with

Python 3.1.1+ (r311:74480, Nov  2 2009, 15:45:00)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> from logging.handlers import SysLogHandler
>>> handler = SysLogHandler()
>>> logger = logging.getLogger()
>>> logger.addHandler(handler)
>>> logger.critical("yadda")
Traceback (most recent call last):
  File "/usr/lib/python3.1/logging/handlers.py", line 785, in emit
    self.socket.sendto(msg, self.address)
TypeError: sendto() takes exactly 3 arguments (2 given)

This is is a known bug, see http://bugs.python.org/issue7077

Peter





More information about the Python-list mailing list