You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by dp...@apache.org on 2017/06/22 20:47:54 UTC

[06/10] logging-log4net git commit: Implemented changes for the Util/AppenderAttachedImpl.cs class for calling log4net appenders in parallel using .NET Task Parallel Library.

Implemented changes for the Util/AppenderAttachedImpl.cs class for calling log4net appenders in parallel using .NET Task Parallel Library.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4net/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4net/commit/897ef682
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4net/tree/897ef682
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4net/diff/897ef682

Branch: refs/heads/pr/old/40
Commit: 897ef682bebbc44da53812fa4001d0132e80a84a
Parents: 76f0151
Author: Harry Martyrossian <HM...@users.noreply.github.com>
Authored: Fri Dec 30 20:32:41 2016 -0800
Committer: Dominik Psenner <dp...@apache.org>
Committed: Thu Jun 22 22:37:13 2017 +0200

----------------------------------------------------------------------
 src/Util/AppenderAttachedImpl.cs      |  54 +-
 src/Util/ParallelIAppender.cs         | 214 ++++++++
 src/log4net.vs2015.csproj             | 809 +++++++++++++++++++++++++++++
 src/log4net.vs2015.sln                |  27 +
 tests/src/log4net.Tests.vs2015.csproj | 260 +++++++++
 5 files changed, 1343 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/897ef682/src/Util/AppenderAttachedImpl.cs
----------------------------------------------------------------------
diff --git a/src/Util/AppenderAttachedImpl.cs b/src/Util/AppenderAttachedImpl.cs
index fafb0b8..9da44c2 100644
--- a/src/Util/AppenderAttachedImpl.cs
+++ b/src/Util/AppenderAttachedImpl.cs
@@ -85,18 +85,20 @@ namespace log4net.Util
 				m_appenderArray = m_appenderList.ToArray();
 			}
 
-			foreach(IAppender appender in m_appenderArray)
+			int count = m_appenderArray.Length;
+			for (int i = 0; i < count; ++i)
 			{
 				try
 				{
-					appender.DoAppend(loggingEvent);
+					m_appenderArray[i].DoAppend(loggingEvent);
 				}
 				catch(Exception ex)
 				{
-					LogLog.Error(declaringType, "Failed to append to appender [" + appender.Name + "]", ex);
+					LogLog.Error(declaringType, "Failed to append to appender [" + m_appenderArray[i].Name + "]", ex);
 				}
 			}
-			return m_appenderList.Count;
+
+			return count;
 		}
 
 		/// <summary>
@@ -153,9 +155,9 @@ namespace log4net.Util
 
 		#endregion Public Instance Methods
 
-        #region Private Static Methods
+		#region Private Static Methods
 
-        /// <summary>
+		/// <summary>
 		/// Calls the DoAppende method on the <see cref="IAppender"/> with 
 		/// the <see cref="LoggingEvent"/> objects supplied.
 		/// </summary>
@@ -183,13 +185,13 @@ namespace log4net.Util
 					appender.DoAppend(loggingEvent);
 				}
 			}
-        }
+		}
 
-        #endregion
+		#endregion
 
-        #region Implementation of IAppenderAttachable
+		#region Implementation of IAppenderAttachable
 
-        /// <summary>
+		/// <summary>
 		/// Attaches an appender.
 		/// </summary>
 		/// <param name="newAppender">The appender to add.</param>
@@ -211,10 +213,19 @@ namespace log4net.Util
 			{
 				m_appenderList = new AppenderCollection(1);
 			}
+
+#if (NET_4_5 && PARALLEL_APPENDERS)
+			var newParallelIAppender = new ParallelIAppender(newAppender);
+			if (!m_appenderList.Contains(newParallelIAppender))
+			{
+				m_appenderList.Add(newParallelIAppender);
+			}
+#else
 			if (!m_appenderList.Contains(newAppender))
 			{
 				m_appenderList.Add(newAppender);
 			}
+#endif
 		}
 
 		/// <summary>
@@ -270,7 +281,8 @@ namespace log4net.Util
 					}
 				}
 			}
-			return null;   
+
+			return null;
 		}
 
 		/// <summary>
@@ -360,17 +372,17 @@ namespace log4net.Util
 
 		#endregion Private Instance Fields
 
