You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by ni...@apache.org on 2005/06/15 17:57:29 UTC
cvs commit: logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/Appender AsyncAppender.cs PatternFileAppender.cs
nicko 2005/06/15 08:57:29
Modified: examples/net/1.0/Appenders/SampleAppendersApp/cs/src
App.config LoggingExample.cs
SampleAppendersApp.csproj
Added: examples/net/1.0/Appenders/SampleAppendersApp/cs/src/Appender
AsyncAppender.cs PatternFileAppender.cs
Log:
Added AsyncAppender and PatternFileAppender
Revision Changes Path
1.5 +14 -2 logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/App.config
Index: App.config
===================================================================
RCS file: /home/cvs/logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/App.config,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- App.config 13 Jun 2005 18:10:34 -0000 1.4
+++ App.config 15 Jun 2005 15:57:29 -0000 1.5
@@ -67,22 +67,34 @@
<layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
</appender>
+ <appender name="AsyncConsoleAppender" type="SampleAppendersApp.Appender.AsyncAppender, SampleAppendersApp">
+ <appender-ref ref="ColoredConsoleAppender" />
+ </appender>
+
<appender name="FastDbAppender" type="SampleAppendersApp.Appender.FastDbAppender, SampleAppendersApp">
<connectionString value="Persist Security Info=False;Integrated Security=false;server=ate;database=log4net_test;Connect Timeout=30;User ID=sa;Password=sa" />
</appender>
+ <appender name="PatternFileAppender" type="SampleAppendersApp.Appender.PatternFileAppender, SampleAppendersApp">
+ <!-- File pattern to group files by date, then by session property -->
+ <file value="%date{yyyy-MM-dd}\%property{session}\output.log" />
+ <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
+ </appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="ALL" />
-
- <appender-ref ref="MessageObjectExpanderAppender" />
+
+ <appender-ref ref="PatternFileAppender" />
<appender-ref ref="ConsoleAppender" />
+ <appender-ref ref="MessageObjectExpanderAppender" />
<appender-ref ref="MessageBoxAppender" />
<appender-ref ref="FireEventAppender" />
<appender-ref ref="SimpleSmtpAppender" />
<appender-ref ref="MsmqAppender" />
+
<!--
+ <appender-ref ref="AsyncConsoleAppender" />
<appender-ref ref="FastDbAppender" />
-->
</root>
1.4 +2 -0 logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/LoggingExample.cs
Index: LoggingExample.cs
===================================================================
RCS file: /home/cvs/logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/LoggingExample.cs,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- LoggingExample.cs 17 Jan 2005 21:39:46 -0000 1.3
+++ LoggingExample.cs 15 Jun 2005 15:57:29 -0000 1.4
@@ -46,6 +46,8 @@
/// <param name="args">command line arguments</param>
public static void Main(string[] args)
{
+ log4net.ThreadContext.Properties["session"] = 21;
+
// Hookup the FireEventAppender event
if (FireEventAppender.Instance != null)
{
1.4 +10 -0 logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/SampleAppendersApp.csproj
Index: SampleAppendersApp.csproj
===================================================================
RCS file: /home/cvs/logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/SampleAppendersApp.csproj,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SampleAppendersApp.csproj 13 Jun 2005 18:10:34 -0000 1.3
+++ SampleAppendersApp.csproj 15 Jun 2005 15:57:29 -0000 1.4
@@ -114,6 +114,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "Appender\AsyncAppender.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "Appender\FastDbAppender.cs"
SubType = "Code"
BuildAction = "Compile"
@@ -139,6 +144,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "Appender\PatternFileAppender.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "Appender\SimpleSmtpAppender.cs"
SubType = "Code"
BuildAction = "Compile"
1.1 logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/Appender/AsyncAppender.cs
Index: AsyncAppender.cs
===================================================================
#region Copyright & License
//
// Copyright 2001-2005 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.
//
#endregion
using System;
using System.Threading;
using log4net.Appender;
using log4net.Core;
using log4net.Util;
namespace SampleAppendersApp.Appender
{
public sealed class AsyncAppender : IAppender, IOptionHandler, IAppenderAttachable
{
private string m_name;
public string Name
{
get { return m_name; }
set { m_name = value; }
}
public void ActivateOptions()
{
}
public FixFlags Fix
{
get { return m_fixFlags; }
set { m_fixFlags = value; }
}
public void Close()
{
// Remove all the attached appenders
lock(this)
{
if (m_appenderAttachedImpl != null)
{
m_appenderAttachedImpl.RemoveAllAppenders();
}
}
}
public void DoAppend(LoggingEvent loggingEvent)
{
loggingEvent.Fix = m_fixFlags;
System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncAppend), loggingEvent);
}
private void AsyncAppend(object state)
{
LoggingEvent loggingEvent = state as LoggingEvent;
if (m_appenderAttachedImpl != null && loggingEvent != null)
{
m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvent);
}
}
#region IAppenderAttachable Members
public void AddAppender(IAppender newAppender)
{
if (newAppender == null)
{
throw new ArgumentNullException("newAppender");
}
lock(this)
{
if (m_appenderAttachedImpl == null)
{
m_appenderAttachedImpl = new log4net.Util.AppenderAttachedImpl();
}
m_appenderAttachedImpl.AddAppender(newAppender);
}
}
public AppenderCollection Appenders
{
get
{
lock(this)
{
if (m_appenderAttachedImpl == null)
{
return AppenderCollection.EmptyCollection;
}
else
{
return m_appenderAttachedImpl.Appenders;
}
}
}
}
public IAppender GetAppender(string name)
{
lock(this)
{
if (m_appenderAttachedImpl == null || name == null)
{
return null;
}
return m_appenderAttachedImpl.GetAppender(name);
}
}
public void RemoveAllAppenders()
{
lock(this)
{
if (m_appenderAttachedImpl != null)
{
m_appenderAttachedImpl.RemoveAllAppenders();
m_appenderAttachedImpl = null;
}
}
}
public IAppender RemoveAppender(IAppender appender)
{
lock(this)
{
if (appender != null && m_appenderAttachedImpl != null)
{
return m_appenderAttachedImpl.RemoveAppender(appender);
}
}
return null;
}
public IAppender RemoveAppender(string name)
{
lock(this)
{
if (name != null && m_appenderAttachedImpl != null)
{
return m_appenderAttachedImpl.RemoveAppender(name);
}
}
return null;
}
#endregion
private AppenderAttachedImpl m_appenderAttachedImpl;
private FixFlags m_fixFlags = FixFlags.All;
}
}
1.1 logging-log4net/examples/net/1.0/Appenders/SampleAppendersApp/cs/src/Appender/PatternFileAppender.cs
Index: PatternFileAppender.cs
===================================================================
#region Copyright & License
//
// Copyright 2001-2005 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.
//
#endregion
using System;
using System.IO;
using System.Text;
using log4net.Appender;
using log4net.Util;
using log4net.Layout;
using log4net.Core;
namespace SampleAppendersApp.Appender
{
public class PatternFileAppender : AppenderSkeleton
{
public PatternFileAppender()
{
}
public PatternLayout File
{
get { return m_filePattern; }
set { m_filePattern = value; }
}
public Encoding Encoding
{
get { return m_encoding; }
set { m_encoding = value; }
}
public SecurityContext SecurityContext
{
get { return m_securityContext; }
set { m_securityContext = value; }
}
override public void ActivateOptions()
{
base.ActivateOptions();
if (m_securityContext == null)
{
m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
}
}
override protected void Append(LoggingEvent loggingEvent)
{
try
{
// Render the file name
StringWriter stringWriter = new StringWriter();
m_filePattern.Format(stringWriter, loggingEvent);
string fileName = stringWriter.ToString();
fileName = SystemInfo.ConvertToFullPath(fileName);
FileStream fileStream = null;
using(m_securityContext.Impersonate(this))
{
// Ensure that the directory structure exists
string directoryFullName = Path.GetDirectoryName(fileName);
// Only create the directory if it does not exist
// doing this check here resolves some permissions failures
if (!Directory.Exists(directoryFullName))
{
Directory.CreateDirectory(directoryFullName);
}
// Open file stream while impersonating
fileStream = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.Read);
}
if (fileStream != null)
{
using(StreamWriter streamWriter = new StreamWriter(fileStream, m_encoding))
{
RenderLoggingEvent(streamWriter, loggingEvent);
}
fileStream.Close();
}
}
catch(Exception ex)
{
ErrorHandler.Error("Failed to append to file", ex);
}
}
private PatternLayout m_filePattern = null;
private Encoding m_encoding = Encoding.Default;
private SecurityContext m_securityContext;
}
}