<?xml version="1.0" ?>
<!--
Copyright 2004-2006 The Apache Software Foundation

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<document>

	<properties>
		<author email="nicko at apache dot org">Nicko Cadell</author>
		<title>log4net Release Notes</title>
	</properties>

	<meta name="keywords" content="log4net release notes, log4net" />

	<body>
		<section id="main" name="log4net Release Notes">

			<sectionMenu name="Contents" />
			
			<section id="1.2.10" name="1.2.10">

				<section id="1.2.10-bug" name="Bug Fixes">
					<ul>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-21'>LOG4NET-21</a>] - RemotingAppender fails once NDC becomes empty</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-22'>LOG4NET-22</a>] - XmlLayout allows output of invalid control characters</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-23'>LOG4NET-23</a>] - example-apps.html links are off by one folder level</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-25'>LOG4NET-25</a>] - RollingFileAppender can fail if RollOverIfDateBoundaryCrossing required</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-28'>LOG4NET-28</a>] - AdoNetAppender does not support inserting NULL into columns</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-29'>LOG4NET-29</a>] - LevelMatchFilter should return Neutral when no match is found</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-32'>LOG4NET-32</a>] - AdoNetAppender losing first entry</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-35'>LOG4NET-35</a>] - Exception rendering ThreadContextStack if null value pushed into stack</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-36'>LOG4NET-36</a>] - System.Diagnostics.Trace may throw exception if AppDomain does not have config file</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-40'>LOG4NET-40</a>] - RollingFileAppender does not limit files to MaxSizeRollBackups when CountDirection is 1</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-41'>LOG4NET-41</a>] - RollingFileAppender roll over date fail</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-42'>LOG4NET-42</a>] - Serialised LoggingEvent does not preserve the Fix flags</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-43'>LOG4NET-43</a>] - Specifying an empty string as a property in the config file results in an error</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-44'>LOG4NET-44</a>] - XmlLayout emits all properties under a node named global-properties, rather than just properties.</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-49'>LOG4NET-49</a>] - CountingQuietTextWriter does not count strings written with WriteLine</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-50'>LOG4NET-50</a>] - Process.StartTime hangs on some systems</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-60'>LOG4NET-60</a>] - Bug in RollingFileAppender.cs causing failure to timely roll files on monthly interval</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-63'>LOG4NET-63</a>] - 1.2.9.0 Documentation typos</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-65'>LOG4NET-65</a>] - Unhandled SecurityException exception for FileIOPermission while loading configuration file</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-67'>LOG4NET-67</a>] - CVE-2006-0743 Security vulnerability in LocalSyslogAppender</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-69'>LOG4NET-69</a>] - Exception thrown when *Format methods are given a malformed format string</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-70'>LOG4NET-70</a>] - CoreDll.dll referenced with different capitalisation</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-73'>LOG4NET-73</a>] - ADONetAppender.ActivateOptions() leaks database connection when called multiple times</li>
					</ul>
				</section>
				    
				<section id="1.2.10-new" name="New Features">
					<ul>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-11'>LOG4NET-11</a>] - Add Flush command to API</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-24'>LOG4NET-24</a>] - Programmatic flush of BufferingAppenderSkeleton buffer</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-37'>LOG4NET-37</a>] - Allow the RepositorySelector type to be specified using the AppSettings config</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-46'>LOG4NET-46</a>] - Support appenders that can output multiple events efficiently</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-51'>LOG4NET-51</a>] - WmiAppender</li>
					</ul>
				</section>
					    
				<section id="1.2.10-enh" name="Improvements">
					<ul>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-3'>LOG4NET-3</a>] - Support per event patterns in FileAppender File name</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-13'>LOG4NET-13</a>] - Allow SMTPAppender to have replaceable parameters in Subject</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-15'>LOG4NET-15</a>] - Email high "importance" priority setting with SmtpAppender</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-17'>LOG4NET-17</a>] - Line-wrapping Appender Layouts</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-33'>LOG4NET-33</a>] - Ability to use global property to point to log4net configuration file</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-34'>LOG4NET-34</a>] - Allow xml config values to be set via XmlNodeType.CDATA or XmlNodeType.Text rather than just value="foo"</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-45'>LOG4NET-45</a>] - PluginAttribute does not allow plugin type to be specified as a Type, only as a string</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-52'>LOG4NET-52</a>] - Allow XML configurator to set properties of type Object</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-53'>LOG4NET-53</a>] - Allow repository properties to be set in the config file</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-56'>LOG4NET-56</a>] - Support rendering IEnumerator objects as well as ICollections</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-58'>LOG4NET-58</a>] - Support clean build on .NET 2.0</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-72'>LOG4NET-72</a>] - Performance of ILog.xxxFormat methods</li>
					<li>[<a href='http://issues.apache.org/jira/browse/LOG4NET-74'>LOG4NET-74</a>] - Change MemoryAppender member variables to protected</li>
					</ul>
 				</section>
           
			</section>

			<section id="1.2.9" name="1.2.9 Beta">
			
				<section id="1.2.9-breaking" name="Breaking Changes">
					<ul>
						<li>
							<h3>Renamed namespaces</h3>
							<p>
								Renamed namespace <span class="code">log4net.spi</span> to <span class="code">log4net.Core</span>. 
								Renamed namespace <span class="code">log4net.helpers</span> to <span class="code">log4net.Util</span>.
							</p>
						</li>
						<li>
							<h3>Renamed config classes and attributes</h3>
							<p>
								In the <span class="code">log4net.Config</span> namespace the <span class="code">DOMConfigurator</span>, 
								<span class="code">DOMConfiguratorAttribute</span>, <span class="code">DomainAttribute</span>, 
								and <span class="code">AliasDomainAttribute</span> have been marked as obsolete. These types are
								still available and functional in this release.
							</p>
							<p>	
								The <span class="code">XmlConfigurator</span> and <span class="code">XmlConfiguratorAttribute</span> 
								types replace <span class="code">DOMConfigurator</span> and 
								<span class="code">DOMConfiguratorAttribute</span>. The <span class="code">RepositoryAttribute</span> 
								and <span class="code">AliasRepositoryAttribute</span> types replace 
								<span class="code">DomainAttribute</span> and <span class="code">AliasDomainAttribute</span>. 
							</p>
						</li>
						<li>
							<h3>Fixed pascal casing of type names</h3>
							<p>
								Renamed <span class="code">AdoNetAppender</span>, <span class="code">AspNetTraceAppender</span>, 
								<span class="code">SmtpAppender</span>, <span class="code">Iso8601DateFormatter</span>, 
								<span class="code">MdcFilter</span>, and <span class="code">NdcFilter</span>.
								Note that the config file type resolver is case insensitive so this is only a breaking change 
								for code that programmatically creates a type that has been renamed.
							</p>
						</li>
						<li>
							<h3>Layouts changed to stream their output to a <span class="code">TextWriter</span></h3>
							<p>
								Layouts have been changed to format their output to a <span class="code">TextWriter</span>
								rather than return a string. This increases performance and reduces temporary object creation.
							</p>
						</li>
						<li>
							<h3>C style string escapes no longer supported by config parser</h3>
							<p>
								The XML config parser no longer supports decoding C style escape sequences in strings.
								Previously sequences like <span class="code">\n</span> and <span class="code">\\</span> 
								where decoded. Instead use the appropriate XML encodings as required.
							</p>
						</li>
					</ul>
				</section>
				
				<section id="1.2.9-new" name="New Features">
					<ul>
						<li>
							<h3>New CLI build</h3>
							<p>
								A new log4net assembly is built that targets all CLI 1.0 compatible runtimes.
								This build is essentially a common subset of the Mono 1.0 and .NET 1.0 builds.
								It is built using the MS .NET 1.0 compiler and libraries but does not use any
								platform specific APIs.
							</p>
							<p>
								This build is only available in release configuration and can be found at
								<span class="code">bin\cli\1.0\release</span>.
							</p>
						</li>
						<li>
							<h3>Logging contexts</h3>
							<p>
								Logging contexts can be used to record contextual data that is relevant to the current
								process. Logging contexts are both an extension of the concepts embodied in the
								<span class="code">MDC</span> and <span class="code">NDC</span> and a replacement for
								them. The <span class="code">MDC</span> and <span class="code">NDC</span> have been
								reimplemented to use the <span class="code">ThreadContext</span> as storage.
							</p>
							<p>
								The logging contexts provide a single unified view that cuts across different
								scopes within an application.
								The contexts are layered in the following order of narrowing scope: 
								<span class="code">GlobalContext</span>, <span class="code">ThreadContext</span>, 
								<span class="code">LogicalThreadContext</span>, and <span class="code">LoggingEvent</span>.
								Context values specified in a narrower scope hide the matching value in a wider scope.
							</p>
						</li>
						<li>
							<h3><span class="code">PatternLayout</span> customization and long pattern names</h3>
							<p>
								The <span class="code">PatternLayout</span> now supports long pattern names.
								These pattern names are significantly more readable than the single character patterns.
							</p>
							<p>
								The <span class="code">PatternLayout</span> now supports custom patterns. New patterns
								can be defined in the config file:
							</p>
							<div class="syntax"><pre class="code">
