概述
对于日志的记录,无论是Log4Net也好,NLog日志也罢,提供的功能都比较全面,并且久经历史考验,但是基于服务的日志架构并不采用他们其中的任何一个框架来实现,即使他们可以处理的更好,该架构主要用来处理对于多台服务器,并且每台服务器下的有许多不同的站点,集中对日志进行处理,包含需要记录的审计日志和系统日志,统一交由一个服务来实现对日志的存储。并且可通过相应的工具进行查看日志的实时监控情况。
整体设计图
设计思想
根据整体设计图不难看出对于实现很简单。
首先,写一个WCF服务,里面提供接口并且提供订阅接口,自定义一个配置文件用来配置日志的记录的记录规则和日志的存储方式,在每次服务启动的时候加载一次,剩下的逻辑就是你怎么去根据配置对Task发送给服务的数据进行处理。
其次,创建一个类库,实现对服务的引用,这个类库的主要作用是对服务的隔离,也就是使用代理模式实现服务的引用,应用程序在使用服务进行日志存储的时候,只需要访问代理类即可,在代理中主要处理,如何连接远程WCF服务,对出错的情况如何处理以及服务在不可用的时候,如何保证应用程序发出来的日志不丢失,并且不影响使用的应用程序。在代理类中我主要根据队列来实现的,每次应用程序发送过来的日志,首先进入日志队列中,然后开启异步任务去实现出队列发送数据到远程服务进行存储,其次就是在远程服务不可用的时候,需要采用辅助队列来对出队列并未进行远程存储的数据的储存,然后辅助队列开始出队列/入队列不断尝试知道服务可用为止,当服务可用时可以保证日志的顺序不会错乱,并且不会丢失。在进行入队列操作是一定要对上锁,要不然会出现错误。当服务不可用的时候,在队列中每满100条将队列清空,队列中的内容进行序列化为XML文件,当服务可用时,先从文件中反序列化进行优先存储,之后再进行出队列操作。
最后,在调用组件的应用程序端在配置文件中对WCF访问节点进行配置。
知识点扩展(代理Proxy模式)
上述的架构中,我们用到了代理模式,什么是代理模式呢?通俗的讲,一个你和你的朋友在你家一起玩,突然间你想吃超市的食品,而你去由于懒癌晚期,你的朋友帮你去买你想吃的东西,从你朋友的角度看,他就是你的代理,这就是代理模式。在上面的架构中用的代理模式主要用来对远程WCF服务的代理,在连接服务前和连接服务后需要处理好多事情,而这么事情并不能交给消费它的程序每次都去重复相同的事情,对于消费者而言,并不需要知道WCF是如何连接。在举一个日常编码中常用的一个例子,就是数据访问层,数据访问层直接与数据库进行交互,完成对数据的操作,对于业务逻辑层而言不需要知道数据库是如何连接、数据访问层如何与数据库进行交互的。所以数据访问层就是一个最常见的代理模式。数据访问层大家都会写,这里就不用代码来实现了。