/usr/share/pyshared/ZConfig/components/logger/loghandler.py is in python-zconfig 2.9.3-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | ##############################################################################
#
# Copyright (c) 2001 Zope Foundation and Contributors.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Handlers which can plug into a PEP 282 logger."""
import os
import sys
import weakref
from logging import Handler, StreamHandler
from logging.handlers import RotatingFileHandler as _RotatingFileHandler
from logging.handlers import TimedRotatingFileHandler \
as _TimedRotatingFileHandler
from logging.handlers import SysLogHandler, BufferingHandler
from logging.handlers import HTTPHandler, SMTPHandler
from logging.handlers import NTEventLogHandler as Win32EventLogHandler
_reopenable_handlers = []
def closeFiles():
"""Reopen all logfiles managed by ZConfig configuration."""
while _reopenable_handlers:
wr = _reopenable_handlers.pop()
h = wr()
if h is not None:
h.close()
def reopenFiles():
"""Reopen all logfiles managed by ZConfig configuration."""
for wr in _reopenable_handlers[:]:
h = wr()
if h is None:
try:
_reopenable_handlers.remove(wr)
except ValueError:
continue
else:
h.reopen()
def _remove_from_reopenable(wr):
try:
_reopenable_handlers.remove(wr)
except ValueError:
pass
class FileHandler(StreamHandler):
"""File handler which supports reopening of logs.
Re-opening should be used instead of the 'rollover' feature of
the FileHandler from the standard library's logging package.
"""
def __init__(self, filename, mode="a"):
filename = os.path.abspath(filename)
StreamHandler.__init__(self, open(filename, mode))
self.baseFilename = filename
self.mode = mode
self._wr = weakref.ref(self, _remove_from_reopenable)
_reopenable_handlers.append(self._wr)
def close(self):
self.stream.close()
# This can raise a KeyError if the handler has already been
# removed, but a later error can be raised if
# StreamHandler.close() isn't called. This seems the best
# compromise. :-(
try:
StreamHandler.close(self)
except KeyError:
pass
_remove_from_reopenable(self._wr)
def reopen(self):
self.acquire()
try:
self.stream.close()
self.stream = open(self.baseFilename, self.mode)
finally:
self.release()
class Win32FileHandler(FileHandler):
"""File-based log handler for Windows that supports an additional 'rotate'
method. reopen() is generally useless since Windows cannot do a move on
an open file.
"""
def rotate(self, rotateFilename=None):
if not rotateFilename:
rotateFilename = self.baseFilename + ".last"
error = None
self.close()
try:
os.rename(self.baseFilename, rotateFilename)
except OSError:
pass
self.stream = open(self.baseFilename, self.mode)
if os.name == "nt":
# Make it the default for Windows - we install a 'reopen' handler that
# tries to rotate the logfile.
FileHandler = Win32FileHandler
class RotatingFileHandler(_RotatingFileHandler):
def __init__(self, *args, **kw):
_RotatingFileHandler.__init__(self, *args, **kw)
self._wr = weakref.ref(self, _remove_from_reopenable)
_reopenable_handlers.append(self._wr)
def close(self):
_RotatingFileHandler.close(self)
_remove_from_reopenable(self._wr)
def reopen(self):
self.doRollover()
class TimedRotatingFileHandler(_TimedRotatingFileHandler):
def __init__(self, *args, **kw):
_TimedRotatingFileHandler.__init__(self, *args, **kw)
self._wr = weakref.ref(self, _remove_from_reopenable)
_reopenable_handlers.append(self._wr)
def close(self):
_TimedRotatingFileHandler.close(self)
_remove_from_reopenable(self._wr)
def reopen(self):
self.doRollover()
class NullHandler(Handler):
"""Handler that does nothing."""
def emit(self, record):
pass
def handle(self, record):
pass
class StartupHandler(BufferingHandler):
"""Handler which stores messages in a buffer until later.
This is useful at startup before we can know that we can safely
write to a configuration-specified handler.
"""
def __init__(self):
BufferingHandler.__init__(self, sys.maxint)
def shouldFlush(self, record):
return False
def flushBufferTo(self, target):
while self.buffer:
target.handle(self.buffer.pop(0))
|