&lt;layout type=&quot;log4net.Layout.PatternLayout&quot;&gt;

  &lt;converter&gt;
    &lt;name value=&quot;myConverter&quot; /&gt;
    &lt;type value=&quot;TestApp.MyPatternConverter, TestApp&quot; /&gt;
  &lt;/converter&gt;

  &lt;conversionPattern value=&quot;%-5level %logger - %myConverter - %message%newline&quot; /&gt;
&lt;/layout&gt;</pre></div>
							<p>
								The above config defines a custom pattern called <span class="code">myConverter</span>
								which is bound to the <span class="code">TestApp.MyPatternConverter, TestApp</span>
								type. This type must extend the <span class="code">log4net.Util.PatternConverter</span>
								base class. The custom pattern can then be used in the pattern string.
							</p>
							<p>
								For full details see the SDK Reference entry: <a href="sdk/log4net.Layout.PatternLayout.html">log4net.Layout.PatternLayout</a>.
							</p>
						</li>
						<li>
							<h3><span class="code">PatternString</span> for pattern based configuration</h3>
							<p>
								A new pattern based type, <span class="code">PatternString</span>, can be used in
								the config file to set string properties using a pattern syntax. For example the
								File property of the FileAppender could be set as follows:
							</p>
							<div class="syntax"><pre class="code">
