一 引入背景
在软件开发周期中,无论是开发中,或是测试中,或是上线后,选择合适的工具监控程序的运行状态至关重要,只有如此,才能更好地排查程序问题和检测程序性能问题等。本篇文章主要与大家分享,如何利用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/
相关文章:
.NET Core log4net 使用
把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog
部署用于生产的Exceptionlees(一个强大易用的日志收集服务)
原文地址:https://www.cnblogs.com/wangjiming/p/8600935.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com