-	    #region Private Static Fields
+		#region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the AppenderAttachedImpl class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private readonly static Type declaringType = typeof(AppenderAttachedImpl);
+		/// <summary>
+		/// The fully qualified type of the AppenderAttachedImpl class.
+		/// </summary>
+		/// <remarks>
+		/// Used by the internal logger to record the Type of the
+		/// log message.
+		/// </remarks>
+		private readonly static Type declaringType = typeof(AppenderAttachedImpl);
 
-	    #endregion Private Static Fields
+		#endregion Private Static Fields
 	}
 }

http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/897ef682/src/Util/ParallelIAppender.cs
----------------------------------------------------------------------
diff --git a/src/Util/ParallelIAppender.cs b/src/Util/ParallelIAppender.cs
new file mode 100644
index 0000000..81b3860
--- /dev/null
+++ b/src/Util/ParallelIAppender.cs
@@ -0,0 +1,214 @@
+#region Apache License
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more 
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership. 
+// The ASF licenses this file to you 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.
+//
+#endregion
+
+#if (NET_4_5 && PARALLEL_APPENDERS)
+
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using log4net.Appender;
+using log4net.Core;
+
+namespace log4net.Util
+{
+	/// <summary>
+	/// This class allows AppenderAttachedImpl class to call appenders in "parallel".
+	/// </summary>
+	/// <remarks>
+	/// <para>
+	/// By implementing <see cref="IAppender"/> interface
+	/// allows AppenderAttacedImpl to call appenders in "parallel".
+	/// That allows to mitigate performance impedance between appenders and
+	/// provides better overall performance.
+	/// </para>
+	/// </remarks>
+	/// <author>Harry Martyrossian</author>
+	public class ParallelIAppender : IAppender
+	{
+		private static readonly Type declaringType = typeof(ParallelIAppender);
+		private IAppender appender;
+		private object synchObject = new object();
+		private PulseCode pulseCode = PulseCode.NotSignaled;
+		private Queue<LoggingEvent> events = new Queue<LoggingEvent>();
+		private LoggingEvent[] arrayOfEvents;
+		private Task appenderTask;
+
+		#region Public Instance Constructors
+		/// <summary>
+		/// Constructor
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// Initializes a new instance of the <see cref="ParallelIAppender"/> class.
+		/// </para>
+		/// </remarks>
+		public ParallelIAppender(IAppender appender)
+		{
+			this.appender = appender;
+			this.appenderTask = Task.Run(() => this.Append());
+		}
+		#endregion Public Instance Constructors
+
+		[Flags]
+		internal enum PulseCode : int
+		{
+			NotSignaled,
+			QueueIsNotEmpty,
+			ExitThread
+		}
+
+		#region Override implementation of Object
+		/// <summary>
+		/// Determines whether two <see cref="ParallelIAppender" /> instances 
+		/// are equal.
+		/// </summary>
+		/// <param name="obj">The <see cref="object" /> to compare with the current <see cref="ParallelIAppender" />.</param>
+		/// <returns>
+		/// <c>true</c> if the specified <see cref="object" /> is equal to the current <see cref="ParallelIAppender" />; otherwise, <c>false</c>.
+		/// </returns>
+		/// <remarks>
+		/// <para>
+		/// Compares the implementations of <see cref="IAppender" /> interface.
+		/// </para>
+		/// </remarks>
+		public override bool Equals(object obj)
+		{
+			return this.Equals(obj as ParallelIAppender);
+		}
+
+		/// <summary>
+		/// Compares implementations of IAppender interface.
+		/// </summary>
+		/// <param name="obj">The object to compare against.</param>
+		/// <returns><c>true</c> if the objects are equal.</returns>
+		/// <remarks>
+		/// <para>
+		/// Compares implementations of <see cref="IAppender" /> interface, and
+		/// defers to base class if the target object is not a <see cref="ParallelIAppender" />
+		/// instance.
+		/// </para>
+		/// </remarks>
+		public virtual bool Equals(ParallelIAppender obj)
+		{
+			if (obj == null)
+			{
+				return false;
+			}
+			return this.appender.Equals(obj);
+		}
+
+		/// <summary>
+		/// Returns a hash code
+		/// </summary>
+		/// <returns>A hash code for the current implementation of the <see cref="IAppender" /> interface.</returns>
+		/// <remarks>
+		/// <para>
+		/// Returns a hash code suitable for use in hashing algorithms and data 
+		/// structures like a hash table.
+		/// </para>
+		/// <para>
+		/// Returns the hash code of the <see cref="IAppender"/> interface implementation.
+		/// </para>
+		/// </remarks>
+		public override int GetHashCode()
+		{
+			return this.appender.GetHashCode();
+		}
+		#endregion Override implementation of Object
+
+		#region Implementation of IAppender
+		string IAppender.Name
+		{
+			get
+			{
+				return this.appender.Name;
+			}
+			set
+			{
+				this.appender.Name = value;
+			}
+		}
+
+		void IAppender.Close()
+		{
+			lock (this.synchObject)
+			{
+				this.pulseCode |= PulseCode.ExitThread;
+				Monitor.Pulse(this.synchObject);
+			}
+			this.appenderTask.Wait();
+			this.appender.Close();
+		}
+
+		void IAppender.DoAppend(LoggingEvent loggingEvent)
+		{
+			lock (this.synchObject)
+			{
+				this.events.Enqueue(loggingEvent);
+				this.pulseCode |= PulseCode.QueueIsNotEmpty;
+				Monitor.Pulse(this.synchObject);
+			}
+		}
+		#endregion Implementation of IAppender
+
+		private void Append()
+		{
+			bool keepRunning = true;
+			do
+			{
+				lock (this.synchObject)
+				{
+					if (this.pulseCode == PulseCode.NotSignaled)
+					{
+						Monitor.Wait(this.synchObject);
+					}
+					if ((this.pulseCode & PulseCode.QueueIsNotEmpty) == PulseCode.QueueIsNotEmpty)
+					{
+						this.pulseCode ^= PulseCode.QueueIsNotEmpty;
+					}
+					if ((this.pulseCode & PulseCode.ExitThread) == PulseCode.ExitThread)
+					{
+						this.pulseCode ^= PulseCode.ExitThread;
+						keepRunning = false;
+					}
+					this.CopyEvents();
+				}
+				this.CallDoAppend();
+			}
+			while (keepRunning);
+		}
+
+		private void CopyEvents()
+		{
+			this.arrayOfEvents = this.events.ToArray();
+			this.events.Clear();
+		}
+
+		private void CallDoAppend()
+		{
+			var length = this.arrayOfEvents.Length;
+			for (int i = 0; i < length; ++i)
+			{
+				this.appender.DoAppend(this.arrayOfEvents[i]);
+			}
+		}
+	}
+}
+#endif

