Mercurial > projects > ldc
comparison tango/tango/util/log/Logger.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:5825d48b27d1 | 132:1700239cab2e |
---|---|
1 /******************************************************************************* | |
2 | |
3 copyright: Copyright (c) 2004 Kris Bell. All rights reserved | |
4 | |
5 license: BSD style: $(LICENSE) | |
6 | |
7 version: May 2004: Initial release | |
8 version: Feb 2007: Switched to lazy expr | |
9 | |
10 author: Kris | |
11 | |
12 *******************************************************************************/ | |
13 | |
14 module tango.util.log.Logger; | |
15 | |
16 private import tango.time.Time; | |
17 | |
18 private import tango.util.log.Appender; | |
19 | |
20 private import tango.util.log.model.ILevel; | |
21 | |
22 /******************************************************************************* | |
23 | |
24 Loggers are named entities, sometimes shared, sometimes specific to | |
25 a particular portion of code. The names are generally hierarchical in | |
26 nature, using dot notation (with '.') to separate each named section. | |
27 For example, a typical name might be something like "mail.send.writer" | |
28 --- | |
29 import tango.util.log.Log; | |
30 | |
31 auto log = Log.getLogger ("mail.send.writer"); | |
32 | |
33 log.info ("an informational message"); | |
34 log.error ("an exception message: " ~ exception.toString); | |
35 | |
36 etc ... | |
37 --- | |
38 | |
39 It is considered good form to pass a logger instance as a function or | |
40 class-ctor argument, or to assign a new logger instance during static | |
41 class construction. For example: if it were considered appropriate to | |
42 have one logger instance per class, each might be constructed like so: | |
43 --- | |
44 private Logger log; | |
45 | |
46 static this() | |
47 { | |
48 log = Log.getLogger (nameOfThisClassOrStructOrModule); | |
49 } | |
50 --- | |
51 | |
52 Messages passed to a Logger are assumed to be pre-formatted. You | |
53 may find that the format() methos is handy for collating various | |
54 components of the message: | |
55 --- | |
56 char tmp[128] = void; | |
57 ... | |
58 log.warn (log.format (tmp, "temperature is {} degrees!", 101)); | |
59 --- | |
60 | |
61 Note that a provided workspace is used to format the message, which | |
62 should generally be located on the stack so as to support multiple | |
63 threads of execution. In the example above we indicate assignment as | |
64 "tmp = void", although this is an optional attribute (see the language | |
65 manual for more information). | |
66 | |
67 To avoid overhead when constructing formatted messages, the logging | |
68 system employs lazy expressions such that the message is not constructed | |
69 unless the logger is actually active. You can also explicitly check to | |
70 see whether a logger is active or not: | |
71 --- | |
72 if (log.isEnabled (log.Level.Warn)) | |
73 log.warn (log.format (tmp, "temperature is {} degrees!", 101)); | |
74 --- | |
75 | |
76 You might optionally configure various layout & appender implementations | |
77 to support specific exact rendering needs. | |
78 | |
79 tango.log closely follows both the API and the behaviour as documented | |
80 at the official Log4J site, where you'll find a good tutorial. Those | |
81 pages are hosted over | |
82 <A HREF="http://logging.apache.org/log4j/docs/documentation.html">here</A>. | |
83 | |
84 *******************************************************************************/ | |
85 | |
86 public class Logger : ILevel | |
87 { | |
88 /*********************************************************************** | |
89 | |
90 Add a trace message. This is called 'debug' in Log4J but | |
91 that is a reserved word in the D language | |
92 | |
93 ***********************************************************************/ | |
94 | |
95 abstract Logger trace (lazy char[] exp); | |
96 | |
97 /*********************************************************************** | |
98 | |
99 Add an info message | |
100 | |
101 ***********************************************************************/ | |
102 | |
103 abstract Logger info (lazy char[] exp); | |
104 | |
105 /*********************************************************************** | |
106 | |
107 Add a warning message | |
108 | |
109 ***********************************************************************/ | |
110 | |
111 abstract Logger warn (lazy char[] exp); | |
112 | |
113 /*********************************************************************** | |
114 | |
115 Add an error message | |
116 | |
117 ***********************************************************************/ | |
118 | |
119 abstract Logger error (lazy char[] exp); | |
120 | |
121 /*********************************************************************** | |
122 | |
123 Add a fatal message | |
124 | |
125 ***********************************************************************/ | |
126 | |
127 abstract Logger fatal (lazy char[] exp); | |
128 | |
129 /*********************************************************************** | |
130 | |
131 Append a message to this logger via its appender list. | |
132 | |
133 ***********************************************************************/ | |
134 | |
135 abstract Logger append (Level level, lazy char[] exp); | |
136 | |
137 /*********************************************************************** | |
138 | |
139 Format text using the formatter configured in the associated | |
140 hierarchy (see Hierarchy.setFormat) | |
141 | |
142 ***********************************************************************/ | |
143 | |
144 abstract char[] format (char[] buffer, char[] formatStr, ...); | |
145 | |
146 /*********************************************************************** | |
147 | |
148 Return the name of this Logger | |
149 | |
150 ***********************************************************************/ | |
151 | |
152 abstract char[] name (); | |
153 | |
154 /*********************************************************************** | |
155 | |
156 Return the current level assigned to this logger | |
157 | |
158 ***********************************************************************/ | |
159 | |
160 abstract Level level (); | |
161 | |
162 /*********************************************************************** | |
163 | |
164 Set the activity level of this logger. Levels control how | |
165 much information is emitted during runtime, and relate to | |
166 each other as follows: | |
167 --- | |
168 Trace < Info < Warn < Error < Fatal < None | |
169 --- | |
170 That is, if the level is set to Error, only calls to the | |
171 error() and fatal() methods will actually produce output: | |
172 all others will be inhibited. | |
173 | |
174 Note that Log4J is a hierarchical environment, and each | |
175 logger defaults to inheriting a level from its parent. | |
176 | |
177 | |
178 ***********************************************************************/ | |
179 | |
180 abstract Logger setLevel (Level level = Level.Trace); | |
181 | |
182 /*********************************************************************** | |
183 | |
184 same as setLevel (Level), but with additional control over | |
185 whether the children are forced to accept the changed level | |
186 or not. If 'force' is false, then children adopt the parent | |
187 level only if they have their own level set to Level.None | |
188 | |
189 ***********************************************************************/ | |
190 | |
191 abstract Logger setLevel (Level level, bool force); | |
192 | |
193 /*********************************************************************** | |
194 | |
195 Is this logger enabled for the provided level? | |
196 | |
197 ***********************************************************************/ | |
198 | |
199 abstract bool isEnabled (Level level = Level.Fatal); | |
200 | |
201 /*********************************************************************** | |
202 | |
203 Return whether this logger uses additive appenders or not. | |
204 See setAdditive(). | |
205 | |
206 ***********************************************************************/ | |
207 | |
208 abstract bool isAdditive (); | |
209 | |
210 /*********************************************************************** | |
211 | |
212 Specify whether or not this logger has additive behaviour. | |
213 This is enabled by default, and causes a logger to invoke | |
214 all appenders within its ancestry (until an ancestor is | |
215 found with an additive attribute of false). | |
216 | |
217 ***********************************************************************/ | |
218 | |
219 abstract Logger setAdditive (bool enabled); | |
220 | |
221 /*********************************************************************** | |
222 | |
223 Add an appender to this logger. You may add multiple | |
224 appenders to appropriate loggers, and each of them | |
225 will be invoked for that given logger, and for each | |
226 of its child loggers (assuming isAdditive() is true | |
227 for those children). Note that multiple instances | |
228 of the same appender, regardless of where they may | |
229 reside within the tree, are not invoked at runtime. | |
230 That is, only one from a set of identical loggers | |
231 will execute. | |
232 | |
233 Use clearAppenders() to remove all from a given logger. | |
234 | |
235 ***********************************************************************/ | |
236 | |
237 abstract Logger addAppender (Appender appender); | |
238 | |
239 /*********************************************************************** | |
240 | |
241 Remove all appenders from this logger. | |
242 | |
243 ***********************************************************************/ | |
244 | |
245 abstract Logger clearAppenders (); | |
246 | |
247 /*********************************************************************** | |
248 | |
249 Get number of milliseconds since this application started | |
250 | |
251 ***********************************************************************/ | |
252 | |
253 abstract TimeSpan runtime (); | |
254 } |