log4net using ThreadContext.Properties in wcf PerSession service

前端 未结 2 1654
情深已故
情深已故 2021-01-19 02:03

I would like to use the following in my wcf service to log the user in the log message:

log4net.ThreadContext.Properties[\"user\"] = this.currentUser.Login         


        
相关标签:
2条回答
  • 2021-01-19 02:43

    Log4net supports "calculated context values". By using this you could write a class like this:

    public class UserNameContext
    {
        public override string ToString()
        {
            string userName = ...; // get the name of the current user
    
            return userName;
        }
    }
    

    If you add this to the global context you can access the property in your appenders (like you are used to). The 'ToString' method will be executed every time and thus you get the correct user name.

    More on context values can be found in this great tutorial: http://www.beefycode.com/post/Log4Net-Tutorial-pt-6-Log-Event-Context.aspx

    0 讨论(0)
  • 2021-01-19 02:47

    I ran into the same problem and this is how I got it to work. You can use GlobalContext since it will be evaluated for each call anyway.

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class MyService : IMyService
    {
        //static constructor
        static MyService()
        {
            log4net.Config.XmlConfigurator.Configure();
            log4net.GlobalContext.Properties["user"] = new UserLogHelper();
        }
        ...
    }
    

    Then you have to define a simple class:

    private class UserLogHelper
    {
        public override string ToString()
        {
            var instanceContext = OperationContext.Current.InstanceContext;
            var myServiceInstance = instanceContext.GetServiceInstance() as MyService;
            return myServiceInstance?.currentUser?.LoginName;
       }
    }
    
    0 讨论(0)
提交回复
热议问题