Here's a failing test case for the problem you described. The
StringAppender has a value of "(null)" when it should have the string
representation of today's date.

A similiar test case that launches the thread via the ThreadPool:

 ThreadPool.QueueUserWorkItem(
  new WaitCallback(ExecuteBackgroundThreadPool), null);

also fails.

The TestThreadPropertiesPattern test from
log4net.Tests.Context.ThreadContextTest passes when the property is
added from the same thread.

In my ASP.Net applications, I store the user's identification
information during Application_AuthenticateRequest in the
ThreadContext(?) and all my appenders have access to it.

I'll look around some more...

[Test]
public void TestBackgroundThreadContextProperty()
{
 StringAppender stringAppender = new StringAppender();
 stringAppender.Layout = 
  new PatternLayout("%property{DateTimeTodayToString}");

 ILoggerRepository rep = 
  LogManager.CreateRepository("BackgroundThreadRepository");

 BasicConfigurator.Configure(rep, stringAppender);

 Thread thread = new Thread(new ThreadStart(ExecuteBackgroundThread));
 thread.Start();

 Thread.CurrentThread.Join(2000);
}

private void ExecuteBackgroundThread()
{
 ILog log = LogManager.GetLogger(
  "BackgroundThreadRepository", 
  "ExecuteBackgroundThread");
        
 log.Info("TestMessage");

 ThreadContext.Properties["DateTimeTodayToString"] = 
  DateTime.Today.ToString();

 Repository.Hierarchy.Hierarchy hierarchyLoggingRepository = 
  (Repository.Hierarchy.Hierarchy)log.Logger.Repository;
        
 StringAppender stringAppender = 
  (StringAppender)hierarchyLoggingRepository.Root.Appenders[0];

 Assert.AreEqual(DateTime.Today.ToString(),
stringAppender.GetString());
}

--- Wayne Bradney <[EMAIL PROTECTED]> wrote:

> So, either I'm doing something so unbelievably stupid as to not
> warrant a
> response, or this is a real problem, right?
> 
>  
> 
> WMB
> 
>   _____  
> 
> From: Wayne Bradney [mailto:[EMAIL PROTECTED] 
> Sent: Wednesday, June 07, 2006 6:05 PM
> To: Log4NET User
> Subject: Logging Thread Context Properties
> 
>  
> 
> I must be missing something here... I'm trying to setup a thread
> property in
> my background thread such that my appender can inspect the property
> when an
> event is logged:
> 
>  
> 
> The thread does this:
> 
>  
> 
> log4net.ThreadContext.Properties["ThreadTaskDescription"] = "<some
> string>";
> 
> log.Info("Some message");
> 
>  
> 
>  
> 
> In the appender, when I look at the Properties property of the
> LoggingEvent
> ("Some message"), it never has any properties at all.
> 
>  
> 
> Am I doing this right?
> 
>  
> 
> WMB
> 
>  
> 
> 

Reply via email to