[Twisted-Python] [PATCH] make syslog work

Hi. Here's a patch that does a few things to twistd and twisted.python.syslog. 1) twistd: allow using -n and --syslog at the same time, by reordering the elif's. 2) rewrite twisted.python.syslog to save it from bitrot, I don't think it could have worked at all. To avoid code duplication, refactor twisted.python.log a bit; we don't want twistedy time stamps in syslog, but we want rest of the nice things. You have at most a few days to protest, or I will commit. Explicitly saying "looks good" appreciated. Index: twisted/scripts/twistd.py =================================================================== RCS file: /cvs/Twisted/twisted/scripts/twistd.py,v retrieving revision 1.53 diff -u -u -r1.53 twistd.py --- twisted/scripts/twistd.py 19 Jul 2003 21:36:49 -0000 1.53 +++ twisted/scripts/twistd.py 2 Aug 2003 14:46:28 -0000 @@ -282,11 +282,11 @@ print 'daemons cannot log to stdout' os._exit(1) logFile = sys.stdout - elif config['nodaemon'] and not config['logfile']: - logFile = sys.stdout elif config['syslog']: from twisted.python import syslog syslog.startLogging(config['prefix']) + elif config['nodaemon'] and not config['logfile']: + logFile = sys.stdout else: logPath = os.path.abspath(config['logfile'] or 'twistd.log') logFile = logfile.LogFile(os.path.basename(logPath), os.path.dirname(logPath)) Index: twisted/python/log.py =================================================================== RCS file: /cvs/Twisted/twisted/python/log.py,v retrieving revision 1.50 diff -u -u -r1.50 log.py --- twisted/python/log.py 17 Jul 2003 09:11:33 -0000 1.50 +++ twisted/python/log.py 2 Aug 2003 14:46:29 -0000 @@ -235,6 +235,12 @@ self.write = f.write self.flush = f.flush + def prefix(self, eventDict): + y,mon,d,h,min, iigg,nnoo,rree,daylight = time.localtime(eventDict['time']) + return ("%0.4d/%0.2d/%0.2d %0.2d:%0.2d %s [%s] " % + (y, mon, d, h, min, time.tzname[daylight], + eventDict['system'])) + def _emit(self, eventDict): edm = eventDict['message'] if not edm: @@ -244,10 +250,10 @@ text = eventDict['format'] % eventDict else: text = ' '.join(map(str, edm)) + prefix = self.prefix(eventDict) y,mon,d,h,min, iigg,nnoo,rree,daylight = time.localtime(eventDict['time']) - self.write("%0.4d/%0.2d/%0.2d %0.2d:%0.2d %s [%s] %s\n" % - (y, mon, d, h, min, time.tzname[daylight], - eventDict['system'], text.replace("\n","\n\t"))) + self.write("%s%s\n" % + (self.prefix(eventDict), text.replace("\n","\n\t"))) self.flush() # hoorj! def start(self): @@ -306,8 +312,14 @@ _oldshowwarning = None -def startLogging(file, setStdout=1): - """Initialize logging to a specified file. If setStdout is true +def startLogging(file, *a, **kw): + """Initialize logging to a specified file. + """ + flo = FileLogObserver(file) + startLoggingToObserver(flo, *a, **kw) + +def startLoggingToObserver(obs, setStdout=1): + """Initialize logging to a specified observer. If setStdout is true (defaults to yes), also redirect sys.stdout and sys.stderr to the specified file. """ @@ -318,8 +330,7 @@ if defaultObserver: defaultObserver.stop() defaultObserver = None - flo = FileLogObserver(file) - flo.start() + obs.start() msg("Log opened.") if setStdout: sys.stdout = logfile Index: twisted/python/syslog.py =================================================================== RCS file: /cvs/Twisted/twisted/python/syslog.py,v retrieving revision 1.1 diff -u -u -r1.1 syslog.py --- twisted/python/syslog.py 23 Nov 2002 19:54:22 -0000 1.1 +++ twisted/python/syslog.py 2 Aug 2003 14:46:29 -0000 @@ -18,33 +18,25 @@ import sys import log -class SyslogLogger: - +class SyslogLogger(log.FileLogObserver): def __init__(self, prefix): - self.prefix = prefix + syslog.openlog(prefix) + + def prefix(self, eventDict): + return ("[%s] " % eventDict['system']) def write(self, data): if not data or data=='\n': return - logger = log.logOwner.owner() - if logger: - data = logger.log(data) data = data.split('\n') if not data[-1]: data.pop() for line in data: - syslog.syslog("[%s] %s" % (self.prefix, line)) - - def writelines(self, lines): - for line in lines: - self.write(line) - - def close(self): - pass + syslog.syslog(line) def flush(self): pass -def startLogging(prefix='Twisted'): - sys.stdout = sys.stderr = log.logfile = SyslogLogger(prefix) +def startLogging(prefix='Twisted', setStdout=1): + log.startLoggingToObserver(SyslogLogger(prefix), setStdout=setStdout) -- :(){ :|:&};:

On Sat, 2 Aug 2003 17:27:50 +0300 Tommi Virtanen <tv@twistedmatrix.com> wrote:
2) rewrite twisted.python.syslog to save it from bitrot, I don't think it could have worked at all. To avoid code duplication, refactor twisted.python.log a bit; we don't want twistedy time stamps in syslog, but we want rest of the nice things.
Given that we now have a better logging API, syslog should indeed be changed, but slightly differently. Instead of making syslog look like a file, why not use the logging API directly? That is to say, add a SyslogObserver, and then twistef.python.log.addObserver(SyslogObserver().notify). notify() will be called with the low-level dict of the log messages, which would give you a lot more flexibility. -- Itamar Shtull-Trauring http://itamarst.org/ http://www.zoteca.com -- Python & Twisted consulting
participants (2)
-
Itamar Shtull-Trauring
-
Tommi Virtanen