记录下log4net日志框架在项目中的使用:
1.通过Nuget安装Log4net程序包
2.添加配置文件,配置日志记录的格式等信息
log4net.config配置信息如下:
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<!--type表示用什么类型记录日志 ADONetAppender代表用数据库记录-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<!--日志缓存写入条数 如果为0则立刻写入数据库-->
<bufferSize value="0"/>
<!--日志数据库连接串-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<!--数据库连接字符串-->
<connectionString value="Data Source=.;Initial Catalog=stuDb;User ID=sa;password=123456"/>
<!--日志数据库脚本-->
<commandText value="insert into LogDetails (LogDate,LogLevel,Thread,Logger,LogMessage) values (@log_date,@log_level,@thread,@logger,@message)"/>
<!--日志时间 RawTimeStampLayout是log4net提供的参数-->
<parameter>
<parameterName value="@log_date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<!--日志级别-->
<parameter>
<parameterName value="@log_level"/>
<dbType value="String"/>
<size value="20"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<!--线程ID-->
<parameter>
<parameterName value="@thread"/>
<dbType value="String"/>
<size value="100"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<!--日志名称-->
<parameter>
<parameterName value="@logger"/>
<dbType value="String"/>
<size value="500"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<!--日志内容-->
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="3000"/>
<layout type="Log4NetToSqlServer.Utility.CustomLayout">
<conversionPattern value="%property{Message}" />
</layout>
</parameter>
</appender>
<root>
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
配置信息中,日志数据库连接串的参数配置,比如版本号和公钥,可以去对应的程序集中查看。查看方法:
日志内容字段,@message参数的值是自定义的,指的是要记录的日志内容,参数值从调用的地方传入。(Log4NetToSqlServer.Utility.CustomLayout类是需要自己创建的,具体代码在下面第三步中)
其他字段都是直接从log4net封装好的log4net.Layout.PatternLayout类中获取。
记得要将新建的log4net.config文件设置为始终复制,这一步很关键,如果不设置,程序在运行时会找不到这个配置文件。
上面配置文件中使用的是SqlServer数据库,其他数据库的配置可以参考:http://logging.apache.org/log4net/release/config-examples.html
3.封装自定义字段传值所需要的方法
首先在项目中创建Utility文件夹,用于存放相关帮助类的代码。
接下来要创建下面四个类:
CustomLayout.cs
public class CustomLayout : PatternLayout
{
//构造函数 把指定的需要写入数据库的字段添加进来
public CustomLayout()
{
this.AddConverter("property", typeof(LogInfoPatternConverter));
}
}
LogContent.cs
public class LogContent
{
public LogContent(string message)
{
Message = message;
}
/// <summary>
/// 日志描述信息
/// </summary>
public string Message { get; set; }
}
LogHelper.cs
public class LogHelper
{
public static readonly ILog ilog = LogManager.GetLogger("TestDataBase.Log");
public static void Info(LogContent content)
{
ilog.Info(content);
}
public static void Error(LogContent content, Exception ex)
{
ilog.Error(content, ex);
}
public static void Warn(LogContent content)
{
ilog.Warn(content);
}
public static void Fatal(LogContent content)
{
ilog.Fatal(content);
}
public static void Debug(LogContent content)
{
ilog.Debug(content);
}
}
LogInfoPatternConverter.cs
public class LogInfoPatternConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
if (Option != null)
{
//写入指定键的值
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
}
else
{
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
}
}
/// <summary>
/// 通过反射获取传入的日志对象的某个属性值
/// </summary>
/// <returns></returns>
private object LookupProperty(string property, LoggingEvent loggingEvent)
{
object propertyValue = string.Empty;
PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
if (propertyInfo != null)
{
propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
}
return propertyValue;
}
}
上面代码实现了对log4net.config配置文件中@message字段的参数传递功能。
如果要加其他自定义参数字段,可以直接在LogContent.cs中添加字段即可,比如要记录‘操作人姓名’,可以修改代码为:
同时需要在log4net.config中修改sql语句和增加对应的配置节点:
4.编辑项目中Properties文件夹中的Assemblyinfo.cs(AssemblyInfo.cs是在创建项目时自动生成的,主要用来设定生成的有关程序集的常规信息dll文件的一些参数)
在 Assemblyinfo.cs的最下面,添加如下代码:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Configs\\log4net.config", Watch = true)]
作用是通过反射,全局注册配置,指定读取log4net的配置文件。
5.在数据库中新增日志表:
create table LogDetails(
logID int identity(1,1) not null,
LogDate datetime not null,
LogLevel nvarchar(20) not null,
Thread nvarchar(20) not null,
Logger nvarchar(20) not null,
LogMessage nvarchar(3000) not null,
constraint PK_LogDetails primary key NONCLUSTERED (
logID asc
)
)
6.写不同等级的日志
启动程序,可以看到数据库中日志表记录了相关日志信息。
除了往数据库记录日志外,也可以把日志记录在文本中,可以参考:https://blog.csdn.net/liangmengbk/article/details/117187410