做项目总是需要记录日志的比如bug、调试信息等等,这样不管是为以后修改bug还是检查程序都是有非常大的帮助的。简单点的项目一般都是自己直接写一个日志工具类,然后直接通过IO来写日志文件或者直接将错误信息存到数据库中。大项目的话自己这套就不太好了,不管是安全方面还是效率方面都存在者很多问题。这里我像大家介绍一个第三方工具:Log4net。
最开始使用是Log4j,这个是Java上的开源日志工具,凭着功能强大、使用简单、易用性强等等优点深的广大开发者的喜爱。也正因为Log4j在Java上的优秀表现,所以才移植到Net平台上。
1、下载Log4net
官方下载: 点击下载
2、Log4net获取DLL文件
下载完成以后解压文件并打开:bin—> net —-> 这里我们可以看到不同版本的.NET FramerWork(下图)。
3、在项目上添加DLL文件引用
根据你项目.NET FramerWork版本来引用(下图)。
4、设置Web.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> <log4net> <!--定义输出到文件中--> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--定义文件存放位置--> <file value="log\\"/> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="1000"/> <layout type="log4net.Layout.PatternLayout"> <!--输出格式--> <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline"/> </layout> </appender> <!--定义输出到SQL Server数据库中--> <!-- 在SQL Server中创建表的SQL语句 CREATE TABLE [dbo].[Log] ( [Id] [int] IDENTITY (1, 1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [varchar] (255) NOT NULL, [Level] [varchar] (50) NOT NULL, [Logger] [varchar] (255) NOT NULL, [Message] [varchar] (4000) NOT NULL, [Exception] [varchar] (2000) NULL ); --> <appender name="AdoNetAppenderSQLServer" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="Data Source=Sc-201503031243\SQLEXPRESS;Initial Catalog=RoleDemo;Persist Security Info=True;User ID=sa;Password=123;" /> <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> <parameter> <parameterName value="@log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </appender> <root> <level value="ALL" /> <!--文件形式记录日志--> <appender-ref ref="RollingLogFileAppender"/>--> <!--SQL Server数据库形式记录日志--> <appender-ref ref="AdoNetAppenderSQLServer"/> </root> </log4net> </configuration> |
上面是我完整的配置文件,其中以下部分需要修改或注意:
- 在configSections节点下面添加以下节点
<section name=”log4net” type=”System.Configuration.IgnoreSectionHandler”/> - 上面的配置文件实现了2中记录方式:文件日志和数据库日志,具体上面的注释中已经有说明。
- 对于上面的参数详细介绍请查看这里:http://blog.csdn.net/zhoufoxcn/article/details/6029021
5、编写Log4net帮助类
下面是我完整的帮助类代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
using log4net; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; //注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息 //如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件) //如果是WebForm,则从web.config中读取相关信息 [assembly: log4net.Config.XmlConfigurator(Watch = true)] namespace WebApplication1 { public class LogHelper { /// <summary> /// 调用Log4net写日志,日志等级为 :错误(Error) /// </summary> /// <param name="logContent">日志内容</param> public static void WriteLog(string logContent) { WriteLog(null, logContent, Log4NetLevel.Error); } /// <summary> /// 调用Log4net写日志 /// </summary> /// <param name="logContent">日志内容</param> /// <param name="log4Level">记录日志等级,枚举</param> public static void WriteLog(string logContent, Log4NetLevel log4Level) { WriteLog(null, logContent, log4Level); } /// <summary> /// 调用Log4net写日志 /// </summary> /// <param name="type">类的类型,指定日志中错误的具体类。例如:typeof(Index),Index是类名,如果为空表示不指定类</param> /// <param name="logContent">日志内容</param> /// <param name="log4Level">记录日志等级,枚举</param> public static void WriteLog(Type type, string logContent, Log4NetLevel log4Level) { ILog log = type == null ? LogManager.GetLogger("") : LogManager.GetLogger(type); switch (log4Level) { case Log4NetLevel.Warn: log.Warn(logContent); break; case Log4NetLevel.Debug: log.Debug(logContent); break; case Log4NetLevel.Info: log.Info(logContent); break; case Log4NetLevel.Fatal: log.Fatal(logContent); break; case Log4NetLevel.Error: log.Error(logContent); break; } } } /// <summary> /// log4net 日志等级类型枚举 /// </summary> public enum Log4NetLevel { [Description("警告信息")] Warn = 1, [Description("调试信息")] Debug = 2, [Description("一般信息")] Info = 3, [Description("严重错误")] Fatal = 4, [Description("错误日志")] Error = 5 } } |
6、编写测试代码
1 2 3 4 5 6 7 8 |
//简单写日志 LogHelper.WriteLog("简单写日志"); //写Debug日志 LogHelper.WriteLog("写Debug日志", Log4NetLevel.Debug); //带有类型和日志等级的日志,Index 是类名 LogHelper.WriteLog(typeof(Index), "带有类型和日志等级的日志", Log4NetLevel.Info); |
注意添加引用:
1 |
using log4net;<br> |
7、测试结果
下面是测试结果 (下图) — 文件日志
运行以上代码以后,我们在项目的根目录下面就会有个log文件夹,
下面是测试结果 (下图) — 数据库日志
8、源代码下载
百度网盘下载:下载地址
提取码:45kr
发布者:柚子,转转请注明出处:https://ityouzi.com/archives/csharp-log4net-file-db.html