1 |
commit: f4677f4e6be4007c5cfffd8cdd2563f276b24721 |
2 |
Author: André Erdmann <dywi <AT> mailerd <DOT> de> |
3 |
AuthorDate: Thu Jul 5 15:52:38 2012 +0000 |
4 |
Commit: André Erdmann <dywi <AT> mailerd <DOT> de> |
5 |
CommitDate: Thu Jul 5 15:52:38 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=f4677f4e |
7 |
|
8 |
recipe/easylogger: configurable logging |
9 |
|
10 |
* log to disk using a FileHandler/RotatingFileHandler, |
11 |
optionally attached to a MemoryHandler |
12 |
* log to syslog (code is incomplete and disabled) |
13 |
* log to console (either stderr or stdout) |
14 |
|
15 |
modified: roverlay/recipe/easylogger.py |
16 |
|
17 |
--- |
18 |
roverlay/recipe/easylogger.py | 167 +++++++++++++++++++++++++++++++++++++---- |
19 |
1 files changed, 152 insertions(+), 15 deletions(-) |
20 |
|
21 |
diff --git a/roverlay/recipe/easylogger.py b/roverlay/recipe/easylogger.py |
22 |
index 112d07b..411397d 100644 |
23 |
--- a/roverlay/recipe/easylogger.py |
24 |
+++ b/roverlay/recipe/easylogger.py |
25 |
@@ -2,30 +2,164 @@ |
26 |
# Copyright 2006-2012 Gentoo Foundation |
27 |
# Distributed under the terms of the GNU General Public License v2 |
28 |
|
29 |
+import sys |
30 |
import logging |
31 |
+import logging.handlers |
32 |
+import os.path |
33 |
|
34 |
_STATUS = 0 |
35 |
|
36 |
+ROOT_LOGGER = logging.getLogger() |
37 |
+ |
38 |
+DEFAULT_DATE_FORMAT = '%F %H:%M:%S' |
39 |
+DEFAULT_STREAM = sys.stdout |
40 |
+ |
41 |
+def _zap_handlers(): |
42 |
+ for h in ROOT_LOGGER.handlers: |
43 |
+ ROOT_LOGGER.removeHandler ( h ) |
44 |
+# --- end of _zap_handlers (...) --- |
45 |
+ |
46 |
+def setup_initial_console(): |
47 |
+ ch = logging.StreamHandler ( stream=DEFAULT_STREAM ) |
48 |
+ ch.setLevel ( logging.WARN ) |
49 |
+ |
50 |
+ ch.setFormatter ( |
51 |
+ logging.Formatter ( |
52 |
+ fmt='%(levelname)-7s [%(name)s] %(message)s' |
53 |
+ ) |
54 |
+ ) |
55 |
+ |
56 |
+ ROOT_LOGGER.addHandler ( ch ) |
57 |
+ ROOT_LOGGER.setLevel ( logging.WARN ) |
58 |
+# --- end of setup_initial_console (...) --- |
59 |
+ |
60 |
+def setup_console ( conf ): |
61 |
+ if not conf.get ( 'LOG.CONSOLE.enabled', False ): return |
62 |
+ stream = conf.get ( 'LOG.CONSOLE.stream', None ) |
63 |
+ |
64 |
+ if stream is not None: |
65 |
+ if stream == 'stderr': |
66 |
+ stream = sys.stderr |
67 |
+ elif stream == 'stdout': |
68 |
+ stream = sys.stdout |
69 |
+ else: |
70 |
+ stream = None |
71 |
+ |
72 |
+ ch = logging.StreamHandler ( |
73 |
+ stream=DEFAULT_STREAM if stream is None else stream |
74 |
+ ) |
75 |
+ |
76 |
+ ch.setLevel ( |
77 |
+ conf.get ( |
78 |
+ 'LOG.CONSOLE.level', |
79 |
+ conf.get ( 'LOG.level', logging.INFO ) |
80 |
+ ) |
81 |
+ ) |
82 |
+ |
83 |
+ ch_fmt = logging.Formatter ( |
84 |
+ fmt=conf.get ( |
85 |
+ 'LOG.CONSOLE.format', |
86 |
+ '%(levelname)-8s %(name)-14s: %(message)s' |
87 |
+ ), |
88 |
+ datefmt=conf.get ( 'LOG.date_format', DEFAULT_DATE_FORMAT ) |
89 |
+ ) |
90 |
+ |
91 |
+ ch.setFormatter ( ch_fmt ) |
92 |
+ |
93 |
+ ROOT_LOGGER.addHandler ( ch ) |
94 |
+# --- end of setup_console (...) --- |
95 |
+ |
96 |
+def setup_syslog ( conf ): |
97 |
+# if not conf.get ( 'LOG.SYSLOG.enabled', False ): return |
98 |
+# |
99 |
+# lh = logging.handlers.SysLogHandler() |
100 |
+# |
101 |
+# lh.setLevel ( |
102 |
+# conf.get ( |
103 |
+# 'LOG.SYSLOG.level', |
104 |
+# conf.get ( 'LOG.level', logging.CRITICAL ) |
105 |
+# ) |
106 |
+# ) |
107 |
+# |
108 |
+# lh_fmt = I_DONT_KNOW |
109 |
+# |
110 |
+# lh.setFormatter ( lh_fmt ) |
111 |
+# |
112 |
+# ROOT_LOGGER.addHandler ( lh ) |
113 |
+# |
114 |
+ pass |
115 |
+# --- end of setup_syslog (...) --- |
116 |
+ |
117 |
+def setup_file ( conf ): |
118 |
+ logfile = conf.get ( 'LOG.FILE.file' ) |
119 |
+ if not logfile or not ( 'LOG.FILE.enabled', True ): return |
120 |
+ |
121 |
+ # FIXME explain this in config (and make it available) |
122 |
+ rotating = conf.get ( 'LOG.FILE.rotate', False ) |
123 |
+ |
124 |
+ if rotating: |
125 |
+ # using per-run log files |
126 |
+ |
127 |
+ # rotate after handler creation if log file already exists |
128 |
+ rotate_now = os.path.exists ( logfile ) |
129 |
+ fh = logging.handlers.RotatingFileHandler ( |
130 |
+ logfile, |
131 |
+ backupCount=conf.get ( 'LOG.FILE.rotate_count', 3 ) |
132 |
+ ) |
133 |
+ if rotate_now: |
134 |
+ fh.doRollover() |
135 |
+ del rotate_now |
136 |
+ else: |
137 |
+ # using a big log file |
138 |
+ fh = logging.FileHandler ( logfile ) |
139 |
+ |
140 |
+ fh.setLevel ( |
141 |
+ conf.get ( |
142 |
+ 'LOG.FILE.level', |
143 |
+ conf.get ( 'LOG.level', logging.WARN ) |
144 |
+ ) |
145 |
+ ) |
146 |
+ |
147 |
+ fh_fmt = logging.Formatter ( |
148 |
+ fmt=conf.get ( |
149 |
+ 'LOG.FILE.format', |
150 |
+ '%(asctime)s %(levelname)-8s %(name)-10s: %(message)s' |
151 |
+ ), |
152 |
+ datefmt=conf.get ( 'LOG.date_format', DEFAULT_DATE_FORMAT ) |
153 |
+ ) |
154 |
+ |
155 |
+ fh.setFormatter ( fh_fmt ) |
156 |
+ |
157 |
+ if conf.get ( 'LOG.FILE.buffered', True ): |
158 |
+ handler = logging.handlers.MemoryHandler ( |
159 |
+ conf.get ( 'LOG.FILE.buffer_capacity', 250 ), # reasonable value? |
160 |
+ target=fh |
161 |
+ ) |
162 |
+ else: |
163 |
+ handler = fh |
164 |
+ |
165 |
+ ROOT_LOGGER.addHandler ( handler ) |
166 |
+# --- end of setup_file (...) --- |
167 |
+ |
168 |
+ |
169 |
def setup ( conf ): |
170 |
global _STATUS |
171 |
if _STATUS > 1: |
172 |
return |
173 |
|
174 |
- logging.basicConfig ( |
175 |
- level=logging.DEBUG, |
176 |
- filename=conf.get ( [ 'LOG', 'FILE', 'main' ], 'roverlay.log' ), |
177 |
- filemode='a', |
178 |
- format='%(asctime)s %(levelname)-8s %(name)-14s -- %(message)s', |
179 |
- datefmt='%F %H:%M:%S' |
180 |
- ) |
181 |
+ _zap_handlers() |
182 |
|
183 |
- # add console output to the logger |
184 |
- ch = logging.StreamHandler() |
185 |
- ch.setLevel ( logging.DEBUG ) |
186 |
- ch.setFormatter ( |
187 |
- logging.Formatter ( '%(levelname)-8s %(name)-14s -- %(message)s' ) |
188 |
- ) |
189 |
- logging.getLogger().addHandler ( ch ) |
190 |
+ if conf.get ( 'LOG.enabled', True ): |
191 |
+ setup_console ( conf ) |
192 |
+ setup_file ( conf ) |
193 |
+ #setup_syslog ( conf ) |
194 |
+ |
195 |
+ |
196 |
+ if not ROOT_LOGGER.handlers: |
197 |
+ # logging is disabled, add a nop handler |
198 |
+ ROOT_LOGGER.addHandler ( logging.NullHandler() ) |
199 |
+ |
200 |
+ ROOT_LOGGER.setLevel ( min ( h.level for h in ROOT_LOGGER.handlers ) ) |
201 |
|
202 |
_STATUS = 2 |
203 |
|
204 |
@@ -34,6 +168,9 @@ def setup_initial(): |
205 |
if _STATUS > 0: |
206 |
return |
207 |
|
208 |
- pass |
209 |
+ _zap_handlers() |
210 |
+ logging.lastResort = None |
211 |
+ logging.raiseExceptions = True |
212 |
+ setup_initial_console() |
213 |
|
214 |
_STATUS = 1 |