用wordpress做网站页面显示404,成都市青羊区城乡建设局网站,温州市网站建设公司,教育网站制作哪个好一. Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架#xff0c;它的功能很强大#xff0c;可以将日志分为不同的等级#xff0c;以不同的格式输出到不同的存储介质中#xff0c;比如#xff1a;数据库、txt文件、内存缓冲区、邮件、控制台、ANS…一. Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架它的功能很强大可以将日志分为不同的等级以不同的格式输出到不同的存储介质中比如数据库、txt文件、内存缓冲区、邮件、控制台、ANSI终端、远程接收端等等我们这里主要介绍最常用的两种txt文件和数据库。
PS其它的存储介质详见 http://logging.apache.org/log4net/release/config-examples.html Log4net将日志分为五个级别分别是 FATAL(致命错误) ERROR一般错误 WARN警告 INFO一般信息 DEBUG调试信息每个级别都对应着一组重载方法进行调用。 官网地址http://logging.apache.org/log4net/index.html Nuget地址https://www.nuget.org/packages/log4net/ Nuget安装Install-Package log4net 最新版本2.0.8 2018-08-09 本节主要围绕两个主要的存储介质【txt文件】和【SQLServer数据库】展开涵盖的知识点有 ①. 基本的使用步骤。 ②. 初始化关联配置文件的几种形式。 ③. 代码调用详解。 ④. 配置文件详解。 ⑤. 简单的封装和在MVC框架中的调用。
二. 基本使用步骤 我们先以控制台程序为例简单介绍Log4net存储日志到txt文本文档中后面在做代码的详解。
1. 新建01-SimpleDemo控制台程序通过指令 【Install-Package log4net】安装相应程序集。 2. 在默认配置文件中App.config(B/S程序则为web.config)中进行配置主要分两块 A. 在configuration/configuration节点下新增节点下新增(要在其最顶部) configSections section name log4net typelog4net.Config.Log4NetConfigurationSectionHandler,log4net / /configSections B. 在configuration/configuration根节点下,配置log4net的核心配置代码, 主要节点如下 log4net appender /appender root/root /log4net
详细代码如下 View Code
3. 代码调用
1 log4net.Config.XmlConfigurator.Configure();
2 ILog log LogManager.GetLogger(test);
3 log.Debug(调试信息);
4. 运行结果 截止此处日志保存成功。 三. 初始化配置文件 前面提到在默认配置文件中App.config(B/S程序则为web.config)中进行配置可以通过代码 log4net.Config.XmlConfigurator.Configure(); 来初始化配置或者还可以通过 [assembly: log4net.Config.XmlConfigurator()] 反射的形式进行初始化配置二者可以达到同样的效果代表了两种初始化配置文件的形式。 PS [assembly: log4net.Config.XmlConfigurator()] 可以加在 当前使用文件的 namespace上作用于当前文件或者加在Properties/AssemblyInfo.cs中则该项目全局都无须再初始化了。 在实际项目中默认的配置文件里可能包含很多框架的信息这个时候把 log4net的配置代码再放入进去就会显得有点杂乱或者有些“奇葩”的人把默认配置文件改名了这个时候使用上述默认的两种方式就不好用了那么这种情况怎么处理呢 这里重点介绍 通过 log4net.Config.XmlConfigurator.Configure(); 来关联配置文件。
情况一 使用默认配置文件的情况 1. 代码配置log4net.Config.XmlConfigurator.Configure(); 2. 反射配置[assembly: log4net.Config.XmlConfigurator()] 情况二修改默认配置文件的名称为App1.config (这里只是举例很少有修改默认配置文件名称的) 1. 代码配置 首先将App1.config文件的属性中的“生成操作”改为“ 嵌入的资源”然后通过以下代码进行配置。
1 Assembly assembly Assembly.GetExecutingAssembly();
2 var xml assembly.GetManifestResourceStream(_01_SimpleDemo.App1.config);
3 log4net.Config.XmlConfigurator.Configure(xml); 注代码中的 _01_SimpleDemo 为命名空间名。 2. 反射配置[assembly: log4net.Config.XmlConfigurator(ConfigFile log4net.xml)] 注用这种方式属性中的复制到输出目录需要改为始终复制生成操作不需要配置使用默认无 即可 情况三新建单独xml文件进行log4net的配置 (推荐采用这种方式和原配置文件区分开单独配置方便处理方式和情况二是一致的) 1. 代码配置首先将log4net.xml文件的属性中的“生成操作”改为“ 嵌入的资源”然后通过以下代码进行配置。
1 Assembly assembly Assembly.GetExecutingAssembly();
2 var xml assembly.GetManifestResourceStream(_01_SimpleDemo.log4net.xml);
3 log4net.Config.XmlConfigurator.Configure(xml); 注代码中的 _01_SimpleDemo 为命名空间名。 情况四无论是修改默认配置文件的名称为 或者 新建单独的xml作为配置文件 → 可以通过绝对路径的方式进行处理 【不推荐这种方式】 1. 直接写绝对路径 注意这种方式【不需要】配置文件属性为 “嵌入的资源”
1 log4net.Config.XmlConfigurator.Configure(new FileInfo(D:\06-我的开发之路\DotNet体系\05-DotNet框架篇\03-Log4net详解\Code\01-SimpleDemo\log4net.xml)); 2 通过代码获取绝对路径 注意这种方式【不需要】配置文件属性的“生成操作”改为 “嵌入的资源”但需要改为“始终复制”确保输出到bin文件下
1 string assemblyFilePath Assembly.GetExecutingAssembly().Location;
2 string assemblyDirPath Path.GetDirectoryName(assemblyFilePath);
3 string configFilePath assemblyDirPath //log4net.xml;
4 log4net.Config.XmlConfigurator.Configure(new FileInfo(configFilePath));
PSB/S程序下通过 log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath(~) /log4net.xml)); 来配置。 四. 代码调用详解 Log4net允许多个ILog对象同时存在通过代码ILog log LogManager.GetLogger(xxx); 来创建。 A: 日志级别由高到低分别为FATAL(致命错误) ERROR一般错误 WARN警告 INFO一般信息 DEBUG调试信息另外还有 OFF和 ALL 。 几点说明OFF表示所有信息都不写入ALL表示所有信息都写入我们也可以通过rootlevel value WARN / level /root这样配置表示WARN级别以及高于WARN以上的级别才会被写入日志。 B: 写入日志的方法有Debug、Error、Fatal、Info、Warn五个方法每个方法都有两个重载如下图 分享在使用配置文件为log4net.xml的情况下的调用代码 1 Assembly assembly Assembly.GetExecutingAssembly();2 var xml assembly.GetManifestResourceStream(_01_SimpleDemo.log4net.xml);3 log4net.Config.XmlConfigurator.Configure(xml);4 ILog log LogManager.GetLogger(test);5 log.Debug(调试信息);6 log.Info(一般信息);7 log.Warn(警告);8 try9 {
10 int.Parse(ddd);
11 }
12 catch (Exception ex)
13 {
14 log.Error(一般错误, ex);
15 }
16 log.Fatal(致命错误); 五. 配置文件详解 Log4net的配置文件主要分为两大部分分别是 【自定义配置节点】和 【核心代码配置】自定义配置节点代码固定如下图核心代码配置主要位于log4net/log4net节点中里面包括appender/appender节点配置日日志输出途径 和 root/root节点用于设置记录日志的级别和启用哪些输出途径。 几点说明
1. 自定义配置节点 section namelog4net typelog4net.Config.Log4NetConfigurationSectionHandler,log4net / 代码固定直接复制即可。
2. root/root 节点主要用来 配置日志的的输出级别和加载日志的输出途径。 A level中的value值表示该值及其以上的日志级别才会输出日志级别包括OFF FATAL(致命错误) ERROR一般错误 WARN警告 INFO一般信息 DEBUG调试信息 ALL 比如 level valueINFO/level 表示只有INFO及其以上的日志级别才会被保存。 PSOFF表示所有信息都不写入ALL表示所有信息都写入。 B appender-ref/appender-ref标签用于加载日志的输出途径代码通过ref和appender标签的中name属性相关联比如 appender-ref refRollingFileAppender/appender-ref 表示开启txt文档保存日志的方式。
3. appender/appender节点用来配置日志的输出途径的本节主要介绍了输出到 【txt文本文档】中 和 【数据库】。 A分享一下数据库的表结构详细配置见下面的代码分享需要注意字段类型相匹配并且要显式指定其长度。 B关于txt文本文档的命名可以存放到一个文件夹里也可以按照时间来区分文件夹并且命名可以 动态指定命名的方式。 C关于日志文件大小的说明和文件个数的说明主要需要三个节点配合使用实际开发中如果一个txt特别大打开的时候会非常的慢卡顿所以该步骤有必要配置一下。 PS首先要配置 RollingStyle 节点为Size模式或者Composite模式然后配置 maximumFileSize 节点设置每个文件的大小最后配置 MaxSizeRollBackups 节点设置日志文件的个数。超出大小后在所有文件名后自动增加正整数重新命名数字最大的最早写入。 用下面的代码简单测试一下
1 param nameRollingStyle valueComposite /
2 param namemaximumFileSize value10KB /
3 param nameMaxSizeRollBackups value5 / 详细代码如下 1 ?xml version1.0 encodingutf-8 ?2 configuration3 !-- 一. 添加log4net的自定义配置节点--4 configSections5 section namelog4net typelog4net.Config.Log4NetConfigurationSectionHandler,log4net /6 /configSections7 !--二. log4net的核心配置代码--8 log4net9 !--(一) 配置日志的输出途径--10 !--1. 输出途径(一) 将日志以回滚文件的形式写到文件中--11 appender nameRollingFileAppender typelog4net.Appender.RollingFileAppender12 !--1.1 文件夹的位置也可以写相对路径--13 param nameFile valueD:\MyLog1\ /14 !--相对路径 C/S程序生成在Debug目录下--15 !--param nameFile value/Logs/ /--16 !--1.2 是否追加到文件--17 param nameAppendToFile valuetrue /18 !--1.3 使用最小锁定模型minimal locking model以允许多个进程可以写入同一个文件 --19 lockingModel typelog4net.Appender.FileAppenderMinimalLock /20 !--1.4 配置Unicode编码--21 Encoding valueUTF-8 /22 !--1.5 是否只写到一个文件里--23 param nameStaticLogFileName valuefalse /24 !--1.6 配置按照何种方式产生多个日志文件 Date日期、Size文件大小、Composite日期和文件大小的混合方式--25 param nameRollingStyle valueComposite /26 !--1.7 介绍多种日志的的命名和存放在磁盘的形式--27 !--1.7.1 在根目录下直接以日期命名txt文件 注意quot;的位置,去空格 --28 param nameDatePattern valueyyyy-MM-ddquot;.logquot; /29 !--1.7.2 在根目录下按日期产生文件夹文件名固定 test.log --30 !--param nameDatePattern valueyyyy-MM-dd/quot;test.logquot; /--31 !--1.7.3 在根目录下按日期产生文件夹这是按日期产生文件夹并在文件名前也加上日期 --32 !--param nameDatePattern valueyyyyMMdd/yyyyMMddquot;-test.logquot; /--33 !--1.7.4 在根目录下按日期产生文件夹这再形成下一级固定的文件夹 --34 !--param nameDatePattern valueyyyyMMdd/quot;OrderInfor/test.logquot; /--35 !--1.8 配置每个日志的大小。【只在1.6 RollingStyle 选择混合方式与文件大小方式下才起作用】可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志36 超出大小后在所有文件名后自动增加正整数重新命名数字最大的最早写入。--37 param namemaximumFileSize value10MB /38 !--1.9 最多产生的日志文件个数超过则保留最新的n个 将value的值设置-1则不限文件个数 【只在1.6 RollingStyle 选择混合方式与文件大小方式下才起作用】39 与1.8中maximumFileSize文件大小是配合使用的--40 param nameMaxSizeRollBackups value5 /41 !--1.10 配置文件文件的布局格式使用PatternLayout自定义布局--42 layout typelog4net.Layout.PatternLayout43 conversionPattern value记录时间%date %n线程ID:[%thread] %n日志级别%-5level %n出错类%logger property: [%property{NDC}] - %n错误描述%message%newline %n%newline/44 /layout45 /appender46 47 !--2. 输出途径(二) 记录日志到数据库--48 appender nameAdoNetAppender typelog4net.Appender.AdoNetAppender49 !--2.1 设置缓冲区大小只有日志记录超设定值才会一块写入到数据库--50 param nameBufferSize value1 /51 !--2.2 引用--52 connectionType valueSystem.Data.SqlClient.SqlConnection, System.Data, Version1.0.3300.0, Cultureneutral, PublicKeyTokenb77a5c561934e089 /53 !--2.3 数据库连接字符串--54 connectionString valuedata sourcelocalhost;initial catalogLogDB;integrated securityfalse;persist security infoTrue;User IDsa;Password123456 /55 !--2.4 SQL语句插入到指定表--56 commandText valueINSERT INTO LogInfor ([threadId],[log_level],[log_name],[log_msg],[log_exception],[log_time]) VALUES (threadId, log_level, log_name, log_msg, log_exception,log_time) /57 !--2.5 数据库字段匹配--58 !-- 线程号--59 parameter60 parameterName valuethreadId /61 dbType valueString /62 size value100 /63 layout typelog4net.Layout.PatternLayout64 conversionPattern value%thread /65 /layout66 /parameter67 !--日志级别--68 parameter69 parameterName valuelog_level /70 dbType valueString /71 size value100 /72 layout typelog4net.Layout.PatternLayout73 conversionPattern value%level /74 /layout75 /parameter76 !--日志记录类名称--77 parameter78 parameterName valuelog_name /79 dbType valueString /80 size value100 /81 layout typelog4net.Layout.PatternLayout82 conversionPattern value%logger /83 /layout84 /parameter85 !--日志信息--86 parameter87 parameterName valuelog_msg /88 dbType valueString /89 size value5000 /90 layout typelog4net.Layout.PatternLayout91 conversionPattern value%message /92 /layout93 /parameter94 !--异常信息 指的是如Infor 方法的第二个参数的值--95 parameter96 parameterName valuelog_exception /97 dbType valueString /98 size value2000 /99 layout typelog4net.Layout.ExceptionLayout /
100 /parameter
101 !-- 日志记录时间--
102 parameter
103 parameterName valuelog_time /
104 dbType valueDateTime /
105 layout typelog4net.Layout.RawTimeStampLayout /
106 /parameter
107 /appender
108 !--(二). 配置日志的的输出级别和加载日志的输出途径--
109 root
110 !--1. level中的value值表示该值及其以上的日志级别才会输出--
111 !--OFF FATAL(致命错误) ERROR一般错误 WARN警告 INFO一般信息 DEBUG调试信息 ALL --
112 !--OFF表示所有信息都不写入ALL表示所有信息都写入--
113 level valueALL/level
114 !--2. append-ref标签表示要加载前面的日志输出途径代码 通过ref和appender标签的中name属性相关联--
115 appender-ref refRollingFileAppender/appender-ref
116 appender-ref refAdoNetAppender/appender-ref
117 /root
118 /log4net
119
120 /configuration 六. 简单的封装及完整代码分享 这里模拟在系统框架中对Log4net进行简单的封装然后在MVC框架中调用并分享全部代码。 步骤一新建Ypf.Utils类库作为工具类库引入log4net程序集并将前面用到的log4net.xml 复制进来改属性为嵌入资源然后新建LogUtils类不要起名为LogHelp对Log4net的方法进行简单的封装主要包括初始化代码、ILog实例创建、五类日志级别的封装。 特别注意这种封装会带来一个问题会导致输出的文件中出错类永远显示的为LogUtils这个封装类这里采用StackTrace类进行迂回处理一下就可以定位到具体的出错位置了如下图 log4net.xml文件代码如下 View Code
LogUtils类代码如下 View Code
步骤二新建名Ypf.MVC的MVC5框架添加对Ypf.Utils类库的引用在Global.asax全局文件中添加对 对Log4net进行初始化。 然后就可以愉快的进行调用测试了哦。 View Code 七. 补充分文件存放 在前面的介绍中忽略了一种情况各种类型的日志操作日志也好错误日志也好都存放在一个txt文档里在实际开发中很不方便在这里介绍一种利用Log4net过滤器实现不同日志分文件夹存放的功能。
几种过滤器可以用来过滤掉Appender中的内容 DenyAllFilter 阻止所有的日志事件被记录 LevelMatchFilter 只有指定等级的日志事件才被记录 LevelRangeFilter 日志等级在指定范围内的事件才被记录 LoggerMatchFilter 与Logger名称匹配才记录 PropertyFilter 消息匹配指定的属性值时才被记录 StringMathFilter 消息匹配指定的字符串才被记录 分文件夹存放的核心所在
①. 配置文件的调整利用LoggerMatchFilter和DenyAllFilter过滤器实现分文件存放。 ②声明ILog对象的时候需要与LoggerMatchFilter过滤器中的Value值相对应才能保证该ILog对象记录的日志存放到该Appender节点对应的路径下。 ③. 高层调用 分享一下log4net的配置文件和LogUtils的封装文件。 1 ?xml version1.0 encodingutf-8 ?2 configuration3 !-- 一. 添加log4net的自定义配置节点--4 configSections5 section namelog4net typelog4net.Config.Log4NetConfigurationSectionHandler,log4net /6 /configSections7 !--二. log4net的核心配置代码--8 log4net9 !--1. 输出途径(一) 将日志以回滚文件的形式写到文件中--10 11 !--模式一全部存放到一个文件夹里--12 appender namelog0 typelog4net.Appender.RollingFileAppender13 !--1.1 文件夹的位置也可以写相对路径--14 param nameFile valueD:\MyLog\ /15 !--相对路径--16 !--param nameFile valueLogs/ /--17 !--1.2 是否追加到文件--18 param nameAppendToFile valuetrue /19 !--1.3 使用最小锁定模型minimal locking model以允许多个进程可以写入同一个文件 --20 lockingModel typelog4net.Appender.FileAppenderMinimalLock /21 !--1.4 配置Unicode编码--22 Encoding valueUTF-8 /23 !--1.5 是否只写到一个文件里--24 param nameStaticLogFileName valuefalse /25 !--1.6 配置按照何种方式产生多个日志文件 Date日期、Size文件大小、Composite日期和文件大小的混合方式--26 param nameRollingStyle valueComposite /27 !--1.7 介绍多种日志的的命名和存放在磁盘的形式--28 !--1.7.1 在根目录下直接以日期命名txt文件 注意quot;的位置,去空格 --29 param nameDatePattern valueyyyy-MM-ddquot;.logquot; /30 !--1.7.2 在根目录下按日期产生文件夹文件名固定 test.log --31 !--param nameDatePattern valueyyyy-MM-dd/quot;test.logquot; /--32 !--1.7.3 在根目录下按日期产生文件夹这是按日期产生文件夹并在文件名前也加上日期 --33 !--param nameDatePattern valueyyyyMMdd/yyyyMMddquot;-test.logquot; /--34 !--1.7.4 在根目录下按日期产生文件夹这再形成下一级固定的文件夹 --35 !--param nameDatePattern valueyyyyMMdd/quot;OrderInfor/test.logquot; /--36 !--1.8 配置每个日志的大小。【只在1.6 RollingStyle 选择混合方式与文件大小方式下才起作用】可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志37 超出大小后在所有文件名后自动增加正整数重新命名数字最大的最早写入。--38 param namemaximumFileSize value10MB /39 !--1.9 最多产生的日志文件个数超过则保留最新的n个 将value的值设置-1则不限文件个数 【只在1.6 RollingStyle 选择混合方式与文件大小方式下才起作用】40 与1.8中maximumFileSize文件大小是配合使用的--41 param nameMaxSizeRollBackups value5 /42 !--1.10 配置文件文件的布局格式使用PatternLayout自定义布局--43 layout typelog4net.Layout.PatternLayout44 conversionPattern value记录时间%date %n线程ID:[%thread] %n日志级别%-5level %n出错类%logger property: [%property{NDC}] - %n错误描述%message%newline %n%newline/45 /layout46 /appender47 48 !--模式二分文件夹存放--49 !--文件夹1--50 appender namelog1 typelog4net.Appender.RollingFileAppender51 param nameFile valueD:\MyLog\OneLog\ /52 param nameAppendToFile valuetrue /53 lockingModel typelog4net.Appender.FileAppenderMinimalLock /54 Encoding valueUTF-8 /55 param nameStaticLogFileName valuefalse /56 param nameRollingStyle valueComposite /57 param nameDatePattern valueyyyy-MM-ddquot;.logquot; /58 param namemaximumFileSize value10MB /59 param nameMaxSizeRollBackups value5 /60 layout typelog4net.Layout.PatternLayout61 conversionPattern value%message%newline /62 /layout63 !--下面是利用过滤器进行分文件夹存放,两种过滤器进行配合--64 !--与Logger名称(OneLog)匹配才记录,--65 filter typelog4net.Filter.LoggerMatchFilter66 loggerToMatch valueOneLog /67 /filter68 !--阻止所有的日志事件被记录--69 filter typelog4net.Filter.DenyAllFilter /70 /appender71 !--文件夹2--72 appender namelog2 typelog4net.Appender.RollingFileAppender73 param nameFile valueD:\MyLog\TwoLog\ /74 param nameAppendToFile valuetrue /75 lockingModel typelog4net.Appender.FileAppenderMinimalLock /76 Encoding valueUTF-8 /77 param nameStaticLogFileName valuefalse /78 param nameRollingStyle valueComposite /79 param nameDatePattern valueyyyy-MM-ddquot;.logquot; /80 param namemaximumFileSize value10MB /81 param nameMaxSizeRollBackups value5 /82 layout typelog4net.Layout.PatternLayout83 conversionPattern value%message%newline /84 /layout85 !--下面是利用过滤器进行分文件夹存放,两种过滤器进行配合--86 !--与Logger名称(TwoLog)匹配才记录,--87 filter typelog4net.Filter.LoggerMatchFilter88 loggerToMatch valueTwoLog /89 /filter90 !--阻止所有的日志事件被记录--91 filter typelog4net.Filter.DenyAllFilter /92 /appender93 94 95 !--2. 输出途径(二) 记录日志到数据库--96 appender nameAdoNetAppender typelog4net.Appender.AdoNetAppender97 !--2.1 设置缓冲区大小只有日志记录超设定值才会一块写入到数据库--98 param nameBufferSize value1 /99 !--2.2 引用--
100 connectionType valueSystem.Data.SqlClient.SqlConnection, System.Data, Version1.0.3300.0, Cultureneutral, PublicKeyTokenb77a5c561934e089 /
101 !--2.3 数据库连接字符串--
102 connectionString valuedata sourcelocalhost;initial catalogLogDB;integrated securityfalse;persist security infoTrue;User IDsa;Password123456 /
103 !--2.4 SQL语句插入到指定表--
104 commandText valueINSERT INTO LogInfor ([threadId],[log_level],[log_name],[log_msg],[log_exception],[log_time]) VALUES (threadId, log_level, log_name, log_msg, log_exception,log_time) /
105 !--2.5 数据库字段匹配--
106 !-- 线程号--
107 parameter
108 parameterName valuethreadId /
109 dbType valueString /
110 size value100 /
111 layout typelog4net.Layout.PatternLayout
112 conversionPattern value%thread /
113 /layout
114 /parameter
115 !--日志级别--
116 parameter
117 parameterName valuelog_level /
118 dbType valueString /
119 size value100 /
120 layout typelog4net.Layout.PatternLayout
121 conversionPattern value%level /
122 /layout
123 /parameter
124 !--日志记录类名称--
125 parameter
126 parameterName valuelog_name /
127 dbType valueString /
128 size value100 /
129 layout typelog4net.Layout.PatternLayout
130 conversionPattern value%logger /
131 /layout
132 /parameter
133 !--日志信息--
134 parameter
135 parameterName valuelog_msg /
136 dbType valueString /
137 size value5000 /
138 layout typelog4net.Layout.PatternLayout
139 conversionPattern value%message /
140 /layout
141 /parameter
142 !--异常信息 指的是如Infor 方法的第二个参数的值--
143 parameter
144 parameterName valuelog_exception /
145 dbType valueString /
146 size value2000 /
147 layout typelog4net.Layout.ExceptionLayout /
148 /parameter
149 !-- 日志记录时间--
150 parameter
151 parameterName valuelog_time /
152 dbType valueDateTime /
153 layout typelog4net.Layout.RawTimeStampLayout /
154 /parameter
155 /appender
156
157
158 !--(二). 配置日志的的输出级别和加载日志的输出途径--
159 root
160 !--1. level中的value值表示该值及其以上的日志级别才会输出--
161 !--OFF FATAL(致命错误) ERROR一般错误 WARN警告 INFO一般信息 DEBUG调试信息 ALL --
162 !--OFF表示所有信息都不写入ALL表示所有信息都写入--
163 level valueALL/level
164 !--2. append-ref标签表示要加载前面的日志输出途径代码 通过ref和appender标签的中name属性相关联--
165
166 !--appender-ref refAdoNetAppender/appender-ref--
167 appender-ref reflog0/appender-ref
168 appender-ref reflog1/appender-ref
169 appender-ref reflog2/appender-ref
170 /root
171 /log4net
172
173 /configuration 1 using log4net;2 using System;3 using System.Collections.Generic;4 using System.Diagnostics;5 using System.Linq;6 using System.Reflection;7 using System.Text;8 using System.Threading.Tasks;9 10 namespace Ypf.Utils11 {12 public class LogUtils13 {14 //声明文件夹名称(这里分两个文件夹)15 static string log1Name OneLog;16 static string log2Name TwoLog;17 18 //可以声明多个日志对象19 //模式一不分文件夹20 public static ILog log LogManager.GetLogger(typeof(LogUtils));21 22 //模式二分文件夹23 //如果是要分文件夹存储这里的名称需要和配置文件中loggerToMatch节点中的value相配合24 //1. OneLog文件夹25 public static ILog log1 LogManager.GetLogger(log1Name);26 //2. TwoLog文件夹27 public static ILog log2 LogManager.GetLogger(log2Name);28 29 #region 01-初始化Log4net的配置30 /// summary31 /// 初始化Log4net的配置32 /// xml文件一定要改为嵌入的资源33 /// /summary34 public static void InitLog4Net()35 {36 Assembly assembly Assembly.GetExecutingAssembly();37 var xml assembly.GetManifestResourceStream(Ypf.Utils.log4net.xml);38 log4net.Config.XmlConfigurator.Configure(xml);39 }40 #endregion41 42 /************************* 五种不同日志级别 *******************************/43 //FATAL(致命错误) ERROR一般错误 WARN警告 INFO一般信息 DEBUG调试信息44 45 #region 00-将调试的信息输出可以定位到具体的位置解决高层封装带来的问题46 /// summary47 /// 将调试的信息输出可以定位到具体的位置解决高层封装带来的问题48 /// /summary49 /// returns/returns50 private static string getDebugInfo()51 {52 StackTrace trace new StackTrace(true);53 return trace.ToString();54 }55 #endregion56 57 #region 01-DEBUG调试信息58 /// summary59 /// DEBUG调试信息60 /// /summary61 /// param namemsg日志信息/param62 /// param namelogName文件夹名称/param63 public static void Debug(string msg, string logName )64 {65 if (logName )66 {67 log.Debug(getDebugInfo() msg);68 }69 else if (logName log1Name)70 {71 log1.Debug(msg);72 }73 else if (logName log2Name)74 {75 log2.Debug(msg);76 }77 }78 /// summary79 /// Debug80 /// /summary81 /// param namemsg日志信息/param82 /// param nameexception错误信息/param83 public static void Debug(string msg, Exception exception)84 {85 log.Debug(getDebugInfo() msg, exception);86 }87 88 #endregion89 90 #region 02-INFO一般信息91 /// summary92 /// INFO一般信息93 /// /summary94 /// param namemsg日志信息/param95 /// param namelogName文件夹名称/param96 public static void Info(string msg, string logName )97 {98 if (logName )99 {
100 log.Info(getDebugInfo() msg);
101 }
102 else if (logName log1Name)
103 {
104 log1.Info(msg);
105 }
106 else if (logName log2Name)
107 {
108 log2.Info(msg);
109 }
110 }
111 /// summary
112 /// Info
113 /// /summary
114 /// param namemsg日志信息/param
115 /// param nameexception错误信息/param
116 public static void Info(string msg, Exception exception)
117 {
118 log.Info(getDebugInfo() msg, exception);
119 }
120 #endregion
121
122 #region 03-WARN警告
123 /// summary
124 ///WARN警告
125 /// /summary
126 /// param namemsg日志信息/param
127 /// param namelogName文件夹名称/param
128 public static void Warn(string msg, string logName )
129 {
130 if (logName )
131 {
132 log.Warn(getDebugInfo() msg);
133 }
134 else if (logName log1Name)
135 {
136 log1.Warn(msg);
137 }
138 else if (logName log2Name)
139 {
140 log2.Warn(msg);
141 }
142 }
143 /// summary
144 /// Warn
145 /// /summary
146 /// param namemsg日志信息/param
147 /// param nameexception错误信息/param
148 public static void Warn(string msg, Exception exception)
149 {
150 log.Warn(getDebugInfo() msg, exception);
151 }
152 #endregion
153
154 #region 04-ERROR一般错误
155 /// summary
156 /// ERROR一般错误
157 /// /summary
158 /// param namemsg日志信息/param
159 /// param namelogName文件夹名称/param
160 public static void Error(string msg, string logName )
161 {
162 if (logName )
163 {
164 log.Error(getDebugInfo() msg);
165 }
166 else if (logName log1Name)
167 {
168 log1.Error(msg);
169 }
170 else if (logName log2Name)
171 {
172 log2.Error(msg);
173 }
174 }
175 /// summary
176 /// Error
177 /// /summary
178 /// param namemsg日志信息/param
179 /// param nameexception错误信息/param
180 public static void Error(string msg, Exception exception)
181 {
182 log.Error(getDebugInfo() msg, exception);
183 }
184 #endregion
185
186 #region 05-FATAL(致命错误)
187 /// summary
188 /// FATAL(致命错误)
189 /// /summary
190 /// param namemsg日志信息/param
191 /// param namelogName文件夹名称/param
192 public static void Fatal(string msg, string logName )
193 {
194 if (logName )
195 {
196 log.Fatal(getDebugInfo() msg);
197 }
198 else if (logName log1Name)
199 {
200 log1.Fatal(msg);
201 }
202 else if (logName log2Name)
203 {
204 log2.Fatal(msg);
205 }
206 }
207 /// summary
208 /// Fatal
209 /// /summary
210 /// param namemsg日志信息/param
211 /// param nameexception错误信息/param
212 public static void Fatal(string msg, Exception exception)
213 {
214 log.Fatal(getDebugInfo() msg, exception);
215 }
216
217 #endregion
218
219
220
221 }
222 }