aboutsummaryrefslogtreecommitdiffstats
path: root/Mailman/Logging/Logger.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Mailman/Logging/Logger.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/Mailman/Logging/Logger.py b/Mailman/Logging/Logger.py
new file mode 100644
index 00000000..0cb7c6af
--- /dev/null
+++ b/Mailman/Logging/Logger.py
@@ -0,0 +1,103 @@
+# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+"""File-based logger, writes to named category files in mm_cfg.LOG_DIR."""
+
+import sys
+import os
+import codecs
+from types import StringType
+
+from Mailman import mm_cfg
+from Mailman.Logging.Utils import _logexc
+
+# Set this to the encoding to be used for your log file output. If set to
+# None, then it uses your system's default encoding. Otherwise, it must be an
+# encoding string appropriate for codecs.open().
+LOG_ENCODING = 'iso-8859-1'
+
+
+
+class Logger:
+ def __init__(self, category, nofail=1, immediate=0):
+ """nofail says to fallback to sys.__stderr__ if write fails to
+ category file - a complaint message is emitted, but no exception is
+ raised. Set nofail=0 if you want to handle the error in your code,
+ instead.
+
+ immediate=1 says to create the log file on instantiation.
+ Otherwise, the file is created only when there are writes pending.
+ """
+ self.__filename = os.path.join(mm_cfg.LOG_DIR, category)
+ self.__fp = None
+ self.__nofail = nofail
+ self.__encoding = LOG_ENCODING or sys.getdefaultencoding()
+ if immediate:
+ self.__get_f()
+
+ def __del__(self):
+ self.close()
+
+ def __repr__(self):
+ return '<%s to %s>' % (self.__class__.__name__, `self.__filename`)
+
+ def __get_f(self):
+ if self.__fp:
+ return self.__fp
+ else:
+ try:
+ ou = os.umask(002)
+ try:
+ try:
+ f = codecs.open(
+ self.__filename, 'a+', self.__encoding, 'replace',
+ 1)
+ except LookupError:
+ f = open(self.__filename, 'a+', 1)
+ self.__fp = f
+ finally:
+ os.umask(ou)
+ except IOError, e:
+ if self.__nofail:
+ _logexc(self, e)
+ f = self.__fp = sys.__stderr__
+ else:
+ raise
+ return f
+
+ def flush(self):
+ f = self.__get_f()
+ if hasattr(f, 'flush'):
+ f.flush()
+
+ def write(self, msg):
+ if isinstance(msg, StringType):
+ msg = unicode(msg, self.__encoding)
+ f = self.__get_f()
+ try:
+ f.write(msg)
+ except IOError, msg:
+ _logexc(self, msg)
+
+ def writelines(self, lines):
+ for l in lines:
+ self.write(l)
+
+ def close(self):
+ if not self.__fp:
+ return
+ self.__get_f().close()
+ self.__fp = None