http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/897ef682/src/log4net.vs2015.csproj
----------------------------------------------------------------------
diff --git a/src/log4net.vs2015.csproj b/src/log4net.vs2015.csproj
new file mode 100644
index 0000000..9594046
--- /dev/null
+++ b/src/log4net.vs2015.csproj
@@ -0,0 +1,809 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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.
+
+-->
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{181FE707-E161-4722-9F38-6AAAB6FAA106}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>log4net</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>log4net</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\build\bin\net\4.5\debug\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET;NET_2_0;NET_4_0;NET_4_5;PARALLEL_APPENDERS;</DefineConstants>
+    <DocumentationFile>log4net.xml</DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>SecurityRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\build\bin\net\4.5\release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;STRONG;NET;NET_2_0;NET_4_0;NET_4_5;PARALLEL_APPENDERS;</DefineConstants>
+    <DocumentationFile>log4net.xml</DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Web">
+      <Name>System.Web</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Appender\AdoNetAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AnsiColorTerminalAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AppenderCollection.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AppenderSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AspNetTraceAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\BufferingAppenderSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\BufferingForwardingAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\ColoredConsoleAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\ConsoleAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\DebugAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\EventLogAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\FileAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\ForwardingAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\IAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\IBulkAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\IFlushable.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\LocalSyslogAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\ManagedColoredConsoleAppender.cs" />
+    <Compile Include="Appender\MemoryAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\NetSendAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\OutputDebugStringAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RemoteSyslogAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RemotingAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RollingFileAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\SmtpAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\SmtpPickupDirAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\TelnetAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\TextWriterAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\TraceAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\UdpAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="AssemblyVersionInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\AliasDomainAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\AliasRepositoryAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\BasicConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\ConfiguratorAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\DomainAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\DOMConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\DOMConfiguratorAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\Log4NetConfigurationSectionHandler.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\PluginAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\RepositoryAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\SecurityContextProviderAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\XmlConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Config\XmlConfiguratorAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\CompactRepositorySelector.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\DefaultRepositorySelector.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ErrorCode.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ExceptionEvaluator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IAppenderAttachable.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IErrorHandler.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IFixingRequired.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ILogger.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ILoggerWrapper.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IOptionHandler.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\IRepositorySelector.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ITriggeringEventEvaluator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\Level.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LevelCollection.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LevelEvaluator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LevelMap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LocationInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LogException.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LoggerManager.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LoggerWrapperImpl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LoggingEvent.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\LogImpl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\MethodItem.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\SecurityContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\SecurityContextProvider.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\StackFrameItem.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\TimeEvaluator.cs" />
+    <Compile Include="Core\WrapperMap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\AbsoluteTimeDateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\DateTimeDateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\IDateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\Iso8601DateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="DateFormatter\SimpleDateFormatter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\DenyAllFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\FilterDecision.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\FilterSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\IFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\LevelMatchFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\LevelRangeFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\LoggerMatchFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\MdcFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\NdcFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\PropertyFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Filter\StringMatchFilter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="GlobalContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ILog.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\DynamicPatternLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\ExceptionLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\ILayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\IRawLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Layout2RawLayoutAdapter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\LayoutSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\PatternLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AppDomainPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetCachePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetContextPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetRequestPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\AspNetSessionPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\DatePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\ExceptionPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\FileLocationPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\FullLocationPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\IdentityPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\LevelPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\LineLocationPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\LoggerPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\MessagePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\MethodLocationPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\NamedPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\NdcPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\PatternLayoutConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\PropertyPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\RelativeTimePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\StackTraceDetailPatternConverter.cs" />
+    <Compile Include="Layout\Pattern\StackTracePatternConverter.cs" />
+    <Compile Include="Layout\Pattern\ThreadPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\TypeNamePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\UserNamePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\Pattern\UtcDatePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\RawLayoutConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\RawPropertyLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\RawTimeStampLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\RawUtcTimeStampLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\SimpleLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\XmlLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\XmlLayoutBase.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\XmlLayoutSchemaLog4j.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="LogicalThreadContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="LogManager.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="MDC.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="NDC.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ObjectRenderer\DefaultRenderer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ObjectRenderer\IObjectRenderer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ObjectRenderer\RendererMap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\IPlugin.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\IPluginFactory.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\PluginCollection.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\PluginMap.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\PluginSkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Plugin\RemoteLoggingServerPlugin.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\ConfigurationChangedEventArgs.cs" />
+    <Compile Include="Repository\Hierarchy\DefaultLoggerFactory.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\Hierarchy.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\ILoggerFactory.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\Logger.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\LoggerKey.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\ProvisionNode.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\RootLogger.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\Hierarchy\XmlHierarchyConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\IBasicRepositoryConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\ILoggerRepository.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\IXmlRepositoryConfigurator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Repository\LoggerRepositorySkeleton.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="ThreadContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\AppenderAttachedImpl.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\CompositeProperties.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ContextPropertiesBase.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ConverterInfo.cs" />
+    <Compile Include="Util\CountingQuietTextWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\CyclicBuffer.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\EmptyCollection.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\EmptyDictionary.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\FormattingInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\GlobalContextProperties.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ILogExtensions.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LevelMapping.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LevelMappingEntry.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LogicalThreadContextProperties.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LogLog.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\NativeError.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\NullDictionaryEnumerator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\NullEnumerator.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\NullSecurityContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\OnlyOnceErrorHandler.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\OptionConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ParallelIAppender.cs" />
+    <Compile Include="Util\PatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternParser.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternString.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\AppDomainPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\AppSettingPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\DatePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\EnvironmentFolderPathPatternConverter.cs" />
+    <Compile Include="Util\PatternStringConverters\EnvironmentPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\IdentityPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\LiteralPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\NewLinePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\ProcessIdPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\PropertyPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\RandomStringPatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\UserNamePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PatternStringConverters\UtcDatePatternConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PropertiesDictionary.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\PropertyEntry.cs" />
+    <Compile Include="Util\ProtectCloseTextWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\QuietTextWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ReaderWriterLock.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ReadOnlyPropertiesDictionary.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ReusableStringWriter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\SystemInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\SystemStringFormat.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TextWriterAdapter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ThreadContextProperties.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LogicalThreadContextStack.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ThreadContextStack.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\LogicalThreadContextStacks.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\ThreadContextStacks.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\Transform.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\BooleanConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\ConversionNotSupportedException.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\ConverterRegistry.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\EncodingConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\IConvertFrom.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\IConvertTo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\IPAddressConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\PatternLayoutConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\PatternStringConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\TypeConverter.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TypeConverters\TypeConverterAttribute.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\WindowsSecurityContext.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/897ef682/src/log4net.vs2015.sln
----------------------------------------------------------------------
diff --git a/src/log4net.vs2015.sln b/src/log4net.vs2015.sln
new file mode 100644
index 0000000..2612780
--- /dev/null
+++ b/src/log4net.vs2015.sln
@@ -0,0 +1,27 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net.Tests.vs2015", "..\tests\src\log4net.Tests.vs2015.csproj", "{B0530F10-0238-49A9-93B0-8EF412E90BCF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "log4net.vs2015", "log4net.vs2015.csproj", "{181FE707-E161-4722-9F38-6AAAB6FAA106}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{B0530F10-0238-49A9-93B0-8EF412E90BCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B0530F10-0238-49A9-93B0-8EF412E90BCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B0530F10-0238-49A9-93B0-8EF412E90BCF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{181FE707-E161-4722-9F38-6AAAB6FAA106}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{181FE707-E161-4722-9F38-6AAAB6FAA106}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{181FE707-E161-4722-9F38-6AAAB6FAA106}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{181FE707-E161-4722-9F38-6AAAB6FAA106}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/897ef682/tests/src/log4net.Tests.vs2015.csproj
----------------------------------------------------------------------
diff --git a/tests/src/log4net.Tests.vs2015.csproj b/tests/src/log4net.Tests.vs2015.csproj
new file mode 100644
index 0000000..89cd253
--- /dev/null
+++ b/tests/src/log4net.Tests.vs2015.csproj
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you 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.
+
+-->
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B0530F10-0238-49A9-93B0-8EF412E90BCF}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>log4net.Tests</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Library</OutputType>
+    <RootNamespace>log4net.Tests</RootNamespace>
+    <StartupObject>
+    </StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <OldToolsVersion>3.5</OldToolsVersion>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+    <PublishUrl>publish\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <ApplicationRevision>0</ApplicationRevision>
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+    <TargetFrameworkProfile />
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>..\bin\Debug\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;DEBUG;NET;NET_2_0;NET_4_0;NET_4_5;</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>..\bin\Release\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE;NET;NET_2_0;NET_4_0;NET_4_5</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.6.4.14350, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL">
+      <HintPath>..\..\src\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>
+      <Private>True</Private>
+    </Reference>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.configuration" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+    <Reference Include="System.Runtime.Remoting">
+      <Name>System.Runtime.Remoting</Name>
+    </Reference>
+    <Reference Include="System.Xml">
+      <Name>System.XML</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\..\src\AssemblyVersionInfo.cs">
+      <Link>AssemblyVersionInfo.cs</Link>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\AdoNetAppenderTest.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetCommand.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetConnection.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetParameter.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetParameterCollection.cs" />
+    <Compile Include="Appender\AdoNet\Log4NetTransaction.cs" />
+    <Compile Include="Appender\AppenderCollectionTest.cs" />
+    <Compile Include="Appender\BufferingAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\CountingAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\EventLogAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\MemoryAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RemotingAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\SmtpPickupDirAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\RollingFileAppenderTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\StringAppender.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Appender\TraceAppenderTest.cs" />
+    <Compile Include="AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Context\LogicalThreadContextTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Context\ThreadContextTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\EvaluatorTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\FixingTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\ShutdownTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Core\StringFormatTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Hierarchy\Hierarchy.cs" />
+    <Compile Include="Hierarchy\Logger.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\DynamicPatternLayoutTest.cs" />
+    <Compile Include="Layout\PatternLayoutTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Layout\XmlLayoutTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="LoggerRepository\ConfigurationMessages.cs" />
+    <Compile Include="Filter\FilterTest.cs" />
+    <Compile Include="Utils.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\CyclicBufferTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\EnvironmentPatternConverterTest.cs" />
+    <Compile Include="Util\LogLogTest.cs" />
+    <Compile Include="Util\PatternConverterTest.cs" />
+    <Compile Include="Util\PatternStringTest.cs" />
+    <Compile Include="Util\PropertiesDictionaryTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\RandomStringPatternConverterTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\SystemInfoTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Util\TransformTest.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
+      <Install>false</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 3.5 SP1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
+      <Visible>False</Visible>
+      <ProductName>Windows Installer 3.1</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <ItemGroup>
+    <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\log4net.vs2012.csproj">
+      <Project>{181fe707-e161-4722-9f38-6aaab6faa106}</Project>
+      <Name>log4net.vs2012</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
+</Project>
\ No newline at end of file