Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

root/tags/cherrypy-3.0.0/cherrypy/_cplogging.py

Revision 1458 (checked in by fumanchu, 2 years ago)

Allow loggers to use a different logging root (e.g. "tg.error" instead of "cherrypy.error").

  • Property svn:eol-style set to native
Line 
1 """CherryPy logging."""
2
3 import datetime
4 import logging
5 logfmt = logging.Formatter("%(message)s")
6 import os
7 import rfc822
8 import sys
9
10 import cherrypy
11 from cherrypy import _cperror
12
13
14 class LogManager(object):
15    
16     appid = None
17     error_log = None
18     access_log = None
19    
20     def __init__(self, appid=None, logger_root="cherrypy"):
21         self.logger_root = logger_root
22         self.appid = appid
23         if appid is None:
24             self.error_log = logging.getLogger("%s.error" % logger_root)
25             self.access_log = logging.getLogger("%s.access" % logger_root)
26         else:
27             self.error_log = logging.getLogger("%s.error.%s" % (logger_root, appid))
28             self.access_log = logging.getLogger("%s.access.%s" % (logger_root, appid))
29         self.error_log.setLevel(logging.DEBUG)
30         self.access_log.setLevel(logging.INFO)
31    
32     def error(self, msg='', context='', severity=logging.DEBUG, traceback=False):
33         """Write to the 'error' log.
34         
35         This is not just for errors! Applications may call this at any time
36         to log application-specific information.
37         """
38         if traceback:
39             msg += _cperror.format_exc()
40         self.error_log.log(severity, ' '.join((self.time(), context, msg)))
41    
42     def __call__(self, *args, **kwargs):
43         return self.error(*args, **kwargs)
44    
45     def access(self):
46         """Write to the access log."""
47         request = cherrypy.request
48         response = cherrypy.response
49         tmpl = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
50         s = tmpl % {'h': request.remote.name or request.remote.ip,
51                     'l': '-',
52                     'u': getattr(request, "login", None) or "-",
53                     't': self.time(),
54                     'r': request.request_line,
55                     's': response.status.split(" ", 1)[0],
56                     'b': response.headers.get('Content-Length', '') or "-",
57                     'f': request.headers.get('referer', ''),
58                     'a': request.headers.get('user-agent', ''),
59                     }
60         try:
61             self.access_log.log(logging.INFO, s)
62         except:
63             self(traceback=True)
64    
65     def time(self):
66         """Return now() in Apache Common Log Format (no timezone)."""
67         now = datetime.datetime.now()
68         month = rfc822._monthnames[now.month - 1].capitalize()
69         return ('[%02d/%s/%04d:%02d:%02d:%02d]' %
70                 (now.day, month, now.year, now.hour, now.minute, now.second))
71    
72     def _get_builtin_handler(self, log, key):
73         for h in log.handlers:
74             if getattr(h, "_cpbuiltin", None) == key:
75                 return h
76    
77    
78     # ------------------------- Screen handlers ------------------------- #
79    
80     def _set_screen_handler(self, log, enable):
81         h = self._get_builtin_handler(log, "screen")
82         if enable:
83             if not h:
84                 h = logging.StreamHandler(sys.stdout)
85                 h.setLevel(logging.DEBUG)
86                 h.setFormatter(logfmt)
87                 h._cpbuiltin = "screen"
88                 log.addHandler(h)
89         elif h:
90             log.handlers.remove(h)
91    
92     def _get_screen(self):
93         h = self._get_builtin_handler
94         has_h = h(self.error_log, "screen") or h(self.access_log, "screen")
95         return bool(has_h)
96    
97     def _set_screen(self, newvalue):
98         self._set_screen_handler(self.error_log, newvalue)
99         self._set_screen_handler(self.access_log, newvalue)
100     screen = property(_get_screen, _set_screen)
101    
102    
103     # -------------------------- File handlers -------------------------- #
104    
105     def _add_builtin_file_handler(self, log, fname):
106         h = logging.FileHandler(fname)
107         h.setLevel(logging.DEBUG)
108         h.setFormatter(logfmt)
109         h._cpbuiltin = "file"
110         log.addHandler(h)
111    
112     def _set_file_handler(self, log, filename):
113         h = self._get_builtin_handler(log, "file")
114         if filename:
115             if h:
116                 if h.baseFilename != os.path.abspath(filename):
117                     h.close()
118                     log.handlers.remove(h)
119                     self._add_builtin_file_handler(log, filename)
120             else:
121                 self._add_builtin_file_handler(log, filename)
122         else:
123             if h:
124                 h.close()
125                 log.handlers.remove(h)
126    
127     def _get_error_file(self):
128         h = self._get_builtin_handler(self.error_log, "file")
129         if h:
130             return h.baseFilename
131         return ''
132     def _set_error_file(self, newvalue):
133         self._set_file_handler(self.error_log, newvalue)
134     error_file = property(_get_error_file, _set_error_file)
135    
136     def _get_access_file(self):
137         h = self._get_builtin_handler(self.access_log, "file")
138         if h:
139             return h.baseFilename
140         return ''
141     def _set_access_file(self, newvalue):
142         self._set_file_handler(self.access_log, newvalue)
143     access_file = property(_get_access_file, _set_access_file)
144
Note: See TracBrowser for help on using the browser.

Hosted by WebFaction

Log in as guest/cpguest to create tickets