Initial check-in
[dygraphs.git] / mochikit_v14 / doc / html / MochiKit / Logging.html
CommitLineData
6a1aa64f
DV
1<?xml version="1.0" encoding="utf-8" ?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5<head>
6<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7<meta name="generator" content="Docutils 0.4: http://docutils.sourceforge.net/" />
8<title>MochiKit.Logging - we're all tired of alert()</title>
9
10<link rel="stylesheet" href="../../../include/css/documentation.css" type="text/css" />
11<script type="text/javascript" src="../../../packed/MochiKit/MochiKit.js"></script>
12<script type="text/javascript" src="../../js/toc.js"></script>
13</head>
14<body>
15<div class="document">
16<div class="section">
17<h1><a id="name" name="name">Name</a></h1>
18<p>MochiKit.Logging - we're all tired of alert()</p>
19</div>
20<div class="section">
21<h1><a id="synopsis" name="synopsis">Synopsis</a></h1>
22<pre class="literal-block">
23log(&quot;INFO messages are so boring&quot;);
24logDebug(&quot;DEBUG messages are even worse&quot;);
25log(&quot;good thing I can pass&quot;, objects, &quot;conveniently&quot;);
26</pre>
27</div>
28<div class="section">
29<h1><a id="description" name="description">Description</a></h1>
30<p>MochiKit.Logging steals some ideas from Python's logging module <a class="footnote-reference" href="#id6" id="id1" name="id1">[1]</a>,
31but completely forgot about the Java <a class="footnote-reference" href="#id7" id="id2" name="id2">[2]</a> inspiration. This is a KISS
32module for logging that provides enough flexibility to do just about
33anything via listeners, but without all the cruft.</p>
34</div>
35<div class="section">
36<h1><a id="dependencies" name="dependencies">Dependencies</a></h1>
37<ul class="simple">
38<li><a class="mochiref reference" href="Base.html">MochiKit.Base</a></li>
39</ul>
40</div>
41<div class="section">
42<h1><a id="overview" name="overview">Overview</a></h1>
43<div class="section">
44<h2><a id="native-console-logging" name="native-console-logging">Native Console Logging</a></h2>
45<p>As of MochiKit 1.3, the default logger will log all messages to your
46browser's native console. This is currently supported in Safari, Opera
479, and Firefox when the <a class="reference" href="http://www.joehewitt.com/software/firebug/">FireBug</a> extension is installed. MochiKit
481.4 adds support for the relevant APIs for Internet Explorer (the
49Debugger and the Atlas framework, see <a class="reference" href="http://www.nikhilk.net/Entry.aspx?id=93">here</a>).</p>
50<p>To disable this behavior:</p>
51<pre class="literal-block">
52MochiKit.Logging.logger.useNativeConsole = false;
53</pre>
54</div>
55<div class="section">
56<h2><a id="bookmarklet-based-debugging" name="bookmarklet-based-debugging">Bookmarklet Based Debugging</a></h2>
57<p>JavaScript is at a serious disadvantage without a standard console for
58&quot;print&quot; statements. Everything else has one. The closest thing that
59you get in a browser environment is the <tt class="docutils literal"><span class="pre">alert</span></tt> function, which is
60absolutely evil.</p>
61<p>This leaves you with one reasonable solution: do your logging in the
62page somehow. The problem here is that you don't want to clutter the
63page with debugging tools. The solution to that problem is what we
64call BBD, or Bookmarklet Based Debugging <a class="footnote-reference" href="#id8" id="id4" name="id4">[3]</a>.</p>
65<p>Simply create a bookmarklet for
66<a class="reference" href="javascript:MochiKit.Logging.logger.debuggingBookmarklet()">javascript:MochiKit.Logging.logger.debuggingBookmarklet()</a>, and
67whack it whenever you want to see what's in the logger. Of course,
68this means you must drink the MochiKit.Logging kool-aid. It's tangy
69and sweet, don't worry.</p>
70<p>Currently this is an ugly <tt class="docutils literal"><span class="pre">alert</span></tt>, but we'll have something spiffy
71Real Soon Now, and when we do, you only have to upgrade
72MochiKit.Logging, not your bookmarklet!</p>
73</div>
74</div>
75<div class="section">
76<h1><a id="api-reference" name="api-reference">API Reference</a></h1>
77<div class="section">
78<h2><a id="constructors" name="constructors">Constructors</a></h2>
79<p>
80<a name="fn-logmessage"></a>
81<a class="mochidef reference" href="#fn-logmessage">LogMessage(num, level, info)</a>:</p>
82<blockquote>
83<p>Properties:</p>
84<blockquote>
85<dl class="docutils">
86<dt><tt class="docutils literal"><span class="pre">num</span></tt>:</dt>
87<dd>Identifier for the log message</dd>
88<dt><tt class="docutils literal"><span class="pre">level</span></tt>:</dt>
89<dd>Level of the log message (<tt class="docutils literal"><span class="pre">&quot;INFO&quot;</span></tt>, <tt class="docutils literal"><span class="pre">&quot;WARN&quot;</span></tt>,
90<tt class="docutils literal"><span class="pre">&quot;DEBUG&quot;</span></tt>, etc.)</dd>
91<dt><tt class="docutils literal"><span class="pre">info</span></tt>:</dt>
92<dd>All other arguments passed to log function as an <tt class="docutils literal"><span class="pre">Array</span></tt></dd>
93<dt><tt class="docutils literal"><span class="pre">timestamp</span></tt>:</dt>
94<dd><tt class="docutils literal"><span class="pre">Date</span></tt> object timestamping the log message</dd>
95</dl>
96</blockquote>
97<dl class="docutils">
98<dt><em>Availability</em>:</dt>
99<dd>Available in MochiKit 1.3.1+</dd>
100</dl>
101</blockquote>
102<p>
103<a name="fn-logger"></a>
104<a class="mochidef reference" href="#fn-logger">Logger([maxSize])</a>:</p>
105<blockquote>
106<p>A basic logger object that has a buffer of recent messages plus a
107listener dispatch mechanism for &quot;real-time&quot; logging of important
108messages.</p>
109<p><tt class="docutils literal"><span class="pre">maxSize</span></tt> is the maximum number of entries in the log. If
110<tt class="docutils literal"><span class="pre">maxSize</span> <span class="pre">&gt;=</span> <span class="pre">0</span></tt>, then the log will not buffer more than that many
111messages. So if you don't like logging at all, be sure to pass
112<tt class="docutils literal"><span class="pre">0</span></tt>.</p>
113<p>There is a default logger available named &quot;logger&quot;, and several of
114its methods are also global functions:</p>
115<blockquote>
116<tt class="docutils literal"><span class="pre">logger.log</span></tt> -&gt; <tt class="docutils literal"><span class="pre">log</span></tt>
117<tt class="docutils literal"><span class="pre">logger.debug</span></tt> -&gt; <tt class="docutils literal"><span class="pre">logDebug</span></tt>
118<tt class="docutils literal"><span class="pre">logger.warning</span></tt> -&gt; <tt class="docutils literal"><span class="pre">logWarning</span></tt>
119<tt class="docutils literal"><span class="pre">logger.error</span></tt> -&gt; <tt class="docutils literal"><span class="pre">logError</span></tt>
120<tt class="docutils literal"><span class="pre">logger.fatal</span></tt> -&gt; <tt class="docutils literal"><span class="pre">logFatal</span></tt></blockquote>
121<dl class="docutils">
122<dt><em>Availability</em>:</dt>
123<dd>Available in MochiKit 1.3.1+</dd>
124</dl>
125</blockquote>
126<p>
127<a name="fn-logger.prototype.addlistener"></a>
128<a class="mochidef reference" href="#fn-logger.prototype.addlistener">Logger.prototype.addListener(ident, filter, listener)</a>:</p>
129<blockquote>
130<p>Add a listener for log messages.</p>
131<p><tt class="docutils literal"><span class="pre">ident</span></tt> is a unique identifier that may be used to remove the
132listener later on.</p>
133<p><tt class="docutils literal"><span class="pre">filter</span></tt> can be one of the following:</p>
134<blockquote>
135<dl class="docutils">
136<dt><tt class="docutils literal"><span class="pre">null</span></tt>:</dt>
137<dd><tt class="docutils literal"><span class="pre">listener(msg)</span></tt> will be called for every log message
138received.</dd>
139<dt><tt class="docutils literal"><span class="pre">string</span></tt>:</dt>
140<dd><a class="mochiref reference" href="#fn-loglevelatleast">logLevelAtLeast(filter)</a> will be used as the
141function (see below).</dd>
142<dt><tt class="docutils literal"><span class="pre">function</span></tt>:</dt>
143<dd><tt class="docutils literal"><span class="pre">filter(msg)</span></tt> will be called for every msg, if it
144returns true then <tt class="docutils literal"><span class="pre">listener(msg)</span></tt> will be called.</dd>
145</dl>
146</blockquote>
147<p><tt class="docutils literal"><span class="pre">listener</span></tt> is a function that takes one argument, a log
148message. A log message is an object (<a class="mochiref reference" href="#fn-logmessage">LogMessage</a>
149instance) that has at least these properties:</p>
150<blockquote>
151<dl class="docutils">
152<dt><tt class="docutils literal"><span class="pre">num</span></tt>:</dt>
153<dd>A counter that uniquely identifies a log message
154(per-logger)</dd>
155<dt><tt class="docutils literal"><span class="pre">level</span></tt>:</dt>
156<dd>A string or number representing the log level. If string,
157you may want to use <tt class="docutils literal"><span class="pre">LogLevel[level]</span></tt> for comparison.</dd>
158<dt><tt class="docutils literal"><span class="pre">info</span></tt>:</dt>
159<dd>An Array of objects passed as additional arguments to the
160<tt class="docutils literal"><span class="pre">log</span></tt> function.</dd>
161</dl>
162</blockquote>
163<dl class="docutils">
164<dt><em>Availability</em>:</dt>
165<dd>Available in MochiKit 1.3.1+</dd>
166</dl>
167</blockquote>
168<p>
169<a name="fn-logger.prototype.baselog"></a>
170<a class="mochidef reference" href="#fn-logger.prototype.baselog">Logger.prototype.baseLog(level, message[, ...])</a>:</p>
171<blockquote>
172<p>The base functionality behind all of the log functions. The first
173argument is the log level as a string or number, and all other
174arguments are used as the info list.</p>
175<p>This function is available partially applied as:</p>
176<blockquote>
177<table border="1" class="docutils">
178<colgroup>
179<col width="61%" />
180<col width="39%" />
181</colgroup>
182<tbody valign="top">
183<tr><td>Logger.debug</td>
184<td>'DEBUG'</td>
185</tr>
186<tr><td>Logger.log</td>
187<td>'INFO'</td>
188</tr>
189<tr><td>Logger.error</td>
190<td>'ERROR'</td>
191</tr>
192<tr><td>Logger.fatal</td>
193<td>'FATAL'</td>
194</tr>
195<tr><td>Logger.warning</td>
196<td>'WARNING'</td>
197</tr>
198</tbody>
199</table>
200</blockquote>
201<p>For the default logger, these are also available as global
202functions, see the <a class="mochiref reference" href="#fn-logger">Logger</a> constructor documentation
203for more info.</p>
204<dl class="docutils">
205<dt><em>Availability</em>:</dt>
206<dd>Available in MochiKit 1.3.1+</dd>
207</dl>
208</blockquote>
209<p>
210<a name="fn-logger.prototype.clear"></a>
211<a class="mochidef reference" href="#fn-logger.prototype.clear">Logger.prototype.clear()</a>:</p>
212<blockquote>
213<p>Clear all messages from the message buffer.</p>
214<dl class="docutils">
215<dt><em>Availability</em>:</dt>
216<dd>Available in MochiKit 1.3.1+</dd>
217</dl>
218</blockquote>
219<p>
220<a name="fn-logger.prototype.debuggingbookmarklet"></a>
221<a class="mochidef reference" href="#fn-logger.prototype.debuggingbookmarklet">Logger.prototype.debuggingBookmarklet()</a>:</p>
222<blockquote>
223<p>Display the contents of the logger in a useful way for browsers.</p>
224<p>Currently, if <a class="mochiref reference" href="LoggingPane.html">MochiKit.LoggingPane</a> is loaded, then a
225pop-up <a class="mochiref reference" href="LoggingPane.html#fn-loggingpane">MochiKit.LoggingPane.LoggingPane</a> will be
226used. Otherwise, it will be an alert with
227<a class="mochiref reference" href="#fn-logger.prototype.getmessagetext">Logger.prototype.getMessageText()</a>.</p>
228<dl class="docutils">
229<dt><em>Availability</em>:</dt>
230<dd>Available in MochiKit 1.3.1+</dd>
231</dl>
232</blockquote>
233<p>
234<a name="fn-logger.prototype.dispatchlisteners"></a>
235<a class="mochidef reference" href="#fn-logger.prototype.dispatchlisteners">Logger.prototype.dispatchListeners(msg)</a>:</p>
236<blockquote>
237<p>Dispatch a log message to all listeners.</p>
238<dl class="docutils">
239<dt><em>Availability</em>:</dt>
240<dd>Available in MochiKit 1.3.1+</dd>
241</dl>
242</blockquote>
243<p>
244<a name="fn-logger.prototype.getmessages"></a>
245<a class="mochidef reference" href="#fn-logger.prototype.getmessages">Logger.prototype.getMessages(howMany)</a>:</p>
246<blockquote>
247<p>Return a list of up to <tt class="docutils literal"><span class="pre">howMany</span></tt> messages from the message
248buffer.</p>
249<dl class="docutils">
250<dt><em>Availability</em>:</dt>
251<dd>Available in MochiKit 1.3.1+</dd>
252</dl>
253</blockquote>
254<p>
255<a name="fn-logger.prototype.getmessagetext"></a>
256<a class="mochidef reference" href="#fn-logger.prototype.getmessagetext">Logger.prototype.getMessageText(howMany)</a>:</p>
257<blockquote>
258<p>Get a string representing up to the last <tt class="docutils literal"><span class="pre">howMany</span></tt> messages in
259the message buffer. The default is <tt class="docutils literal"><span class="pre">30</span></tt>.</p>
260<p>The message looks like this:</p>
261<pre class="literal-block">
262LAST {messages.length} MESSAGES:
263 [{msg.num}] {msg.level}: {m.info.join(' ')}
264 [{msg.num}] {msg.level}: {m.info.join(' ')}
265 ...
266</pre>
267<p>If you want some other format, use
268<a class="mochiref reference" href="#fn-logger.prototype.getmessages">Logger.prototype.getMessages</a> and do it yourself.</p>
269<dl class="docutils">
270<dt><em>Availability</em>:</dt>
271<dd>Available in MochiKit 1.3.1+</dd>
272</dl>
273</blockquote>
274<p>
275<a name="fn-logger.prototype.removelistener"></a>
276<a class="mochidef reference" href="#fn-logger.prototype.removelistener">Logger.prototype.removeListener(ident)</a>:</p>
277<blockquote>
278<p>Remove a listener using the ident given to
279<a class="mochiref reference" href="#fn-logger.prototype.addlistener">Logger.prototype.addListener</a></p>
280<dl class="docutils">
281<dt><em>Availability</em>:</dt>
282<dd>Available in MochiKit 1.3.1+</dd>
283</dl>
284</blockquote>
285</div>
286<div class="section">
287<h2><a id="functions" name="functions">Functions</a></h2>
288<p>
289<a name="fn-alertlistener"></a>
290<a class="mochidef reference" href="#fn-alertlistener">alertListener(msg)</a>:</p>
291<blockquote>
292<p>Ultra-obnoxious <tt class="docutils literal"><span class="pre">alert(...)</span></tt> listener</p>
293<dl class="docutils">
294<dt><em>Availability</em>:</dt>
295<dd>Available in MochiKit 1.3.1+</dd>
296</dl>
297</blockquote>
298<p>
299<a name="fn-log"></a>
300<a class="mochidef reference" href="#fn-log">log(message[, info[, ...]])</a>:</p>
301<blockquote>
302<p>Log an INFO message to the default logger</p>
303<dl class="docutils">
304<dt><em>Availability</em>:</dt>
305<dd>Available in MochiKit 1.3.1+</dd>
306</dl>
307</blockquote>
308<p>
309<a name="fn-logdebug"></a>
310<a class="mochidef reference" href="#fn-logdebug">logDebug(message[, info[, ...]])</a>:</p>
311<blockquote>
312<p>Log a DEBUG message to the default logger</p>
313<dl class="docutils">
314<dt><em>Availability</em>:</dt>
315<dd>Available in MochiKit 1.3.1+</dd>
316</dl>
317</blockquote>
318<p>
319<a name="fn-logerror"></a>
320<a class="mochidef reference" href="#fn-logerror">logError(message[, info[, ...]])</a>:</p>
321<blockquote>
322<p>Log an ERROR message to the default logger</p>
323<dl class="docutils">
324<dt><em>Availability</em>:</dt>
325<dd>Available in MochiKit 1.3.1+</dd>
326</dl>
327</blockquote>
328<p>
329<a name="fn-logfatal"></a>
330<a class="mochidef reference" href="#fn-logfatal">logFatal(message[, info[, ...]])</a>:</p>
331<blockquote>
332<p>Log a FATAL message to the default logger</p>
333<dl class="docutils">
334<dt><em>Availability</em>:</dt>
335<dd>Available in MochiKit 1.3.1+</dd>
336</dl>
337</blockquote>
338<p>
339<a name="fn-loglevelatleast"></a>
340<a class="mochidef reference" href="#fn-loglevelatleast">logLevelAtLeast(minLevel)</a>:</p>
341<blockquote>
342<p>Return a function that will match log messages whose level is at
343least minLevel</p>
344<dl class="docutils">
345<dt><em>Availability</em>:</dt>
346<dd>Available in MochiKit 1.3.1+</dd>
347</dl>
348</blockquote>
349<p>
350<a name="fn-logwarning"></a>
351<a class="mochidef reference" href="#fn-logwarning">logWarning(message[, info[, ...]])</a>:</p>
352<blockquote>
353<p>Log a WARNING message to the default logger</p>
354<dl class="docutils">
355<dt><em>Availability</em>:</dt>
356<dd>Available in MochiKit 1.3.1+</dd>
357</dl>
358</blockquote>
359</div>
360</div>
361<div class="section">
362<h1><a id="see-also" name="see-also">See Also</a></h1>
363<table class="docutils footnote" frame="void" id="id6" rules="none">
364<colgroup><col class="label" /><col /></colgroup>
365<tbody valign="top">
366<tr><td class="label"><a class="fn-backref" href="#id1" name="id6">[1]</a></td><td>Python's logging module: <a class="reference" href="http://docs.python.org/lib/module-logging.html">http://docs.python.org/lib/module-logging.html</a></td></tr>
367</tbody>
368</table>
369<table class="docutils footnote" frame="void" id="id7" rules="none">
370<colgroup><col class="label" /><col /></colgroup>
371<tbody valign="top">
372<tr><td class="label"><a class="fn-backref" href="#id2" name="id7">[2]</a></td><td>PEP 282, where they admit all of the Java influence: <a class="reference" href="http://www.python.org/peps/pep-0282.html">http://www.python.org/peps/pep-0282.html</a></td></tr>
373</tbody>
374</table>
375<table class="docutils footnote" frame="void" id="id8" rules="none">
376<colgroup><col class="label" /><col /></colgroup>
377<tbody valign="top">
378<tr><td class="label"><a class="fn-backref" href="#id4" name="id8">[3]</a></td><td>Original Bookmarklet Based Debugging blather: <a class="reference" href="http://bob.pythonmac.org/archives/2005/07/03/bookmarklet-based-debugging/">http://bob.pythonmac.org/archives/2005/07/03/bookmarklet-based-debugging/</a></td></tr>
379</tbody>
380</table>
381</div>
382<div class="section">
383<h1><a id="authors" name="authors">Authors</a></h1>
384<ul class="simple">
385<li>Bob Ippolito &lt;<a class="reference" href="mailto:bob&#64;redivi.com">bob&#64;redivi.com</a>&gt;</li>
386</ul>
387</div>
388<div class="section">
389<h1><a id="copyright" name="copyright">Copyright</a></h1>
390<p>Copyright 2005 Bob Ippolito &lt;<a class="reference" href="mailto:bob&#64;redivi.com">bob&#64;redivi.com</a>&gt;. This program is
391dual-licensed free software; you can redistribute it and/or modify it
392under the terms of the <a class="reference" href="http://www.opensource.org/licenses/mit-license.php">MIT License</a> or the <a class="reference" href="http://www.opensource.org/licenses/afl-2.1.php">Academic Free License
393v2.1</a>.</p>
394</div>
395</div>
396
397</body>
398</html>