简体   繁体   English

如何在AppenderSkeleton log4net中添加自定义属性

[英]How Add custom properties in AppenderSkeleton log4net

I Create Custom Appender(with AppenderSkeleton) that Connect to the Web Service... in this Appender i need to send some custom properties(like Url , Browser ,User , ...) to the web Service... but when i add this properties like : 我创建自定义Appender(使用AppenderSkeleton)连接到Web服务...在这个Appender中我需要向Web服务发送一些自定义属性(如Url,Browser,User,...)但是当我添加时这个属性像:

ThreadContext.Properties["addr"] = System.Web.HttpContext.Current.Request.UserHostAddress;

in my appender that like this : 在我的appender中,像这样:

public class UrlLogAppender : AppenderSkeleton
    {

        public string APIkey { get; set; }
        public string CustomerName { get; set; }

        protected override void Append(LoggingEvent loggingEvent)
        {
            try
            {
                Base.LogToDataBase.WebService1 LogtoWebserver = new Base.LogToDataBase.WebService1();



                string Result = LogtoWebserver.Log(CustomerName, APIkey, loggingEvent.TimeStamp.ToString(), loggingEvent.ThreadName.ToString(), loggingEvent.Level.ToString(), loggingEvent.LoggerName, loggingEvent.RenderedMessage, loggingEvent.ExceptionObject.InnerException.Message.ToString(), loggingEvent.Properties["addr"].ToString(), loggingEvent.Properties["browser"].ToString(), loggingEvent.Properties["url"].ToString());
                if (Result != "UnSucced!!")
                {
                    //Say Excellent.... !
                }
                else
                {
                    //Say Opps....!!

                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("An error occured while invoking the Logging REST API", ex);
            }
        }

        public UrlLogAppender()
        {
            //
            // TODO: Add constructor logic here
            //
        }
    }
}`

i can't catch the properties that i added and filled before( **loggingEvent.Properties["browser"].ToString()** ?!?!?!!?) 我无法捕捉我之前添加和填充的属性( **loggingEvent.Properties["browser"].ToString()** ?!?!?!!?)

my Web.Config like this : 我的Web.Config是这样的:

  <appender name="UrlAppender" type="log4net.Extensions.UrlLogAppender">
      <threshold value="ALL"/>
      <CallingApp value="Base" />
      <datePattern value="_yyyy-MM-dd.lo'g'"/>
      <APIkey value="321" />
      <CustomerName value="Kanon" />

      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/>
      </layout>
    </appender>

please Help me ! 请帮我 !

You have two possibilities to access properties you have configured in your XML file. 您有两种方法可以访问已在XML文件中配置的属性。 If you have a config like this: 如果您有这样的配置:

<appender name="Test" type="MyAppender, MyAssembly">
    <intProperty>1234</intProperty>
    <stringProperty>hello</stringProperty>

    <layout> ... </layout>
</appender>

Your Appender class can look like this: 你的Appender类看起来像这样:

public class MyAppender : AppenderSkeleton
{
    public int IntProperty { get; set; }

    public override void Append(LoggingEvent loggingEvent)
    {
        // implement your functionality
    }

    public void AddStringProperty(string value)
    {
        // do whatever has to be done
    }
}

You can either specify a public property with the same name as the XML element from the config file, or provide a public method which takes exactly one argument (the value of the XML element) and is named like Add<name of XML element> . 您可以指定与配置文件中的XML元素同名的公共属性,也可以提供一个公共方法,该方法只接受一个参数(XML元素的值),并命名为Add<name of XML element> log4net will search for one of those in your appender class (the case is invariant) and call them when the appender is initialised. log4net将搜索appender类中的一个(该情况是不变的)并在初始化appender时调用它们。

Finally i found it..... :) I have to put this lines in MyAppender(UrlAppender) : 最后我发现它..... :)我必须把这些行放在MyAppender(UrlAppender)中:

public class UrlLogAppender : AppenderSkeleton
    {

        public string APIkey { get; set; }
        public string CustomerName { get; set; }

        protected override void Append(LoggingEvent loggingEvent)
        {
            try
            {
                Base.LogToDataBase.WebService1 LogtoWebserver = new Base.LogToDataBase.WebService1();

    loggingEvent.Properties["addr"] = System.Web.HttpContext.Current.Request.UserHostAddress;
    loggingEvent.Properties["browser"] = System.Web.HttpContext.Current.Request.Browser.Browser + " : " + System.Web.HttpContext.Current.Request.Browser.Version;
    loggingEvent.Properties["url"] = System.Web.HttpContext.Current.Request.Url.AbsoluteUri;
}
}
}

and for use it : 并使用它:

LogtoWebserver.Log(CustomerName, APIkey, loggingEvent.TimeStamp.ToString(),    
         loggingEvent.ThreadName.ToString(), loggingEvent.Level.ToString(), 
         loggingEvent.LoggerName, loggingEvent.RenderedMessage, 
         loggingEvent.ExceptionObject.InnerException.Message.ToString(), 
         loggingEvent.Properties["addr"].ToString(), 
         loggingEvent.Properties["browser"].ToString(), 
         loggingEvent.Properties["url"].ToString());

I think you may need to create custom AppenderParameters so that they can be mapped via the values you use in the PatternLayout. 我认为您可能需要创建自定义AppenderParameters,以便可以通过您在PatternLayout中使用的值来映射它们。 Have a look at this example - try adding one parameter only and then add the rest if you are successful. 看看这个例子 - 尝试仅添加一个参数,然后在成功时添加其余参数。 Also, try switching on log4net's own tracing - it can help you pinpoint problem areas. 此外,尝试打开log4net自己的跟踪 - 它可以帮助您查明问题区域。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM