用于log4net的WCF附加组件

分享于 

7分钟阅读

Web开发

  繁體
Log_Result.JPG

介绍

在Log4Net中,一个非常重要的事情是能够以简单而简单的方式设置一个自定义的,。 大多数日志都写入数据库,以便以后查询它们,但是如果你想从? 假设你告诉他们: "在屏幕上再次运行 Bug,同时在屏幕上看到实时日志。

背景

我想为WCF服务编写定制附加程序时,我想自己,"很简单",并尝试在互联网上找到一个简单的WCF附加程序示例。 我惊讶地发现,我发现了几个示例,它们非常复杂,不那么容易,所以我开始研究如何编写自定义附加程序,并发现它是多么的好,而且我发现它是多么容易的。 实现之后,我是来跟你分享这个的。

这篇文章是给初学者写的。 故意地,代码尽可能短,清晰。 这不是( 在实际应用中,你将使用更详细的消息。格式化消息和使用线程来编写更详细的信息。)的最好方法,但是本文的目的是显示基本步骤,并使它的尽可以能清晰。

另外,我避免使用自动'添加服务引用'方法来设置代理,因为我想要精确地显示代码,以便了解示例。

那么,如何编写自定义附加程序( 或者这个类中真正的内容。)?

要编写自定义附加程序,有两种方法: 第一种方法是实现 log4net.Appender.IAppender 接口,但是第二种方法更简单,在大多数情况下,你会发现它适合你的需求。 其次,你需要从抽象类 log4net.Appender.AppenderSkeleton 派生定制类的自定义类,并实现一个名为 Append的方法。 这是我的课:

publicclass WcfAppender : AppenderSkeleton
{
}

此类用作 Wcf appender,因此它将包含与服务通信的整个基础结构。 幸好,只有一个 static 字段将通道保存到日志服务中:

static IServiceLogger Service; 

如上所述,此类需要实现'Append'方法:

protectedoverridevoid Append(LoggingEvent loggingEvent)
{
 string message = string.Format("{0}, {1}", loggingEvent.Level.DisplayName,
 loggingEvent.RenderedMessage);
 Service.NewLog(message);
}

loggingEvent 包含记录器收集的所有数据,这里我选择想要的数据并将它的发送到一个 string 并将它的发送到WCF服务( 在实际应用程序中,发送 Log 类或者类似于将所有数据压缩到一个 string 中更有意义。)。

现在我们有了WCF附加类。 不简单但是工作还没有完成。 我们需要告诉log4net将这个类实例化为 our,这是通过 App.config 文件完成的。

配置 App.config

我们可以根据需要配置多个记录器,但对于这里示例,我们只设置了一个:

<loggername="WcfLogger"><appender-refref="WcfAppender"/></logger>

记录器负责收集所有的消息并将它们传递给附加程序。 Appender负责将消息写入特定位置。 Logger 可以将消息传递给许多附加程序,但是我们只为这个记录器设置一个附加器。 我们可以根据需要设置任意数量的附加接口,但是在本示例中,我们只使用一个附加组件:

<appendername="WcfAppender"type="WcfAppenderLog4net.WcfAppender, WcfAppenderLog4net"><layouttype="log4net.Layout.PatternLayout"><ConversionPatternvalue="%m"/></layout></appender>

'type'告诉log4net哪个类被用作附加器。 当记录器想将消息传递给名为 WcfAppender的that时,它检查哪个类需要实例化( 在这种情况下,WcfAppenderLog4net.WcfAppender ),并实例化( 在这种情况下'WcfAppenderLog4net')。

出于某些原因,当我们使用log4net时,除非我们明确地告诉它,否则它不知道在哪里查找默认配置

log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo ("..//..//App.config"));

这一行告诉log4net它的配置文件存在于哪里。 在执行> 文件时,我们将进入 /的目录。

WCF部件

如果没有'添加服务引用'方式,就可以为我们创建代理,我们可以简单地设置WCF服务的设置。 在WCF中,我们需要三个部分:地址。绑定和契约来建立。 应用程序启动时,它将创建并提升WCF记录器的服务:

ServiceHost sh = new ServiceHost(typeof(ServiceLogger));string address = "http://localhost:8080/WcfAppenderService";
BasicHttpBinding binding = new BasicHttpBinding();
Type contract = typeof(IServiceLogger);
sh.AddServiceEndpoint(contract,binding,address);
sh.Open(); 

记录器知道它应该将消息传递给名为 WcfAppender ( 如 App.config 配置。)的appender,并需要实例化这个附加。 在这里类的构造函数中,我们初始化和获取通道到服务,因这里to可以将数据发送到服务。 很简单:

static IServiceLogger Service;
EndpointAddress address = new EndpointAddress
 (new Uri("http://localhost:8080/WcfAppenderService"));
BasicHttpBinding binding = new BasicHttpBinding();
Service = ChannelFactory<IServiceLogger>.CreateChannel(binding,address);

示例应用程序

在示例应用程序中,我们在循环中尝试分割数字并将结果发送给记录器作为信息。 当我们尝试除以零时,我们得到一个异常并将它的作为错误发送。 我希望本文能帮助你在编写WCF附加程序时理解。 如果你找到更好的方法,请告诉我,我将标记这个修正。

历史记录

  • 23rd 2010年07月: 初始帖子

log  WCF  LOG4  附加  Log4net  Appender