1 # -*- coding: utf-8 -*-
2 from twisted
.python
import log
, failure
3 from audiomangler
import Config
7 from cStringIO
import StringIO
9 from StringIO
import StringIO
11 loglevels
= dict(ERROR
=0, WARNING
=1, INFO
=2, DEBUG
=3)
12 locals().update(loglevels
)
13 loglevels
.update(map(reversed, loglevels
.items()))
15 class FilteredFileLogObserver(log
.FileLogObserver
):
16 def __init__(self
, f
, loglevel
=INFO
):
18 if isinstance(loglevel
, basestring
):
19 loglevel
= loglevels
[loglevel
]
20 self
.loglevel
= loglevel
22 def emit(self
, eventDict
):
23 if eventDict
.get('loglevel',DEBUG
) > self
.loglevel
:
25 encoding
= sys
.stdout
.encoding
26 if eventDict
['isError'] and 'failure' in eventDict
:
27 text
= log
.textFromEventDict(eventDict
)
28 elif eventDict
['message']:
29 text
= ' '.join(s
.encode(encoding
,'replace') if isinstance(s
,unicode) else s
for s
in eventDict
['message'])
30 elif 'format' in eventDict
or 'consoleformat' in eventDict
:
31 fmt
= eventDict
.get('format',eventDict
.get('consoleformat'))
32 text
= (fmt
% eventDict
).encode(encoding
,'replace')
34 text
= log
.textFromEventDict(eventDict
)
35 timeStr
= self
.formatTime(eventDict
['time'])
36 self
.output
.write(timeStr
+ ' [' + loglevels
[eventDict
['loglevel']].ljust(7) + '] ' + text
+ '\n')
38 class FilteredConsoleLogObserver
:
39 def __init__(self
, loglevel
=INFO
):
40 self
.loglevel
= loglevel
43 log
.addObserver(self
.emit
)
46 log
.removeObserver(self
.emit
)
48 def emit(self
, eventDict
):
49 if eventDict
.get('loglevel',DEBUG
) > self
.loglevel
:
51 encoding
= sys
.stdout
.encoding
52 if eventDict
['isError'] and 'failure' in eventDict
:
53 text
= log
.textFromEventDict(eventDict
)
54 elif eventDict
['message']:
55 text
= ''.join(s
.encode(encoding
,'replace') if isinstance(s
,unicode) else s
for s
in eventDict
['message'])
56 elif 'format' in eventDict
or 'consoleformat' in eventDict
:
57 fmt
= eventDict
.get('consoleformat',eventDict
.get('format'))
58 text
= (fmt
% eventDict
).encode(encoding
,'replace')
60 text
= log
.textFromEventDict(eventDict
)
61 sys
.stdout
.write(text
+ '\n')
68 def get_level(x
, default
=ERROR
):
78 def err(*msg
, **kwargs
):
79 global collector
, logfile
80 if 'nologerror' not in kwargs
:
83 collector
= FilteredFileLogObserver(StringIO(), ERROR
)
88 logfile
= FilteredFileLogObserver(open(Config
.get('logfile','audiomangler-%d.log' % os
.getpid()), 'wb'), get_level(Config
['loglevel']))
91 kwargs
['loglevel'] = ERROR
92 if msg
and isinstance(msg
[0],(failure
.Failure
,Exception)):
93 log
.err(*msg
, **kwargs
)
95 log
.msg(*msg
, **kwargs
)
97 def msg(*msg
, **kwargs
):
99 kwargs
.setdefault('loglevel',DEBUG
)
100 if kwargs
['loglevel'] == ERROR
:
103 if Config
['logfile'] and logfile
is None and kwargs
['loglevel'] <= get_level(Config
['loglevel']):
105 logfile
= FilteredFileLogObserver(open(Config
['logfile'], 'wb'), Config
['loglevel'])
108 log
.msg(*msg
, **kwargs
)
110 def fatal(*msg
, **kwargs
):
119 collector
.output
.flush()
121 text
= collector
.output
.getvalue()
123 print "The following errors occurred:"
125 print "The above errors may also have been reported during processing."
127 logfile
.output
.flush()
129 print "Errors are also recorded in the logfile '%s'." % os
.path
.abspath(logfile
.output
.name
)
133 logout
= FilteredConsoleLogObserver(Config
['consolelevel'])
135 if log
.defaultObserver
:
136 log
.defaultObserver
.stop()
137 log
.defaultObserver
= None
141 atexit
.register(cleanup
)
143 __all__
= ['err','msg','fatal','ERROR','WARNING','INFO','DEBUG']