&lt;file type=&quot;log4net.Util.PatternString&quot;&gt;

  &lt;converter&gt;
    &lt;name value=&quot;folder&quot; /&gt;
    &lt;type value=&quot;TestApp.SpecialFolderPatternConverter,TestApp&quot; /&gt;
  &lt;/converter&gt;

  &lt;conversionPattern value=&quot;%folder{LocalApplicationData}\log-file.txt&quot; /&gt;
&lt;/file&gt;</pre></div>
							<p>
								The code for the <span class="code">SpecialFolderPatternConverter</span>
								is as follows:
							</p>			
							<div class="syntax"><pre class="code">
public class SpecialFolderPatternConverter : log4net.Util.PatternConverter 
{
  override protected void Convert(System.IO.TextWriter writer, object state) 
  {
    Environment.SpecialFolder specialFolder = 
      (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), base.Option, true);
      
    writer.Write(Environment.GetFolderPath(specialFolder));
  }
}</pre></div>
							<p>
								For full details see the SDK Reference entry: <a href="sdk/log4net.Util.PatternString.html">log4net.Util.PatternString</a>.
							</p>
						</li>
						<li>
							<h3>Loading configuration from a URI</h3>
							<p>
								The <span class="code">XmlConfigurator</span> methods now support loading the
								configuration data from a URI. Config can be loaded from any URI supported by the 
								<span class="code">System.Net.WebRequest</span> class.
							</p>
						</li>
						<li>
							<h3>Support for No-Touch deployment</h3>
							<p>
								Log4net supports configuring No-Touch deployment applications using the
								<span class="code">XmlConfiguratorAttribute</span>. If a relative config file
								or extension is specified then this is resolved relative to the deployment
								URI.
							</p>
						</li>
						<li>
							<h3>Config file parser enhancements</h3>
							<p>
								The config file parser has been enhanced to support specifying the property subtype, or intermediate type, 
								directly on the property element, for example:
							</p>
							<div class="syntax"><pre class="code">
