6 from twisted.python import log
8 class EncodeReplacerPipe(object):
9 def __init__(self, inner_file):
10 self.inner_file = inner_file
12 def write(self, data):
13 if isinstance(data, unicode):
15 data = data.encode(self.inner_file.encoding, 'replace')
17 data = data.encode('ascii', 'replace')
18 self.inner_file.write(data)
20 self.inner_file.flush()
22 class LogFile(object):
23 def __init__(self, filename):
24 self.filename = filename
25 self.inner_file = None
28 if self.inner_file is not None:
29 self.inner_file.close()
30 open(self.filename, 'a').close()
31 f = open(self.filename, 'rb')
32 f.seek(0, os.SEEK_END)
34 if length > 100*1000*1000:
35 f.seek(-1000*1000, os.SEEK_END)
37 if f.read(1) in ('', '\n'):
41 f = open(self.filename, 'wb')
44 self.inner_file = codecs.open(self.filename, 'a', 'utf-8')
45 def write(self, data):
46 self.inner_file.write(data)
48 self.inner_file.flush()
50 class TeePipe(object):
51 def __init__(self, outputs):
52 self.outputs = outputs
53 def write(self, data):
54 for output in self.outputs:
57 for output in self.outputs:
60 class TimestampingPipe(object):
61 def __init__(self, inner_file):
62 self.inner_file = inner_file
65 def write(self, data):
67 lines = buf.split('\n')
68 for line in lines[:-1]:
69 self.inner_file.write('%s %s\n' % (datetime.datetime.now(), line))
70 self.inner_file.flush()
75 class AbortPipe(object):
76 def __init__(self, inner_file):
77 self.inner_file = inner_file
79 def write(self, data):
81 self.inner_file.write(data)
83 sys.stdout = sys.__stdout__
84 log.DefaultObserver.stderr = sys.stderr = sys.__stderr__
87 self.inner_file.flush()
89 class PrefixPipe(object):
90 def __init__(self, inner_file, prefix):
91 self.inner_file = inner_file
95 def write(self, data):
97 lines = buf.split('\n')
98 for line in lines[:-1]:
99 self.inner_file.write(self.prefix + line + '\n')
100 self.inner_file.flush()