创建自定义的事件接收器-Semantic Logging

创建自定义的事件接收器

Semantic Logging Application Block提供了大量的事件接收器,如Rolling Flat File,SQL Database, 云存储接收器等。这些接收器都实现了IObservable<EventEntry>接口。

有时这些并不能很好的满足客户需求,这时就需要定制事件接收器,比如邮件接收器、短信接收器等。

下面介绍以下如何定制邮件接收器,在特定的事件发生时自动发送邮件给指定的客户。

本文介绍了以下主题:

  • 创建自定义接收器
  • 在进程内使用自定义接收器

创建自定义接收器

要创建自定义接收器,必须实现IObservable<EventEntry>接口,该接口提供了3个函数:OnCompleted,OnError和OnExt

public interface IObserver<in T>{void OnCompleted();void OnError(Exception error);void OnNext(T value);}

下面的展示了如何创建自定义的Email接收器。

public sealed class EmailSink : IObserver<EventEntry>{private const string DefaultSubject = "Email Sink Extension";private IEventTextFormatter formatter;private MailAddress sender;private MailAddressCollection recipients = new MailAddressCollection();private string subject;private string host;private int port;private NetworkCredential credentials;public EmailSink(string host, int port,string recipients, string subject, string credentials,IEventTextFormatter formatter){this.formatter = formatter ?? new EventTextFormatter();this.host = host;this.port = GuardPort(port);this.credentials = CredentialManager.GetCredentials(credentials);this.sender = new MailAddress(this.credentials.UserName);this.recipients.Add(GuardRecipients(recipients));this.subject = subject ?? DefaultSubject;}public void OnNext(EventEntry entry){if (entry != null){using (var writer = new StringWriter()){this.formatter.WriteEvent(entry, writer);Post(writer.ToString());}}}public void OnCompleted() {}public void OnError(Exception error) {}private void Post(string body){using (var client = new SmtpClient(this.host, this.port){ Credentials = this.credentials, EnableSsl = true })using (var message = new MailMessage(this.sender, this.recipients[0]){ Body = body, Subject = this.subject }){for (int i = 1; i < this.recipients.Count; i++)message.CC.Add(this.recipients[i]);try{client.Send(message);}catch (SmtpException e){SemanticLoggingEventSource.Log.CustomSinkUnhandledFault("SMTP error sending email: " + e.Message);}catch (InvalidOperationException e){SemanticLoggingEventSource.Log.CustomSinkUnhandledFault("Configuration error sending email: " + e.Message);}catch (...){// additional exception handling code here.}}}private static int GuardPort(int port){if (port < 0)throw new ArgumentOutOfRangeException("port");return port;}private static string GuardRecipients(string recipients){if (recipients == null)throw new ArgumentNullException("recipients");if (string.IsNullOrWhiteSpace(recipients))throw new ArgumentException("The recipients cannot be empty", "recipients");return recipients;}}

并使用一个扩展函数来实例化监听器,代码如下

public static class EmailSinkExtensions{public static EventListener CreateListener(string host, int port,string recipients, string subject, string credentials,IEventTextFormatter formatter = null){var listener = new ObservableEventListener();listener.LogToEmail(host, port, recipients, subject, credentials, formatter);return listener;}public static SinkSubscription<EmailSink> LogToEmail(this IObservable<EventEntry> eventStream, string host, int port,string recipients, string subject, string credentials,IEventTextFormatter formatter = null){var sink = new EmailSink(host, port, recipients, subject, credentials, formatter);var subscription = eventStream.Subscribe(sink);return new SinkSubscription<EmailSink>(subscription, sink);}}

如何使用自定义接收器

private void ButtonBase_OnClick(object sender, RoutedEventArgs e){var listener = new ObservableEventListener();listener.LogToEmail("smtp.live.com", 25, "[email protected]", "In Proc Sample", "etw");listener.EnableEvents(MyCompanyEventSource.Log,EventLevel.LogAlways, EventKeywords.All);MyCompanyEventSource.Log.Startup();}

原文地址:https://www.cnblogs.com/xjshipin/p/9685514.html

时间: 2024-10-13 14:54:37

创建自定义的事件接收器-Semantic Logging的相关文章

WPF自定义路由事件(二)

WPF中的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件. 1.WPF内置路由事件 WPF中的大多数事件都是路由事件,WPF有3中路由策略: 具体不多讲,单需要注意的是WPF路由事件是沿着VIsualTree传递的.VisualTree与LogicalTree的区别在于:LogicalTree的叶子节点是构成用户界面的控件(xaml紧密相关),而VisualTree要连控件中的细微结构也

WPF:自定义路由事件的实现

路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数:通过RaiseEvent方法来触发事件:通过传统的CLR事件来封装后供用户使用. 如何实现自定义路由事件,可以参考MSDN官网上的文档:如何:创建自定义路由事件 下面的这个demo参考自<葵花宝典--WPF自学手册>. 1.MainWindow.xaml 1 <Window x:Class="WpfApplic

微信公众帐号开发-自定义菜单的创建及菜单事件响应

注:文章代码来源于柳峰的微信公众平台应用开发 微信开发公众平台自定义菜单需要花钱认证才能实现,不想花钱只能玩测试账号了,不过这并不影响开发.我的开发都是基于柳峰老师的微信公众平台应用开发做的. 只要我们使用公众平台测试账号就可以开发自定义菜单了,比较方便,测试账号开放了很多接口,很方便. 在开发自定义菜单的时候可以参考微信公众平台开发者文档的自定义菜单创建. 一.自定义菜单 1.自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. 2.一级菜单最多4个汉字,二级菜单最多7个汉字,多

微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应

微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应 参考文章:http://blog.csdn.net/lyq8479/article/details/9841371

[038] 微信公众帐号开发教程第14篇-自定义菜单的创建及菜单事件响应

微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号: 2)服务号可以申请自定义菜单: 3)使用QQ登录的公众号,可以升级为邮箱登录: 4)使用邮箱登录的公众号,可以修改登录邮箱: 5)编辑图文消息可选填作者: 6)群发消息可以同步到腾讯微博. 其中,大家议论最多的当属前两条,就是关于帐号类型和自定义菜单的更新,我这里做几点补充说明: 1)目前公众号类型分为两种:服务号和订阅号,8月5日

WPF自定义路由事件

一 概要 本文通过实例演示WPF自定义路由事件的使用,进而探讨了路由事件与普通的CLR事件的区别(注:"普通的CLR事件"这个说法可能不太专业,但是,我暂时也找不到什么更好的称呼,就这么着吧,呵呵.)(扩展阅读:例说.NET事件的使用). 二 实例演示与说明 1 新建DetailReportEventArgs类,该类派生自RoutedEventArgs类,RoutedEventArgs类包含与路由事件相关的状态信息和事件数据.DetailReportEventArgs类中定义了属性Ev

带你走近AngularJS - 创建自定义指令

为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义指令的功能,并且AngularJS 是目前唯一提供Web应用可复用能力的框架. 目前有很多JavaScript 产品提供插件给Web开发人员.例如, Bootstrap 就是当前比较流行的提供样式和JavaScript插件的前端开发工具包.但是开发人员在使用Booostrap中的插件时, 必须切换到JavaScript 模式来写 jQuery

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义

微信公众号开发系列-开发模式创建自定义菜单

通过程序方式实现自定义菜单,通过http请求封装类交互微信自定义菜单接口 1.得到AccessToken access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效.由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务. 请开发者