&lt;layout type=&quot;log4net.Layout.PatternLayout&quot; value=&quot;%message%newline&quot; /&gt;</pre></div>
							<p>
								Implicit conversion will be attempted between the value string and the type specified, 
								and then again between the type and the target property type.
							</p>
						</li>
						<li>
							<h3>.NET string formatting syntax</h3>
							<p>
								Added .NET <span class="code">String.Format</span> style formatting syntax methods to 
								the <span class="code">ILog</span> interface. The new methods are: 
								<span class="code">DebugFormat</span>, <span class="code">InfoFormat</span>, 
								<span class="code">WarnFormat</span>, <span class="code">ErrorFormat</span> 
								and <span class="code">FatalFormat</span>.
							</p>
						</li>
						<li>
							<h3>Customizable levels</h3>
							<p>
								Levels are defined by the repository <span class="code">LevelMap</span>. The defined 
								levels, the relative ordering of levels and level display names can be configured on 
								a per-repository basis.
							</p>
						</li>
						<li>
							<h3>Per-appender security contexts</h3>
							<p>
								Appenders that interact with controlled platform resources, e.g. files, can be
								configured to use a separate security context when accessing these resources.
								The calling thread may not have appropriate privileges to access the resource a
								custom <span class="code">SecurityContext</span> can be used to elevate the
								privileges of the appender. The <span class="code">WindowsSecurityContext</span> 
								is used to specify alternative credentials on the Windows platform.
							</p>
						</li>
						<li>
							<h3>Added new appenders</h3>
							<dl>
								<dt><span class="code">AnsiColorTerminalAppender</span></dt>
								<dd>
									<p>
										The <span class="code">AnsiColorTerminalAppender</span> writes events to 
										the application's ANSI terminal window. It can be configured to specify 
										the text and background colors for different level events. Note that Console
										applications running on Windows do not have an ANSI terminal window and
										should use the <span class="code">ColoredConsoleAppender</span> instead.
									</p>
								</dd>
								<dt><span class="code">LocalSyslogAppender</span></dt>
								<dd>
									<p>
										Logs events to a local syslog service. This appender uses the POSIX libc syslog 
										library functions. If these functions are not available on the local system then 
										this appender will not work!
									</p>
								</dd>
								<dt><span class="code">RemoteSyslogAppender</span></dt>
								<dd>
									<p>
										The <span class="code">RemoteSyslogAppender</span> uses the BSD syslog protocol to 
										log to a syslog daemon. The syslogd listens for for messages on UDP port 514.
									</p>
								</dd>
								<dt><span class="code">TelnetAppender</span></dt>
								<dd>
									<p>
										The <span class="code">TelnetAppender</span> accepts socket connections and streams 
										logging messages back to the client. The output is provided in a telnet-friendly way 
										so that a log can be monitored over a TCP/IP socket. 
										This allows simple remote monitoring of application logging.
									</p>
								</dd>
							</dl>
						</li>
						<li>
							<h3>Added new <span class="code">LoggerMatchFilter</span> filter</h3>
							<p>
								Added <span class="code">LoggerMatchFilter</span> which matches a string against
								the event's logger name.
							</p>
						</li>
						<li>
							<h3>Pluggable file locking models for the <span class="code">FileAppender</span></h3>
							<p>
								The <span class="code">FileAppender</span> (and by extension the 
								<span class="code">RollingFileAppender</span>) now support pluggable file
								locking models. The default model, <span class="code">ExclusiveLock</span>, 
								maintains the current exclusive file locking behavior. An alternative
								model, <span class="code">MinimalLock</span>, can be used to support writing to
								a single output file from multiple processes. 
							</p>
							<p>
								For full details see the SDK Reference entry: <a href="sdk/log4net.Appender.FileAppender.LockingModel.html">log4net.Appender.FileAppender.LockingModel</a>.
							</p>
						</li>
						<li>
							<h3><span class="code">RollingFileAppender</span> roll once</h3>
							<p>
								The <span class="code">RollingFileAppender</span> now supports a new
								rolling style, <span class="code">Once</span>. In this mode the appender
								will roll the file once per run.
							</p>
						</li>
						<li>
							<h3><span class="code">SmtpAppender</span> authentication</h3>
							<p>
								On the .NET 1.1 platform only, the <span class="code">SmtpAppender</span> supports authenticating
								against the mail server using either username and password or integrated NTLM authentication.
							</p>
						</li>
						<li>
							<h3><span class="code">AdoNetAppender</span> ReconnectOnError</h3>
							<p>
								Added new configuration property to <span class="code">AdoNetAppender</span>.
								Setting <span class="code">ReconnectOnError</span> to <span class="code">true</span>
								will force the appender to attempt to reconnect to the database if the connection
								is lost.
							</p>
						</li>
						<li>
							<h3><span class="code">UdpAppender</span> hostname support</h3>
							<p>
								The <span class="code">UdpAppender</span> config property <span class="code">RemoteAddress</span>
								can now be specified as a DNS hostname string. The hostname is resolved to an IP address.
							</p>
						</li>
					</ul>
				</section>
				
				<section id="1.2.9-other" name="Other Changes">
					<ul>
						<li>
							<h3>FxCop compliance</h3>
							<p>
								Updates to bring the internal code in line with the current FxCop rules.
							</p>
						</li>
						<li>
							<h3>Separate NUnit tests</h3>
							<p>
								Moved the NUnit tests into a separate project, <span class="code">log4net.Tests</span>.
							</p>
						</li>
						<li>
							<h3>Bug Fixes</h3>
							<dl>
								<dt><span class="code">RemotingAppender</span></dt>
								<dd>
									<p>
										Sends events from a <span class="code">ThreadPool</span> thread 
										rather than the calling thread to prevent transfer, 
										and potential loss, of the <span class="code">CallContext</span>.
									</p>
								</dd>
								<dt><span class="code">RollingFileAppender</span></dt>
								<dd>
									<p>
										Fixed date rolling period detection for non UTC timezones.
									</p>
								</dd>
								<dt><span class="code">ColoredConsoleAppender</span></dt>
								<dd>
									<p>
										Updated to support writing more than 30,000 chars in a single message.
										Fixed background color overspill if the console window needs to
										scroll the contents.
									</p>
								</dd>
							</dl>
						</li>
					</ul>
				</section>
				
			</section>
			
			<section id="1.2.0b8" name="1.2.0 Beta 8">
				<ul>
					<li>
						<h3>Changed assembly name to <span class="code">log4net</span></h3>
						<p>
							The build output is now <span class="code">log4net.dll</span>
							for all frameworks. This is a breaking change.
						</p>
						<p>
							To resolve cross platform and cross version issues we have
							changed the log4net assembly to use a common name for all 
							frameworks. The assembly friendly name is now <span class="code">log4net</span>.
							The builds for each framework can now be differentiated
							by the assembly title. This includes the name of the framework
							that the assembly was built on. 
						</p>
					</li>
					<li>
						<h3>Combined Release and ReleaseStrong builds</h3>
						<p>
							The Release and ReleaseStrong builds have been consolidated into
							a single build called Release. This Release build is strongly named.
						</p>
					</li>
					<li>
						<h3>New Appender: ColoredConsoleAppender</h3>
						<p>
							The <span class="code">ColoredConsoleAppender</span> writes events to the
							application's console. It can be configured to specify the text and background
							colors for different level events.
						</p>
					</li>
					<li>
						<h3>New Appender: SmtpPickupDirAppender</h3>
						<p>
							The <span class="code">SmtpPickupDirAppender</span> generates SMTP compliant
							messages and writes them to a local directory. These files can then be read
							by an SMTP agent (e.g. the IIS SMTP Agent) and delivered.
						</p>
					</li>
					<li>
						<h3>New Layout: XmlLayoutSchemaLog4j</h3>
						<p>
							This new layout formats the logging events as XML which complies with
							the log4j event dtd. This can be used to transfer log event from log4net
							to log4j. Currently the only appender that can communicate directly with
							log4j is the <span class="code">UdpAppender</span>.
						</p>
					</li>
					<li>
						<h3>New PatternLayout conversion characters</h3>
						<p>
							Added support for capturing the current thread principal name and the
							app domain friendly name for each logging event.
						</p>
						<dl>
							<dt>%a</dt>
							<dd>
								Used to output the friendly name of the AppDomain where the
								logging event was generated. 
							</dd>
							<dt>%u</dt>
							<dd>
								Used to output the user name for the currently active user
								(<span class="code">Principal.Identity.Name</span>).
							</dd>
						</dl>
					</li>
					<li>
						<h3>Types specified in the config file are now loaded ignoring case</h3>
						<p>
							All types specified in the configuration files are now loaded
							using a case insensitive method.
						</p>
					</li>
					<li>
						<h3>Fine grained fixing for buffered events</h3>
						<p>
							The <span class="code">LoggingEvent</span> now supports fine grained
							fixing of data that needs to be accessed outside the append context,
							e.g. when an event is buffered. The new <span class="code">Fix</span>
							property takes a combination of the <span class="code">FixFlags</span> 
							enumeration values.
						</p>
					</li>
					<li>
						<h3>Code updated inline with FxCop 1.21</h3>
						<p>
							In line with the FxCop 1.21 guidelines:
							Sealed utility classes. Added serialization security demand to GetObjectData.
							Renamed parameters.
						</p>
					</li>
					<li>
						<h3>EventLogAppender 32K Limit</h3>
						<p>
							There is a limit of 32K characters in an EventLog message. Added a 
							check that only logs the first 32000 characters from the rendered 
							message.
						</p>
					</li>
				</ul>
			</section>
			
			<section id="1.2.0b7" name="1.2.0 Beta 7">
				<ul>
					<li>
						<h3>Updated to support the Microsoft .NET Framework 1.1 Final</h3>
						<p>
							Updated to support the Microsoft .NET Framework 1.1 Final Beta (1.1.4322).
						</p>
					</li>
					<li>
						<h3>Features document</h3>
						<p>
							Added a new document that covers the main features of log4net.
							See the <a href="doc/features.html">features</a>
							document for more information.
						</p>
					</li>
					<li>
						<h3>Hierarchy disabled until it is configured</h3>
						<p>
							The Hierarchy is now disabled until it has been configured.
							All messages logged to the Hierarchy before it has been
							configured will be ignored without an error message being
							written to the console.
						</p>
						<p>
							If you are configuring log4net programmatically (i.e. not using
							one of the built-in configurators) you must set the 
							<span class="code">ILoggerRepository.Configured</span> property
							to <span class="code">true</span> once you have configured
							the repository.
						</p>
						<p>
							The no appenders defined for a logger message will no longer be 
							displayed on the console by default. This message will only be 
							displayed if internal debugging is enabled.
						</p>
					</li>
					<li>
						<h3>New examples in VisualBasic.NET, JScript and Managed C++</h3>
						<p>
							New examples in VisualBasic.NET, JScript and Managed C++.
							TODO Link to document about examples.
						</p>
					</li>
					<li>
						<h3>Code and Documentation Updates</h3>
						<p>
							Code fixes. Documentation and manual updates. 
							See the ChangeLog for more information.
						</p>
					</li>
					<li>
						<h3>Added document with example appender configurations</h3>
						<p>
							See the <a href="doc/manual/example-config-appender.html">Example Appender Configuration</a> 
							document for more information.
						</p>
					</li>
				</ul>
			</section>

			<section id="1.2.0b6" name="1.2.0 Beta 6">
				<ul>
					<li>
						<h3>Added support for multiple frameworks</h3>
						<p>
							log4net 1.2.0 beta 6 adds support for the the following frameworks:
						</p>
						<div class="table">
							<table cellspacing="0">
								<colgroup>
									<col style="text-align: left;" />
								</colgroup>
								<tr>
									<th>
										Framework</th>
									<th>
										Website</th>
								</tr>
								<tr style="vertical-align: top;">
									<td>Microsoft .NET Framework 1.1 Final Beta (1.1.4322)</td>
									<td><a href="http://msdn.microsoft.com/net">http://msdn.microsoft.com/net</a></td>
								</tr>
								<tr style="vertical-align: top;">
									<td>Microsoft .NET Compact Framework 1.0 (1.0.5000)</td>
									<td><a href="http://msdn.microsoft.com/vstudio/device/compactfx.asp">http://msdn.microsoft.com/vstudio/device/compactfx.asp</a></td>
								</tr>
								<tr style="vertical-align: top;">
									<td>Mono 0.23</td>
									<td><a href="http://www.go-mono.org">http://www.go-mono.org</a></td>
								</tr>
								<tr style="vertical-align: top;">
									<td>Microsoft Shared Source CLI 1.0</td>
									<td><a href="http://msdn.microsoft.com/library/en-us/dndotnet/html/mssharsourcecli.asp">http://msdn.microsoft.com/library/en-us/dndotnet/html/mssharsourcecli.asp</a></td>
								</tr>
							</table>
						</div>
						<br />
						<p>
							Not all frameworks are created equal and some features have been excluded from 
							some of the builds. See the <a href="doc/manual/framework-support.html">Framework Support</a> document for more information.
						</p>
					</li>
					<li>
						<h3>New build system using NAnt</h3>
						<p>
							The new build system allows log4net to be built for all supported frameworks and 
							in all build configurations in one go.
						</p>
					</li>
					<li>
						<h3>New source code &amp; distribution layout</h3>
						<p>
							The source code &amp; distribution layout has been updated to support the new 
							build environment and multiple target frameworks.
						</p>
					</li>
					<li>
						<h3>Removed DomainAttribute.UseDefaultDomain property</h3>
						<p>
							Updated default behavior of <span class="code">DefaultRepositorySelector</span>. Assemblies 
							are now by default placed into the default domain. To specify another domain, 
							the <span class="code">DomainAttribute</span> must be used. This is the opposite behavior 
							to what was previously available. If you were previously specifying the <span class="code">DomainAttribute.UseDefaultDomain</span>
							property then you should remove it, and if the default behavior is now 
							sufficient, you do not need to specify the <span class="code">DomainAttribute</span> at all.
						</p>
					</li>
					<li>
						<h3>Updated configuration file parser</h3>
						<p>
							Updated config file parser to use the element name as the property to set. Also 
							removed <span class="code">&lt;object&gt;</span> tag, the type attribute can now be 
							specified on the property element directly.
						</p>
						<p>
							For example:
						</p>
						<div class="syntax"><pre class="code">
