Log4net入门(WCF篇)

  在上一篇Log4net入门(ASP.NET MVC 5篇)中,我们讲述了如何在ASP.NET MVC 5项目中使用log4net。在这一篇中,我们将讲述如何在WCF应用中使用log4net,为了讲述这个过程,我们将创建三个项目:WCF服务库项目、WCF服务应用程序和客户端应用程序。WCF服务库项目主要用于编写我们的WCF契约及服务,WCF服务应用程序主要用于将我们的WCF服务库托管到IIS上,客户端应用程序主要目的就是调用我们托管到IIS上的WCF服务。

一、项目创建

1、空白解决方案的创建:启动VS2015,依次点击【文件】-【新建】-【项目】,在“新建项目”对话框中,展开“其他项目类型”节点,选中“Visual Studio”解决方案,我们创建一个名为“Log4netWCF”的空白解决方案。

2、WCF服务库项目的创建:右击在第一步创建的“Log4netWCF”解决方案,依次点击【添加】-【新建】项目,在“添加新项目”对话框中,我们选中“WCF”节点,在右侧我们选择“WCF服务库”项目,将该项目命名为“Log4netWCFServiceLibrary”,然后点击“确定”按钮,这样一个最简单的WCF服务就创建好了,里面的IService1.cs是服务契约,Service1是该契约的实现,这个是微软自带的演示代码,为了简单起见,我们不做任何改动,直接使用这个最简单的服务。

3、WCF服务应用程序的创建:右击在第一步创建的“Log4netWCF”解决方案,依次点击【添加】-【新建】项目,在“新建项目”对话框中,我们选中“WCF”节点,在右侧我们选择“WCF服务应用程序”项目,将该项目命名为“Log4netWCFService”,然后点击“确定”按钮,完成WCF服务应用程序的创建。

4、在新创建的“Log4netWCFService”项目中,我们右击“IService1.cs”文件,选择将其删除。然后展开Service1.svc,右击“Service1.svc.cs”,选择将其删除。

5、右击“Log4netWCFService”项目的“引用”节点,选择【添加引用】选项,在弹出的“引用管理器”对话框中,展开“项目”节点,选中“解决方案”节点,在右侧勾选“Log4netWCFServiceLibrary”,然后点击“确定”按钮。这样我们就在“Log4netWCFService”服务应用程序项目中添加了对“Log4netWCFServiceLibrary”服务库的引用。

6、双击打开“Log4netWCFService”项目中的Service1.svc文件,将其中的代码修改为以下代码:

1 <%@ ServiceHost Language="C#" Debug="true" Service="Log4netWCFServiceLibrary.Service1" CodeBehind="Service1.cs" %>

7、右击“Log4netWCF”解决方案,点击【生成解决方案】选项,编译整个解决方案,如果没有错误,继续下面的操作。

8、右击“Log4netWCFService”项目,点击【发布】选项,弹出“发布Web”对话框,如下所示:

9、选择“自定义”选项,然后输入配置文件名称为“Log4netWCF”,这个名称可以随便取,好记即可。然后点击“确定”按钮,进入下一步,如下图所示:

10、在“Publish method:”中选择“File System”,入下图所示:

11、点击“Target location:”后面的“...”按钮,弹出“目标位置”对话框,在该对话框中点击“本地IIS”按钮,如下图所示:

12、在上图中,点击“IIS网站”下面的“Default Web Site”,然后点击右上角的“创建新Web应用程序”按钮,如下图所示:

13、输入应用程序名称为“Log4netWCF”,如下图所示:

14、点击“打开”按钮,返回到“发布Web”对话框,然后点击“下一步”按钮。在“设置”标签页中,展开“File Publish Options”,然后勾选“Delete all existing files prior to publish”和“Precompile during publishing”,如下图所示:

15、点击“下一步”按钮,然后再点击“发布”按钮,等待发布成功提示信息即可。

16、打开控制面板,依次点击【系统和安全】-【管理工具】,然后以管理员身份运行“Internet信息服务(IIS)管理器”,在打开的“Internet信息服务(IIS)管理器”窗口中展开“Default Web Site”节点,然后选择“Log4netWCF”应用程序,在右侧下方点击“内容视图”,然后右键单击“Service1.svc”文件,选择【浏览】选项,如果WCF服务没有错误,则会出现如下页面:

  注意:上图中的服务地址:http://localhost/Log4netWCF/Service1.svc,我们会在客户端程序中添加服务引用的时候用到。

