一 引入背景
在软件开发周期中,无论是开发中,或是测试中,或是上线后,选择合适的工具监控程序的运行状态至关重要,只有如此,才能更好地排查程序问题和检测程序性能问题等。本篇文章主要与大家分享,如何利用Log4net在项目中记录日志文件。在应用程序出现问题时,启用日志记录有助于解决问题。使用log4net,可以在运行时启用日志记录,而无需修改应用程序二进制文件。log4net是帮助程序员输出日志语句到各种输出目标的工具。
log4net支持如下框架:
- NET Standard 1.3 via .NET Core 1.0
- Microsoft® .NET Framework 1.0
- Microsoft .NET Framework 1.1
- Microsoft .NET Framework 2.0
- Microsoft .NET Framework 3.5
- Microsoft .NET Framework 4.0
- Microsoft .NET Framework 4.5
- Microsoft .NET Framework 3.5 Client Profile
- Microsoft .NET Framework 4.0 Client Profile
- Microsoft .NET Compact Framework 1.0
- Microsoft .NET Compact Framework 2.0
- Mono 1.0
- Mono 2.0
- Mono 3.5
- Mono 4.0
- Microsoft Shared Source CLI 1.0
- CLI 1.0 Compatible
二 log4net概述
(一)日志级别
1.级别归纳
2.级别比较
(1)级别从低=>高排序:ALL<Debug<Info<Warn<Error<Fatal<OFF
(2)日志不能记录低于最低级别的记录,如设置最低级别为Info,则低于Info的级别,都不能记录
code
测试结果
3.利用Filter过滤级别
除此之外,还能利用filter级别过滤,来设置将不同级别记录到相应文件,如将INFO级别信息记录到INFO文件中,将Error级别信息记录到Error文件中。
配置文件
后台代码
static void Main(string[] args) ???????{ ???????????//Log4net几种提错类型 ???????????//创建日志记录组件 ???????????ILog ?iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); ???????????try ???????????{ ???????????????iLog.Debug("Debug", new Exception("Debug")); ???????????????iLog.Info("Info", new Exception("Info")); ???????????????iLog.Warn("Warn", new Exception("Warn")); ???????????????iLog.Error("Error", new Exception("Error")); ???????????????iLog.Fatal("Fatal", new Exception("Fatal")); ???????????} ???????????catch (Exception ex) ???????????{ ???????????????throw new Exception(ex.Message); ???????????} ???????}
测试结果
(二)级别继承
级别继承很简单,归结为一句话:若本事设置了级别,则用自己的级别,若没设置级别,则继承离自己最近的级别。
例子1
例子2
例子3
例子4
(三)日志输出形式
1.输出文件形式归纳
2.项目中常用的输出形式
3.代码操作
3.1.在Root中定义日志输出媒介
<root> ?????<level value="ALL" /> ?????<!--定义日志的输出媒介,如下定义四种方式--> ?????<!--文件形式记录日志--> ?????<appender-ref ref="LogFileInfoAppender" /> ?????<!--<appender-ref ref="LogFileErrorAppender" />--> ?????<!--控制台显示日志--> ?????<appender-ref ref="ConsoleAppender" /> ?????<!--Windows事件日志--> ?????<appender-ref ref="EventLogAppender" /> ??????<!--数据库日志--> ?????<appender-ref ref="AdoNetAppender_Oracle" /></root>
3.2.配置具体的媒介,如下以文件形式为例
<!--定义输出到文件中--> ???<appender name="LogFileInfoAppender" type="log4net.Appender.FileAppender"> ?????<!--定义文件存放位置--> ?????<file value="E:/Log/log4netInfoLog.txt" /> ?????<appendToFile value="true" /> ?????<rollingStyle value="Date" /> ?????<datePattern value="yyyyMMdd-HH:mm:ss" /> ?????<!---定义布局模板--> ?????<layout type="log4net.Layout.PatternLayout"> ???????<!--每条日志末尾的文字说明--> ???????<footer value="by Alan_beijing" /> ???????<!--输出格式--> ???????<!--样例:2008-03-26 13:42:32,111 [10] INFO ?Log4NetDemo.MainClass [(null)] - info--> ???????<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline ???????????????????????????日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" /> ?????</layout> ???</appender>
3.3.后台代码
class Program ???{ ???????static void Main(string[] args) ???????{ ???????????//Log4net几种提错类型 ???????????//创建日志记录组件 ???????????ILog ?iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); ???????????try ???????????{ ???????????????iLog.Debug("Debug", new Exception("Debug")); ???????????????iLog.Info("Info", new Exception("Info")); ???????????????iLog.Warn("Warn", new Exception("Warn")); ???????????????iLog.Error("Error", new Exception("Error")); ???????????????iLog.Fatal("Fatal", new Exception("Fatal")); ???????????} ???????????catch (Exception ex) ???????????{ ???????????????throw new Exception(ex.Message); ???????????} ???????} ???}
3.4.测试结果
(四)定义日志输出格式
1.常用输出格式归纳
2.code及测试结果
三 代码实例
本示例是基于VS2017控制条程序写的。
1.后台
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using log4net;using System.Reflection;[assembly: log4net.Config.XmlConfigurator(Watch = true)]namespace Log4netDemo{ ???class Program ???{ ???????static void Main(string[] args) ???????{ ???????????//Log4net几种提错类型 ???????????//创建日志记录组件 ???????????ILog ?iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); ???????????try ???????????{ ???????????????iLog.Debug("Debug", new Exception("Debug")); ???????????????iLog.Info("Info", new Exception("Info")); ???????????????iLog.Warn("Warn", new Exception("Warn")); ???????????????iLog.Error("Error", new Exception("Error")); ???????????????iLog.Fatal("Fatal", new Exception("Fatal")); ???????????} ???????????catch (Exception ex) ???????????{ ???????????????throw new Exception(ex.Message); ???????????} ???????} ???}}
2.配置文件
<?xml version="1.0" encoding="utf-8" ?><configuration> ?<!--声明自定义节点--> ?<configSections> ???<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> ?</configSections> ?<appSettings> ?</appSettings> ?<log4net> ???<root> ?????<!--<level value="Info" />--> ?????<level value="ALL" /> ?????<!--定义日志的输出媒介,如下定义四种方式--> ?????<!--文件形式记录日志--> ?????<!--<appender-ref ref="LogFile_MinLevel_Info" />--> ?????<appender-ref ref="LogFileInfoAppender" /> ?????<appender-ref ref="LogFileErrorAppender" /> ?????<!--控制台显示日志--> ?????<!--<appender-ref ref="ConsoleAppender" />--> ?????<!--Windows事件日志--> ?????<!--<appender-ref ref="EventLogAppender" />--> ??????<!--数据库日志--> ?????<!--<appender-ref ref="AdoNetAppender_Oracle" />--> ???</root> ???<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)--> ???<logger name="log4netLevel"> ?????<!--<level value="ALL" /> ?????<level value="DEBUG" />--> ?????<!--<level value="INFO" />--> ?????<!--<level value="WARN" /> ?????<level value="ERROR" />--> ?????<!--<level value="FATAL" /> ?????<level value="OFF" />--> ???</logger> ???<!--定义输出到文件中--> ???<!--<appender name="LogFile_MinLevel_Info" type="log4net.Appender.FileAppender">--> ???<appender name="LogFileInfoAppender" type="log4net.Appender.FileAppender"> ?????<!--定义文件存放位置--> ?????<file value="E:/Log/log4netLogFile_Info.txt" /> ?????<appendToFile value="true" /> ?????<rollingStyle value="Date" /> ?????<datePattern value="yyyyMMdd-HH:mm:ss" /> ?????<!---定义布局模板--> ?????<layout type="log4net.Layout.PatternLayout"> ???????<!--每条日志末尾的文字说明--> ???????<footer value="by Alan_beijing" /> ???????<!--输出格式--> ???????<!--样例:2008-03-26 13:42:32,111 [10] INFO ?Log4NetDemo.MainClass [(null)] - info--> ???????<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline ???????????????????????????日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" /> ?????</layout> ?????<filter type="log4net.Filter.LevelRangeFilter"> ???????<param name="LevelMin" value="Info" /> ???????<param name="LevelMax" value="Info" /> ?????</filter> ???</appender> ???<appender name="LogFileErrorAppender" type="log4net.Appender.FileAppender"> ?????<!--定义文件存放位置--> ?????<file value="E:/Log/llog4netLogFile_Error.txt" /> ?????<appendToFile value="true" /> ?????<rollingStyle value="Date" /> ?????<datePattern value="yyyyMMdd-HH:mm:ss" /> ?????<!--最大文件大小--> ?????<maximumFileSize value="10MB" /> ?????<staticLogFileName value="false"/> ?????<!---定义布局模板--> ?????<layout type="log4net.Layout.PatternLayout"> ???????<!--每条日志末尾的文字说明--> ???????<footer value="by Alan_beijing" /> ???????<!--输出格式--> ???????<!--样例:2008-03-26 13:42:32,111 [10] INFO ?Log4NetDemo.MainClass [(null)] - info--> ???????<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline ???????????????????????????日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" /> ?????</layout> ????????????<filter type="log4net.Filter.LevelRangeFilter"> ???????<param name="LevelMin" value="Error" /> ???????<param name="LevelMax" value="Error" /> ?????</filter> ???</appender> ???<!--定义输出到控制台命令行中--> ???<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> ?????<layout type="log4net.Layout.PatternLayout"> ???????<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> ?????</layout> ???</appender> ???<!--定义输出到windows事件中--> ???<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> ?????<layout type="log4net.Layout.PatternLayout"> ???????<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> ?????</layout> ???</appender> ???<!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb--> ???<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> ?????<connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" /> ?????<commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> ?????<!--定义各个参数--> ?????<parameter> ???????<parameterName value="@logDate" /> ???????<dbType value="String" /> ???????<size value="240" /> ???????<layout type="log4net.Layout.PatternLayout"> ?????????<conversionPattern value="%date" /> ???????</layout> ?????</parameter> ?????<parameter> ???????<parameterName value="@thread" /> ???????<dbType value="String" /> ???????<size value="240" /> ???????<layout type="log4net.Layout.PatternLayout"> ?????????<conversionPattern value="%thread" /> ???????</layout> ?????</parameter> ?????<parameter> ???????<parameterName value="@logLevel" /> ???????<dbType value="String" /> ???????<size value="240" /> ???????<layout type="log4net.Layout.PatternLayout"> ?????????<conversionPattern value="%level" /> ???????</layout> ?????</parameter> ?????<parameter> ???????<parameterName value="@logger" /> ???????<dbType value="String" /> ???????<size value="240" /> ???????<layout type="log4net.Layout.PatternLayout"> ?????????<conversionPattern value="%logger" /> ???????</layout> ?????</parameter> ?????<parameter> ???????<parameterName value="@message" /> ???????<dbType value="String" /> ???????<size value="240" /> ???????<layout type="log4net.Layout.PatternLayout"> ?????????<conversionPattern value="%message" /> ???????</layout> ?????</parameter> ???</appender> ?</log4net> ?<startup> ????????<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> ???</startup></configuration>
四 推荐链接
【01】http://logging.apache.org/log4net/
五 服务区
有喜欢的朋友,可以看一下,不喜欢的的朋友,勿喷,谢谢!!
浅谈Log4net在项目中如何记录日志
原文地址:https://www.cnblogs.com/wangjiming/p/8600935.html