&lt;appender&gt;
  &lt;param name=&quot;Evaluator&quot;&gt;
    &lt;object type=&quot;log4net.spi.LevelEvaluator&quot;&gt;
      &lt;constructor&gt;
        &lt;param type=&quot;log4net.spi.Level&quot; value=&quot;DEBUG&quot;/&gt;
      &lt;/constructor&gt;
    &lt;/object&gt;
  &lt;/param&gt;
&lt;/appender&gt;</pre></div>
						<p>
							becomes:
						</p>
						<div class="syntax"><pre class="code">
&lt;appender&gt;
  &lt;evaluator type=&quot;log4net.spi.LevelEvaluator&quot;&gt;
    &lt;threshold value=&quot;DEBUG&quot;/&gt;
  &lt;/evaluator&gt;
&lt;/appender&gt;</pre></div>
					</li>
					<li>
						<h3>Support for event ID</h3>
						<p>
							The <span class="code">EventLogAppender</span> now supports setting the event ID in the 
							event log, this is taken from the <span class="code">EventID</span> property from the per 
							event <span class="code">Properties</span> map on the <span class="code">LoggingEvent</span>.
						</p>
					</li>
					<li>
						<h3>Updated ADONetAppender</h3>
						<p />
						<ul>
							<li>
								Added support for prepared statements and stored procedures</li>
							<li>
								Added <span class="code">RawTimeStampLayout</span>to correctly convert the timestamps into 
								database date time format</li>
							<li>
								Added <span class="code">ExceptionLayout</span> to render the exception data</li>
						</ul>
						<p />
					</li>
					<li>
						<h3>Support for front-end extension</h3>
						<p>
							This allows the logging API to be wrapped or adapted for specific purposes. Two 
							extension samples are included in the distribution:
						</p>
						<div class="table">
							<table cellspacing="0">
								<colgroup>
									<col style="width: 50%; text-align: left;" />
									<col style="width: 50%; text-align: left;" />
								</colgroup>
								<tr>
									<th>
										Extension</th>
									<th>
										Description</th>
								</tr>
								<tr style="vertical-align: top;">
									<td>log4net.Ext.Trace</td>
									<td>Adds trace logging methods</td>
								</tr>
								<tr style="vertical-align: top;">
									<td>log4net.Ext.EventID</td>
									<td>Adds additional eventId parameter to all methods</td>
								</tr>
							</table>
						</div>
						<p />
					</li>
					<li>
						<h3>Added ForwardingAppender</h3>
						<p>Forwards events to multiple sub appenders after applying filter rules.</p>
					</li>
					<li>
						<h3>Added BufferingForwardingAppender</h3>
						<p>Forward events to sub appenders after buffering them.</p>
					</li>
					<li>
						<h3>Added ASPNetTraceAppender</h3>
						<p>Logs events to the ASP.NET trace system.</p>
					</li>
					<li>
						<h3>Added NetSendAppender</h3>
						<p>Delivers logging events using the Windows Messenger service.</p>
					</li>
					<li>
						<h3>Added UdpAppender</h3>
						<p>Sends logging events as connectionless UDP datagrams to a remote host or a 
							multicast group.</p>
					</li>
					<li>
						<h3>Removed obsolete methods</h3>
					</li>
					<li>
						<h3>Lots of updates to improve our compliance with FxCop</h3>
					</li>
					<li>
						<h3>Improved SDK documentation</h3>
					</li>
				</ul>
			</section>

			<section id="1.2.0b5" name="1.2.0 Beta 5">
				<ul>
					<li>
						<h3>Fixed Exception thrown when DOM Configurator called with a null XML 
							Element.</h3>
						<p>This occurred if the configuration file did not have a log4net section defined.</p>
					</li>
					<li>
						<h3>Made level lookup case insensitive</h3>
					</li>
					<li>
						<h3>Prevented the Hierarchy's Threshold level from being set to a null reference</h3>
					</li>
				</ul>
			</section>

			<section id="1.2.0b4" name="1.2.0 Beta 4">
				<ul>
					<li>
						<h3>Added event specific properties to the logging event object</h3>
						<p>
							Appenders can add additional information to the events they are logging. The <span class="code">RemotingAppender</span>
							and the <span class="code">SMTPAppender</span> both add a 'hostname' property to the events. 
							These properties can be accessed using the <span class="code">PatternLayout</span> with the 
							%P{name} syntax.
						</p>
					</li>
					<li>
						<h3>Added a plugin framework</h3>
						<p>An <span class="code">IPlugin</span> interface can be attached to any repository.</p>
					</li>
					<li>
						<h3>A new RemoteLoggingServerPlugin plugin acts as the server for the 
							RemotingAppender</h3>
					</li>
					<li>
						<h3>Updated the core log4net framework to work in an environment with no 
							permissions</h3>
						<p>Specific appenders still require additional permissions to log correctly</p>
					</li>
					<li>
						<h3>Added support for domain aliasing using the AliasDomainAttribute</h3>
						<p>This allows a parent assembly to take control of the logging domain for child 
							assemblies.</p>
					</li>
					<li>
						<h3>Added events for repository creation, configuration change, configuration reset 
							and repository shutdown</h3>
					</li>
					<li>
						<h3>Added LevelMap to the ILoggerRepository interface</h3>
						<p>The mapping from level name to level object is now repository specific, 
							therefore each repository can have independent mappings.</p>
					</li>
					<li>
						<h3>Moved hierarchy specific config file parser to new DOMHierarchyConfigurator class</h3>
						<p>This is controlled by the <span class="code">Hierarchy</span> object and allows for better 
							encapsulation.</p>
					</li>
					<li>
						<h3>Added OnlyFixPartialEventData property to the buffered appenders</h3>
						<p>This setting causes slow settings to be ignored. This significantly improves the 
							performance of the buffered appenders.</p>
					</li>
					<li>
						<h3>XML entity references are supported in the XML config file.</h3>
					</li>
					<li>
						<h3>Added support for expanding environment variables in &lt;param&gt; values</h3>
						<p>
							The environment variables must be specified as <span class="code">${FOO}</span> where <span class="code">FOO</span>
							is the name of the variable to expand.
						</p>
					</li>
					<li>
						<h3>Upgraded to use NUnit 2.0</h3>
					</li>
					<li>
						<h3>File appenders can specify the encoding to use for the file</h3>
					</li>
					<li>
						<h3>Added strong named configuration</h3>
					</li>
				</ul>
			</section>

			<section id="1.2.0b3" name="1.2.0 Beta 3">
				<ul>
					<li>
						<h3>Added log4net.Ext.Trace extension</h3>
						<p>This is a separate assembly that adds a trace level to log4net.</p>
					</li>
					<li>
						<h3>The default log file output directory is now the application base directory not 
							the current directory</h3>
					</li>
					<li>
						<h3>Added MemoryAppender</h3>
						<p>Stores all the logging events in an in-memory buffer.</p>
					</li>
					<li>
						<h3>Moved the Hierarchy implementation into a separate namespace</h3>
						<p>
							The <span class="code">log4net.Repository.Hierarchy</span> namespace now contains all the 
							code that is specific to the <span class="code">Hierarchy</span> implementation.
						</p>
					</li>
					<li>
						<h3>Refactored the DOMConfigurator and BasicConfigurator</h3>
						<p>
							The <span class="code">Hierarchy</span> specific data schema and implementation could be has 
							now been moved to the <span class="code">log4net.Repository.Hierarchy</span> namespace. The 
							bootstrap code for these configurators remains in the <span class="code">log4net.Config</span>
							namespace.
						</p>
					</li>
					<li>
						<h3>Replaced the DOMConfiguratorAttribute UseExecutableDomain
							property with UseDefaultDomain</h3>
						<p>
							This change to the implementation of the <span class="code">DOMConfiguratorAttribute</span> should 
							allow the configuration of multiple assemblies to be accomplished more easily, 
							especially when developing web applications (ASP.NET).
						</p>
					</li>
					<li>
						<h3>A few good bug fixes!</h3>
					</li>
				</ul>
			</section>

			<section id="1.2.0b2" name="1.2.0 Beta 2">
				<ul>
					<li>
						<h3>Added ADONetAppender</h3>
						<p>Thanks to TechnologyOneCorp.com.</p>
					</li>
					<li>
						<h3>Added TraceLogAssembly extensibility example</h3>
					</li>
					<li>
						<h3>Lots of bug fixes</h3>
					</li>
				</ul>
			</section>

			<section id="1.2.0b1" name="1.2.0 Beta 1">
				<ul>
					<li>
						<h3>Added 6 new examples</h3>
					</li>
					<li>
						<h3>Split Category class into Logger and LogManager classes</h3>
						<p>
							The instance methods from <span class="code">Category</span> have moved to the <span class="code">Logger</span>
							class. The static methods from <span class="code">Category</span> have moved to the <span class="code">LogManager</span>
							class. The <span class="code">Category</span> class still exists but for backward 
							compatibility only. Changed interface <span class="code">ICategoryFactory</span> to <span class="code">ILoggerFactory</span>
							and the implementation class <span class="code">DefaultCategoryFactory</span> to <span class="code">DefaultLoggerFactory</span>.
						</p>
					</li>
					<li>
						<h3>Replaced Priority class with Level class</h3>
						<p>
							The <span class="code">Priority</span> class has been replaced by the <span class="code">Level</span> class. 
							The <span class="code">Priority</span> class still exists for backward compatibility only. 
							The <span class="code">Level</span> class implements a static pool of <span class="code">Level</span> objects. 
							The <span class="code">Level</span> class is sealed and serializable.
						</p>
					</li>
					<li>
						<h3>Added ILoggerRepository interface implemented by Hierarchy</h3>
						<p>
							The <span class="code">Hierarchy</span> class implements the <span class="code">ILoggerRepository</span> interface. 
							This interface is used by the <span class="code">LogManager</span> class and therefore 
							allows different implementations of <span class="code">ILoggerRepository</span> to be used.
						</p>
					</li>
					<li>
						<h3>Enhanced NUnit tests</h3>
						<p>
							All the NUnit tests can be run using a single TestSuite: NUnitGUI 
							log4net.LogManager+AllTests,log4net.dll.
						</p>
					</li>
					<li>
						<h3>Added support for serializing LoggingEvents</h3>
						<p>
							The <span class="code">LoggingEvent</span> class is serializable. All local state is 
							captured before serialization occurs. This now allows <span class="code">LoggingEvent</span> 
							objects to be serialized between applications or machines.
						</p>
					</li>
					<li>
						<h3>Added RemotingAppender</h3>
						<p>
							Delivers <span class="code">LoggingEvents</span> to a remote interface. This can be used to 
							collect distributed logging into a single log file. There is an example 
							remoting sink that receives the logging events, see <span class="code">examples\net\remoting\RemotingServer</span>
							for details.
						</p>
					</li>
					<li>
						<h3>Added support for rendering composite objects</h3>
						<p>
							The <span class="code">IObjectRenderer</span> interface method <span class="code">DoRender</span> now 
							takes a <span class="code">RendererMap</span> argument. This allows the renderer to use the 
							appropriate renderer from the <span class="code">RendererMap</span> to render any nested 
							objects.
						</p>
					</li>
					<li>
						<h3>Added support for rendering exceptions</h3>
						<p>
							The <span class="code">DefaultRenderer</span> now has support for rendering exceptions to a 
							string. This includes nested exceptions. The <span class="code">RendererMap</span> is now 
							used to render exceptions in the <span class="code">LoggingEvent</span>. This allows the 
							rendering of specific exceptions to be enhanced by specific renderers.
						</p>
					</li>
					<li>
						<h3>Added ITriggeringEventEvaluator interface</h3>
						<p>
							This interface is used by <span class="code">SMTPAppender</span> and <span class="code">RemotingAppender</span>
							to determine if a <span class="code">LoggingEvent</span> meets a set of user defined 
							criteria. These appenders use the interface to determine whether or not to 
							deliver the current buffer of events to their listener. The interface is 
							implemented by the <span class="code">LevelEvaluator</span> class, which triggers above a 
							set level.
						</p>
					</li>
					<li>
						<h3>Added regex matching to the MDCFilter, NDCFilter and StringMatchFilter</h3>
						<p>
							The <span class="code">MDCFilter</span>, <span class="code">NDCFilter</span> and <span class="code">StringMatchFilter</span>
							can now be configured to use regex matches in addition to substring matches. 
							Set the <span class="code">RegexToMatch</span> property to use this feature.
						</p>
					</li>
					<li>
						<h3>Added XMLLayout</h3>
						<p>
							emits an XML element for each <span class="code">LoggingEvent</span>. This allows logging 
							events to be stored and manipulated as XML. The DTD for the XML emitted is in 
							the <span class="code">log4net-events.dtd</span>
						</p>
					</li>
					<li>
						<h3>Added support for &lt;logger&gt; and &lt;level&gt; elements in the 
							DOMConfigurator</h3>
						<p>
							As the <span class="code">Category</span> and <span class="code">Priority</span> classes have been 
							replaced by the <span class="code">Logger</span> and <span class="code">Level</span> classes. The <span class="code">DOMConfigurator</span>
							has been updated to allow the <span class="code">&lt;logger&gt;</span> and <span class="code">&lt;level&gt;</span>
							elements to be used in place of the <span class="code">&lt;category&gt;</span> and <span class="code">&lt;priority&gt;</span>
							elements. The old elements are still accepted for backward compatibility.
						</p>
					</li>
					<li>
						<h3>Added Threshold property to Hierarchy</h3>
						<p>
							Changed <span class="code">DisableXXX()</span> methods on <span class="code">Hierarchy</span> to a <span class="code">Threshold</span>
							property.
						</p>
					</li>
					<li>
						<h3>Added support for logging domains</h3>
						<p>
							The <span class="code">LogManager</span> supports multiple logging domains. The <span class="code">LogManager</span>
							uses an instance of the <span class="code">IRepositorySelector</span> class to map from 
							domains to <span class="code">ILoggerRepository</span> instances. The default implementation 
							is to have a separate <span class="code">ILoggerRepository</span> for each domain. When a 
							call is made to the static methods on <span class="code">LogManager</span> the domain can be 
							specified (as a string) or the domain can be inferred automatically from the 
							calling assembly. The default behavior is for each assembly loaded into the 
							process to have its own domain and <span class="code">ILoggerRepository</span>. These can 
							each be configured separately. This allows standalone assemblies to use log4net 
							without conflicting with other modules in the process. The domain for the 
							assembly is configured using metadata attributes defined on the assembly.
						</p>
					</li>
					<li>
						<h3>DOMConfigurator can set params to arbitrary objects</h3>
						<p>
							Using a new <span class="code">&lt;object&gt;</span> element, params can now be set to any 
							creatable object.
						</p>
					</li>
				</ul>
			</section>
			
		</section>
	</body>
</document>
