<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=Error_Logging_System</id>
	<title>Error Logging System - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=Error_Logging_System"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;action=history"/>
	<updated>2026-07-28T08:32:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=1160526&amp;oldid=prev</id>
		<title>Oz Linden at 15:55, 4 January 2012</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=1160526&amp;oldid=prev"/>
		<updated>2012-01-04T15:55:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 08:55, 4 January 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{ViewerArchNav}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{ViewerArchNav}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{Obsolete|The facilities here are still supported for backwards compatibility, but are not preferred: there are newer and richer macros described in [[Logging System Overview]]}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This design deals with the error logging facilities in C++.  These are the facilities supplied with llerror.h and llerrorstream.h.   (llerrorbuffer.h is essentially private).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This design deals with the error logging facilities in C++.  These are the facilities supplied with llerror.h and llerrorstream.h.   (llerrorbuffer.h is essentially private).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Oz Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=869823&amp;oldid=prev</id>
		<title>Gregor Deed: /* Log Site */</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=869823&amp;oldid=prev"/>
		<updated>2010-04-19T09:14:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Log Site&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:14, 19 April 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l43&quot;&gt;Line 43:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 43:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     for( i=... )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     for( i=... )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         llinfos &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot; &quot;;    // llendl missing &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;here!&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         llinfos &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot; &quot;;    // &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ERROR! &lt;/ins&gt;llendl missing&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     llinfos &amp;lt;&amp;lt; llendl;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     llinfos &amp;lt;&amp;lt; llendl;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Gregor Deed</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=869813&amp;oldid=prev</id>
		<title>Gregor Deed: /* Log Site */</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=869813&amp;oldid=prev"/>
		<updated>2010-04-19T09:13:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Log Site&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:13, 19 April 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l38&quot;&gt;Line 38:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 38:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Note: The actual expansion of those defines is smaller than the code shown, and both smaller and more efficient than the old expansion for those same defines.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Note: The actual expansion of those defines is smaller than the code shown, and both smaller and more efficient than the old expansion for those same defines.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Caveat: As a consequence, each message must &#039;&#039;immediately&#039;&#039; be terminated with &amp;lt;code&amp;gt;llendl&amp;lt;/code&amp;gt;. For example, the following code would work with normal iostream but not with llinfos:&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    for( i=... )&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;        llinfos &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot; &quot;;    // llendl missing here!&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    llinfos &amp;lt;&amp;lt; llendl;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==== Class Modification ====&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==== Class Modification ====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Gregor Deed</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=16175&amp;oldid=prev</id>
		<title>Rob Linden: +Template:ViewerArchNav</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=16175&amp;oldid=prev"/>
		<updated>2007-03-26T06:19:35Z</updated>

		<summary type="html">&lt;p&gt;+&lt;a href=&quot;/wiki/Template:ViewerArchNav&quot; title=&quot;Template:ViewerArchNav&quot;&gt;Template:ViewerArchNav&lt;/a&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:19, 25 March 2007&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{ViewerArchNav}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This design deals with the error logging facilities in C++.  These are the facilities supplied with llerror.h and llerrorstream.h.   (llerrorbuffer.h is essentially private).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This design deals with the error logging facilities in C++.  These are the facilities supplied with llerror.h and llerrorstream.h.   (llerrorbuffer.h is essentially private).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Rob Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=16171&amp;oldid=prev</id>
		<title>Which Linden: Bodged together a page based on Zero&#039;s explanation.</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Error_Logging_System&amp;diff=16171&amp;oldid=prev"/>
		<updated>2007-03-26T05:47:28Z</updated>

		<summary type="html">&lt;p&gt;Bodged together a page based on Zero&amp;#039;s explanation.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This design deals with the error logging facilities in C++.  These are the facilities supplied with llerror.h and llerrorstream.h.   (llerrorbuffer.h is essentially private).&lt;br /&gt;