17、客户端应用程序的创建:为方便起见,我们将客户端应用程序创建为一个控制台应用程序,右击第一步创建的“Log4netWCF”解决方案,依次点击【添加】-【新建项目】选项,在弹出的“添加新项目”对话框中选择“控制台应用程序”,并将其命名为Client,然后点击“确定”按钮。

18、在新创建的“Client”项目中,右击“引用”节点,然后点击【添加服务引用】选项,在弹出的“添加服务引用”对话框中的地址栏中,输入在第16步生成的服务地址:http://localhost/Log4netWCF/Service1.svc,然后点击“转到”按钮,修改命名空间为“Log4netWCF”,如下图所示:

19、点击“确定”按钮,完成对WCF服务的引用。

20、双击打开“Client”项目中的“Program.cs”文件,修改代码如下所示:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace Client
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Log4netWCF.Service1Client proxy = new Log4netWCF.Service1Client();
14             proxy.Open();
15             string returnString = proxy.GetData(7);
16             proxy.Close();
17
18             Console.WriteLine(returnString);
19             Console.ReadKey();
20         }
21     }
22 }

21、将“Client”项目设置为启动项目,然后运行程序,如果没有任何错误,会出现如下结果页面:

  到这为止,我们的WCF应用程序全部创建完毕,下一步我们将在WCF应用程序中添加对log4net的使用。

二、在WCF应用程序中配置log4net

1、点击VS工具栏中的【工具】-【NuGet包管理器】-【管理解决方案的NuGet程序包】,在打开的“NuGet - 解决方案”标签页中,点击“浏览”标签,然后在搜索框中输入“log4net”,选择搜索结果中的“log4net”,然后勾选右侧的“Log4netWCFServiceLibrary”,选择最新稳定版本,然后点击“安装按钮”,如下图所示:

2、安装log4net之后,点击“Log4netWCFServiceLibrary”项目中的Properties节点,然后双击打开“AssemblyInfo.cs”文件,在该文件最后添加以下一行代码:

1 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

3、双击打开“Log4netWCFServiceLibrary”项目中的“Service1.cs”,修改代码如下所示:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Runtime.Serialization;
 5 using System.ServiceModel;
 6 using System.Text;
 7
 8 namespace Log4netWCFServiceLibrary
 9 {
10     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
11     public class Service1 : IService1
12     {
13         private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
14
15         public string GetData(int value)
16         {
17             log.Debug("debug!");
18             log.Info("info!");
19             log.Warn("warn!");
20             log.Error("error!");
21             log.Fatal("fatal!");
22
23             return string.Format("You entered: {0}", value);
24         }
25
26         public CompositeType GetDataUsingDataContract(CompositeType composite)
27         {
28             if (composite == null)
29             {
30                 throw new ArgumentNullException("composite");
31             }
32             if (composite.BoolValue)
33             {
34                 composite.StringValue += "Suffix";
35             }
36             return composite;
37         }
38     }
39 }

4、在“Log4netWCFService”项目中添加一个名为“Log4net.config”的配置文件,我们在其中配置按日期切分日志文件,并且将日期作为日志文件名称的一部分,具体配置文件如下所示:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <configSections>
 4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
 5   </configSections>
 6
 7   <system.web>
 8     <compilation debug="true" targetFramework="4.5.2" />
 9     <httpRuntime targetFramework="4.5.2" />
10   </system.web>
11
12   <log4net>
13     <!-- 将日志以回滚文件的形式写到文件中 -->
14     <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
15     <appender name="RollingFileAppenderNameByDate" type="log4net.Appender.RollingFileAppender">
16       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
17       <file value="C:\Logs\" />
18       <!-- 将日志信息追加到已有的日志文件中-->
19       <appendToFile value="true" />
20       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
21       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
22       <!-- 指定按日期切分日志文件 -->
23       <rollingStyle value="Date" />
24       <!-- 日志文件的命名规则 -->
25       <datePattern value="&quot;WCFLogs_&quot;yyyyMMdd&quot;.log&quot;" />
26       <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
27       <staticLogFileName value="false" />
28
29       <layout type="log4net.Layout.PatternLayout">
30         <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
31       </layout>
32     </appender>
33
34     <root>
35       <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
36       <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
37       <!-- 如果没有定义LEVEL的值,则缺省为DEBUG -->
38       <level value="ALL" />
39       <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
40       <appender-ref ref="RollingFileAppenderNameByDate" />
41     </root>
42   </log4net>
43 </configuration>

5、重新发布“Log4netWCFService”项目到IIS上,重新发布时只需点击【发布】菜单,然后点击“发布”按钮即可。

