7

我创建了连接到 Web 服务的自定义 Appender(带有 AppenderSkeleton)...这个属性像:

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

在我的 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
            //
        }
    }
}`

我无法捕捉我之前添加和填充的属性(**loggingEvent.Properties["browser"].ToString()**?!?!?!!?)

我的 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>

请帮我 !

4

3 回答 3

17

您有两种可能访问您在 XML 文件中配置的属性。如果你有这样的配置:

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

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

您的 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
    }
}

您可以指定一个与配置文件中的 XML 元素同名的公共属性,也可以提供一个公共方法,该方法只接受一个参数(XML 元素的值)并命名为Add<name of XML element>. log4net 将在您的 appender 类中搜索其中一个(大小写不变)并在 appender 初始化时调用它们。

于 2014-11-04T11:14:42.353 回答
3

最后我找到了...... :) 我必须把这行放在 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;
}
}
}

并使用它:

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());
于 2013-06-16T10:00:53.287 回答
-1

我认为您可能需要创建自定义 AppenderParameters,以便它们可以通过您在 PatternLayout 中使用的值进行映射。看看这个例子- 尝试只添加一个参数,如果成功,然后添加其余参数。此外,尝试打开 log4net 自己的跟踪 - 它可以帮助您查明问题区域。

于 2013-06-15T15:47:20.357 回答