&lt;br /&gt;
=== Goals ===&lt;br /&gt;
The error logging system aims at making logging much more flexible at run time.  The decision to log or not is highly configurable, and controllable while running.  One should be able to enable or disable messages based on source file, class, function, and level.  This enables easier debugging as developers can turn messages on as needed to see what is going on without recompiling or restarting.  It will also help in that messages which are no longer useful can be disabled and so not flood the logs.&lt;br /&gt;
&lt;br /&gt;
A secondary goal is the regularization of all messages so that the class and function are printed out automatically at the start of all messages.  This greatly aids in both find the source of messages, and in filtering log files.&lt;br /&gt;
&lt;br /&gt;
Of course, if all message logging code is to be compiled in, another goal must be to make skipping suppressed log messages as efficient as possible.&lt;br /&gt;
&lt;br /&gt;
==== Log Site ====&lt;br /&gt;
Efficiency is handled by having two small static bools generated at each log call site.  These keep track of if we should log this call, and if we have made the expensive determination to do so yet.  Thus, roughly:&lt;br /&gt;
&lt;br /&gt;
    llinfos &amp;lt;&amp;lt; &amp;quot;Hi there&amp;quot; &amp;lt;&amp;lt; llendl;&lt;br /&gt;
&lt;br /&gt;
will expand via the new #define definitions of &amp;lt;code&amp;gt;llinfos&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;llendl&amp;lt;/code&amp;gt; to something like:&lt;br /&gt;
 &lt;br /&gt;
    {&lt;br /&gt;
        static bool _cached = false;&lt;br /&gt;
        static bool _should_log = false;&lt;br /&gt;
        &lt;br /&gt;
        if (!_cached)&lt;br /&gt;
        {&lt;br /&gt;
            _cached = true;&lt;br /&gt;
            _should_log = LLErrorSystem::shouldLog(LLErrorSystem::INFO, &lt;br /&gt;
                    typeid(LOG_CLASS), __FUNCTION__, __FILE__, __LINE__, &amp;amp;_cached);&lt;br /&gt;
        }&lt;br /&gt;
        if (_should_log)&lt;br /&gt;
        {&lt;br /&gt;
            LLErrorSystem::output()&lt;br /&gt;
                &amp;lt;&amp;lt; &amp;quot;Hi there&amp;quot; &amp;lt;&amp;lt;&lt;br /&gt;
                std::endl;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
The function &amp;lt;code&amp;gt;LLErrorSystem::shouldLog&amp;lt;/code&amp;gt; does the work of finding out if this function, file, line and/or level indicates that this message should or should not be logged.  It remembers the pointer to the &amp;lt;code&amp;gt;_cached&amp;lt;/code&amp;gt; variable so that &amp;lt;code&amp;gt;LLErrorSystem&amp;lt;/code&amp;gt; can invalidate it (set it to false) if the logging configuration is ever changed (via a live file, or via HTTP).&lt;br /&gt;
&lt;br /&gt;
Note: The actual expansion of those defines is smaller than the code shown, and both smaller and more efficient than the old expansion for those same defines.&lt;br /&gt;
&lt;br /&gt;
==== Class Modification ====&lt;br /&gt;
In order to capture class information, the following line needs to be added to a class declaration:&lt;br /&gt;
&lt;br /&gt;
    CLASS_LOG_TYPE(LLFoo);&lt;br /&gt;
&lt;br /&gt;
which will expand to&lt;br /&gt;
&lt;br /&gt;
    typedef LLFoo LOG_CLASS;&lt;br /&gt;
&lt;br /&gt;
When added, logging from that class&amp;#039; functions will automatically get the class and function name prepended, and can be enabled or disabled by class or function.  For existing classes, that don&amp;#039;t have this, the logging functionality will stay the same, though they still can be enabled and disabled by source file.&lt;br /&gt;
&lt;br /&gt;
==== Log Control ====&lt;br /&gt;
The logging setup is controlled by a live file.  It is an LLSD/XML file that contains the list of what should be logged at which level.  An example:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;llsd&amp;gt;&lt;br /&gt;
    &amp;lt;map&amp;gt;&lt;br /&gt;
        &amp;lt;key&amp;gt;default-level&amp;lt;/key&amp;gt;    &amp;lt;string&amp;gt;INFO&amp;lt;/string&amp;gt;&lt;br /&gt;
        &amp;lt;key&amp;gt;print-location&amp;lt;/key&amp;gt;   &amp;lt;boolean&amp;gt;false&amp;lt;/boolean&amp;gt;&lt;br /&gt;
        &amp;lt;key&amp;gt;settings&amp;lt;/key&lt;br /&gt;
            &amp;lt;array&amp;gt;&lt;br /&gt;
                &amp;lt;map&amp;gt;&lt;br /&gt;
                    &amp;lt;!-- pumps-n-pipes classes --&amp;gt;&lt;br /&gt;
                    &amp;lt;key&amp;gt;level&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;INFO&amp;lt;/string&amp;gt;&lt;br /&gt;
                    &amp;lt;key&amp;gt;classes&amp;lt;/key&amp;gt;&lt;br /&gt;
                        &amp;lt;array&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;LLPumpIO&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;LLIOPipe&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;LLBufferArray&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;LLChannelDescriptors&amp;lt;/string&amp;gt;&lt;br /&gt;
                        &amp;lt;/array&amp;gt;&lt;br /&gt;
                &amp;lt;/map&amp;gt;&lt;br /&gt;
                &amp;lt;map&amp;gt;&lt;br /&gt;
                    &amp;lt;!-- ui files --&amp;gt;&lt;br /&gt;
                    &amp;lt;key&amp;gt;level&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;DEBUG&amp;lt;/string&amp;gt;&lt;br /&gt;
                    &amp;lt;key&amp;gt;files&amp;lt;/key&amp;gt;&lt;br /&gt;
                        &amp;lt;array&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;llbutton.cpp&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;llcheckboxctrl.cpp&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;llclipboard.cpp&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;llcombobox.cpp&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;llalertdialog.cpp&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;!-- ... --&amp;gt;&lt;br /&gt;
                        &amp;lt;/array&amp;gt;&lt;br /&gt;
                &amp;lt;/map&amp;gt;&lt;br /&gt;
                &amp;lt;map&amp;gt;&lt;br /&gt;
                    &amp;lt;!-- my custom settings --&amp;gt;&lt;br /&gt;
                    &amp;lt;key&amp;gt;level&amp;lt;/key&amp;gt;&amp;lt;string&amp;gt;INFO&amp;lt;/string&amp;gt;&lt;br /&gt;
                    &amp;lt;key&amp;gt;classes&amp;lt;/key&amp;gt;&lt;br /&gt;
                        &amp;lt;array&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;LLHTTPNode&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;LLHTTPPipe&amp;lt;/string&amp;gt;&lt;br /&gt;
                            &amp;lt;string&amp;gt;LLHTTPNodeForFactory&amp;lt;/string&amp;gt;&lt;br /&gt;
                        &amp;lt;/array&amp;gt;&lt;br /&gt;
                &amp;lt;/map&amp;gt;&lt;br /&gt;
            &amp;lt;/array&amp;gt;&lt;br /&gt;
    &amp;lt;/map&amp;gt;&lt;br /&gt;
    &amp;lt;/llsd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that one can have multiple sections with the same level.  This facilitates having logical groupings in the control file and enabling them all at once.  This convenience introduces ambiguity into the file, since a class or a file can appear more than once, at the same or different levels.  The rule shall be last matching entry wins, but class is always considered before file.&lt;br /&gt;
&lt;br /&gt;
This file is live, and so can be edited while code is running, and the logging will change within a few seconds.  For the viewer, this file will be in app_settings.&lt;/div&gt;</summary>
		<author><name>Which Linden</name></author>
	</entry>
</feed>