6、运行“Client”控制台应用程序,运行完毕后,我们就可以在C:\Logs\目录下看到名为“WCFLogs_20161215.log”的日志文件,有可能日期不一样。

  至此,如何在WCF应用中使用log4net就讲到这儿,祝大家顺利实现!

  源码下载

时间: 2024-08-04 10:39:41

Log4net入门(WCF篇)的相关文章

PowerBI入门 第一篇:创建第一个PowerBI报表

PowerBI是微软新一代的交互式报表工具,把相关的静态数据转换为酷炫的可视化的,能够根据filter条件,对数据执行动态筛选,从不同的角度和粒度上分析数据.PowerBI主要由两部分组成:PowerBI Desktop和 PowerBI Service,前者供报表开发者使用,用于创建数据模型和报表UI,后者是管理报表和用户权限,以及查看报表(Dashboard)的网页平台(Web Portal).在开始PowerBI制作报表之前,请先下载 PowerBI Desktop桌面开发工具,并注册Po

Mybatis入门学习篇(三)之模糊查询的两种写法

在上一讲(Mybatis入门学习篇(二)之基于注解的增删改查)中,需要用到模糊查询,比如我想查找所有含有'zjh'的Student的信息.如果是在数据库中,那么我们可以方便的使用通配符%:select * from student where name like '%zjh%' .但是如果在mybatis中直接像sql中那样,就会报错.遂百度,无果,偶然在一篇帖子中看到,遂记录下来,以备后用. 方法一: 在要查询的字符串合适位置加上%,如这里的'zjh'就应该为'%zjh%'.这是一个很管用的方

Redis 二:入门基本篇

1.多数据库设置 select 0 - 15 ,代表16个数据库 2.glob风格通配符 set bar 1 set btt 2 keys * 返回所有 keys ba? 返回 bar keys b[a-z][a-z] 返回btt bar \x 匹配转义字符 3.判断一个键是否存在 exists bar ,存在返回1否则返回0 4.删除键 del bar 删除成功返回1,否则返回0 5.获得键值的数据类型 set b "100" type a 返回string Redis 二:入门基本

MonoRail学习-入门实例篇

1.到官方网站下载安装文件,地址如下: http://www.castleproject.org/index.php/Castle:Download目前最新版本Beta5(您也可以不需要下载,直接使用实例代码中lib中的dll) 2.添加对Castle.MonoRail.Framework.dllCastle.MonoRail.Framework.Views.CompositeView.dllCastle.MonoRail.Framework.Views.NVelocity.dllNVeloci

智普教育Python视频教程之入门基础篇,python笔记

智普教育Python视频教程之入门基础篇,python笔记 print id()内存地址 type()变量类型 windows命令行下edit命令 python数据类型不需要指定类型 定义hostname="www.google.com" 结果运行后总是告诉我NameError: name 'socket' is not defined 哪位帮我分析一下,怎么改才对 没用过socket,不过你试着在第一行加入 import socket C:\>notepad somefile.

Asp.Net MVC2.0 Url 路由入门---实例篇

本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的View的呢?Controller和Action是怎么解析的?这就是Routing组件干的事情了. Routing的作用:它首先是获取到View传过来的请求,并解析Url请求中Controller和Action以及数据,其次他将识别出来的数据传递给Controller的Action(Controller

html/css入门第一篇

1.基本教程学习 大概三天业余时间看完下面两个教程. HTML文字教程 CSS文字教程 2.练习 看完教程后,做第一练习时,总结如下: 1)div居中 需要设置属性:margin-left:auto; margin-right:auto; 2) 给图片加链接后,图片有边框,消除边框方法:给图片设置属性 border-width:0px; 3)图片相连时,图片间有距离,消除图片间距离:给图片设置属性 display: block; html/css入门第一篇

java学习之入门扫盲篇

概要 最近这几天开始进入java的学习,接触到了好多不是很了解的概念,像JDK.JRE.JVM.GC等等这些,放到这里来进行下扫盲. java java是一种面向对象程序设计语言和java平台的总称,即java包括java语言和java平台. java语言 java语言跟我们以前接触过的C#.C++语言一样都是面向对象的语言,拥有面向对象语言的基本特点,java语言也有它自身的特点,例如增加了垃圾回收的一些特点.同时java语言的编程风格跟C#.C++也特别的相似,所有java语言是比较易学的.

ElasticSearch入门 第一篇:Windows下安装ElasticSearch

https://www.elastic.co/downloads/past-releases/elasticsearch-2-4-4 这是ElasticSearch 2.4 版本系列的第一篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档