Greetings!
I have finally gotten fed up with all of the Python scripts used in my company
that have every parameter hard-coded. I am rewriting one of them to read all
of its parameters from an XML file. Then, we can change the XML file to
control which database it is using, whether its running in debug mode or not,
and various other things. One of the parameters I want the XML file to contain
is the name of the script's log file.
I have a class named Settings that will contain all the parameters read from
the XML file. But if something goes wrong, I want to log it. So, I want to
have a Logger object for it to use. I use a hard-coded file name for that.
Then, after reading the XML file, I want to create a second Logger object that
will be used by the rest of the script.
When I try to use the second Logger object, I get an exception complaining that
'unicode' object has no attribute 'write'.
The script and the exception messages are below. Can anyone see what I'm doing
wrong?
Can anyone point me to a web site documenting the log4py module?
Thank you very much.
RobR
import os
import sys
import string
import win32api
import win32event
import win32com
import win32com.client
import win32net
import pythoncom
import time
import log4py
import xml.dom.minidom as minidom
import argparse
#Set to 1 to run loop once for debugging, set to 0 for operation
#Debug = 1
class DataElement:
value = None
def __init__(self, element = None):
if element != None:
self.GetData(element)
def GetData(self, element):
nodes = element.childNodes
for node in nodes:
if node.nodeType == node.TEXT_NODE:
self.value = node.data
def GetDataFromRoot(self, rootElement, targetName, defaultValue):
elements = rootElement.getElementsByTagName(targetName)
if elements:
dataElement = DataElement(elements[0])
if (dataElement):
self.value = dataElement.value
else:
self.value = defaultValue
else:
self.Value = defaultValue
def __nonzero__(self):
return self.value != None
class Settings:
logFile = "TaskToCrane_somethingnew.log"
def __init__(self):
print "I don't know what XML file to use yet."
def __init__(self, fileName, tempLogger):
tempLogger.info( "Settings will come from " + fileName)
settingsDoc = minidom.parse(fileName)
rootElement = settingsDoc.documentElement
# print "Root element name: " + rootElement.tagName
programControlElement =
rootElement.getElementsByTagName("ProgramControl")[0]
logFileElement = DataElement()
logFileElement.GetDataFromRoot(programControlElement, "LogFile",
self.logFile)
if logFileElement:
self.logFile = logFileElement.value
else:
tempLogger.error("Failed to get log file name.")
def Log(self, logger):
logger.info("Log file: " + str(self.logFile))
if __name__ == "__main__" :
TempLogger = log4py.Logger().get_instance("main")
TempLogger.set_rotation(log4py.ROTATE_DAILY, 5)
TempLogger.set_loglevel(log4py.LOGLEVEL_DEBUG)
TempLogger.set_formatstring("%T - %L %M")
TempLogger.set_target("TaskToCrane_logging_base.log")
parser = argparse.ArgumentParser()
parser.add_argument("settings_file")
args = parser.parse_args()
programSettings = Settings(args.settings_file, TempLogger)
TempLogger.info("Setting actual log target to " + programSettings.logFile)
Logger = log4py.Logger().get_instance("main")
Logger.set_rotation(log4py.ROTATE_DAILY, 5)
Logger.set_loglevel(log4py.LOGLEVEL_DEBUG)
Logger.set_formatstring("%T - %L %M")
Logger.set_target(programSettings.logFile)
programSettings.Log(TempLogger)
Traceback (most recent call last):
File
"D:\Python27\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line
322, in RunScript
debugger.run(codeObject, __main__.__dict__, start_stepping=0)
File "D:\Python27\Lib\site-packages\pythonwin\pywin\debugger\__init__.py",
line 60, in run
_GetCurrentDebugger().run(cmd, globals,locals, start_stepping)
File "D:\Python27\Lib\site-packages\pythonwin\pywin\debugger\debugger.py",
line 655, in run
exec cmd in globals, locals
File "D:\Program Files\WinCaps\Scripts\TaskToCrane_logging.py", line 91, in
<module>
programSettings.Log(TempLogger)
File "D:\Program Files\WinCaps\Scripts\TaskToCrane_logging.py", line 66, in
Log
logger.info("Log file: " + str(self.logFile))
File "log4py.py", line 359, in info
self.__Logger_showmessage(message, MSG_INFO)
File "log4py.py", line 534, in __Logger_showmessage
target.write("%s\n" % line)
AttributeError: 'unicode' object h
--
http://mail.python.org/mailman/listinfo/python-list