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