~ubuntu-branches/ubuntu/hoary/mailman/hoary-security

« back to all changes in this revision

Viewing changes to Mailman/Logging/Logger.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2004-10-11 02:02:43 UTC
  • Revision ID: james.westby@ubuntu.com-20041011020243-ukiishnhlkmsoh21
Tags: upstream-2.1.5
ImportĀ upstreamĀ versionĀ 2.1.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
 
2
#
 
3
# This program is free software; you can redistribute it and/or
 
4
# modify it under the terms of the GNU General Public License
 
5
# as published by the Free Software Foundation; either version 2
 
6
# of the License, or (at your option) any later version.
 
7
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software 
 
15
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
16
 
 
17
"""File-based logger, writes to named category files in mm_cfg.LOG_DIR."""
 
18
 
 
19
import sys
 
20
import os
 
21
import codecs
 
22
from types import StringType
 
23
 
 
24
from Mailman import mm_cfg
 
25
from Mailman.Logging.Utils import _logexc
 
26
 
 
27
# Set this to the encoding to be used for your log file output.  If set to
 
28
# None, then it uses your system's default encoding.  Otherwise, it must be an
 
29
# encoding string appropriate for codecs.open().
 
30
LOG_ENCODING = 'iso-8859-1'
 
31
 
 
32
 
 
33
 
 
34
class Logger:
 
35
    def __init__(self, category, nofail=1, immediate=0):
 
36
        """nofail says to fallback to sys.__stderr__ if write fails to
 
37
        category file - a complaint message is emitted, but no exception is
 
38
        raised.  Set nofail=0 if you want to handle the error in your code,
 
39
        instead.
 
40
 
 
41
        immediate=1 says to create the log file on instantiation.
 
42
        Otherwise, the file is created only when there are writes pending.
 
43
        """
 
44
        self.__filename = os.path.join(mm_cfg.LOG_DIR, category)
 
45
        self.__fp = None
 
46
        self.__nofail = nofail
 
47
        self.__encoding = LOG_ENCODING or sys.getdefaultencoding()
 
48
        if immediate:
 
49
            self.__get_f()
 
50
 
 
51
    def __del__(self):
 
52
        self.close()
 
53
 
 
54
    def __repr__(self):
 
55
        return '<%s to %s>' % (self.__class__.__name__, `self.__filename`)
 
56
 
 
57
    def __get_f(self):
 
58
        if self.__fp:
 
59
            return self.__fp
 
60
        else:
 
61
            try:
 
62
                ou = os.umask(002)
 
63
                try:
 
64
                    try:
 
65
                        f = codecs.open(
 
66
                            self.__filename, 'a+', self.__encoding, 'replace',
 
67
                            1)
 
68
                    except LookupError:
 
69
                        f = open(self.__filename, 'a+', 1)
 
70
                    self.__fp = f
 
71
                finally:
 
72
                    os.umask(ou)
 
73
            except IOError, e:
 
74
                if self.__nofail:
 
75
                    _logexc(self, e)
 
76
                    f = self.__fp = sys.__stderr__
 
77
                else:
 
78
                    raise
 
79
            return f
 
80
 
 
81
    def flush(self):
 
82
        f = self.__get_f()
 
83
        if hasattr(f, 'flush'):
 
84
            f.flush()
 
85
 
 
86
    def write(self, msg):
 
87
        if isinstance(msg, StringType):
 
88
            msg = unicode(msg, self.__encoding)
 
89
        f = self.__get_f()
 
90
        try:
 
91
            f.write(msg)
 
92
        except IOError, msg:
 
93
            _logexc(self, msg)
 
94
 
 
95
    def writelines(self, lines):
 
96
        for l in lines:
 
97
            self.write(l)
 
98
 
 
99
    def close(self):
 
100
        if not self.__fp:
 
101
            return
 
102
        self.__get_f().close()
 
103
        self.__fp = None