.net 项目如何添加log4net日志记录

1、在项目根目录新建文件log4net.config,此文件中的节点解释还请自动百度。

文件实例:

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<!--日志-->
<log4net>
<logger name="logerror">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
</logger>
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
<logger name="logdata">
<level value="All" />
<appender-ref ref="DataBaseAppender" />
</logger>


<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<file value="logsError" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMddHH&quot;.log&quot;" />
<staticLogFileName value="false" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="logsInfo" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMddHH&quot;.log&quot;" />
<staticLogFileName value="false" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>

<!--定义输出到数据库-->
<appender name="DataBaseAppender" type="log4net.Appender.AdoNetAppender">
<!--日志缓存写入条数-->
<bufferSize value="0" />
<!--日志数据库连接串-->
<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
<connectionString value="Server=192.168.250.38;Port=3307;Database=datashar; User=root;Password=pass@word1;Charset=utf8mb4;SslMode=None" />
<!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.30319.33440, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Server=.;Database=Test; User=sa;Password=123;" />-->
<!--日志数据库脚本-->
<commandText value="INSERT INTO datashare_operatelog (ID,TableName,ColumnName,OldValue,NewValue,OperateType,OperateTime,OperateUserID,OperateUserName) VALUES (@ID,@TableName,@ColumnName,@OldValue,@NewValue,@OperateType,@OperateTime,@OperateUserID,@OperateUserName)" />
<!--主键ID-->
<parameter>
<parameterName value="@ID" />
<dbType value="String" />
<size value="36" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{ID}" />
</layout>
</parameter>
<!--表名TableName -->
<parameter>
<parameterName value="@TableName" />
<dbType value="String" />
<size value="255" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{TableName}" />
</layout>
</parameter>
<!--列名ColumnName -->
<parameter>
<parameterName value="@ColumnName" />
<dbType value="String" />
<size value="255" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{ColumnName}" />
</layout>
</parameter>
<!--旧值 OldValue -->
<parameter>
<parameterName value="@OldValue" />
<dbType value="String" />
<size value="2000" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OldValue}" />
</layout>
</parameter>
<!--新值 NewValue -->
<parameter>
<parameterName value="@NewValue" />
<dbType value="String" />
<size value="2000" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{NewValue}" />
</layout>
</parameter>
<!--操作类型OperateType -->
<parameter>
<parameterName value="@OperateType" />
<dbType value="String" />
<size value="255" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OperateType}" />
</layout>
</parameter>
<!--操作时间OperateTime -->
<parameter>
<parameterName value="@OperateTime" />
<dbType value="DateTime" />
<size value="6" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OperateTime}" />
</layout>
</parameter>
<!--操作人ID OperateUserID -->
<parameter>
<parameterName value="@OperateUserID" />
<dbType value="String" />
<size value="36" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OperateUserID}" />
</layout>
</parameter>
<!--操作人姓名OperateUserName -->
<parameter>
<parameterName value="@OperateUserName" />
<dbType value="String" />
<size value="255" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OperateUserName}" />
</layout>
</parameter>
</appender>

<!-- Setup the root category, add the appenders and set the default level -->
<root>
<!--发布时建议修改成 ERROR-->
<level value="ALL" />
<appender-ref ref="DataBaseAppender" />
</root>
</log4net>
</configuration>

2、找到项目的配置文件(App.config或者Web.config)添加以下代码

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</sectionGroup>
</configSections>
<log4net configSource="log4net.config" />

3、引用log4net.dll,如果没有可以通过nuget添加。

4、找到项目中的AssemblyInfo.cs文件  添加以下代码

//[assembly: log4net.Config.XmlConfigurator(Watch = true)]
//注意: ConfigFile 可以指定相对路径 和 绝对路径。 eg: /log/xxxx.log 或者 d://log//xxxx.log
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

5、如果是CS程序,在根目录的Program.cs中的Main方法中添加:

如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加:

添加以下代码

log4net.Config.XmlConfigurator.Configure();
var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
XmlConfigurator.ConfigureAndWatch(logCfg);
LogHelper.SetConfig(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));

6、新建一个文件LogHelper.cs,里面的代码如下:

public class LogHelper
{
//log4net日志专用
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
public static readonly log4net.ILog logedata = log4net.LogManager.GetLogger("logdata");

public static void SetConfig()
{
log4net.Config.XmlConfigurator.Configure();
}

/// <summary>
/// 设置log4net配置文件路径
/// </summary>
/// <param name="configFile">log4net配置文件路径</param>
public static void SetConfig(FileInfo configFile)
{
log4net.Config.XmlConfigurator.Configure(configFile);
}
/// <summary>
/// 普通的文件记录日志
/// </summary>
/// <param name="info"></param>
public static void WriteLog(string info)
{
loginfo.Info(" " + info + " ");
}
/// <summary>
/// 错误日志
/// </summary>
/// <param name="info"></param>
/// <param name="se"></param>
public static void WriteLog(string info, Exception ex)
{
logerror.Error(" " + info + " ", ex);
}

/// <summary>
/// 数据库日志
/// </summary>
/// <param name="Id">GUID</param>
/// <param name="tableName">表名称</param>
/// <param name="columnName">列名(可为空)</param>
/// <param name="oldValue">旧记录的Json字符串</param>
/// <param name="newValue">新纪录的 Json字符串</param>
/// <param name="operateType">操作类型(Update,Insert,Delete)</param>
/// <param name="operateTime">操作时间</param>
/// <param name="operateUserID">操作人ID</param>
/// <param name="operateUserName">操作人姓名</param>
public static void WriteLog(string Id, string tableName, string columnName, string oldValue, string newValue, string operateType, DateTime? operateTime, string operateUserID, string operateUserName)
{
bool d = logedata.IsInfoEnabled;
logedata.Info(new LogContent(Id, tableName, columnName, oldValue, newValue, operateType, operateTime, operateUserID, operateUserName));
}
}

7、新建文件LogContent.cs(这个文件主要为了写日志到数据库的),代码如下:

public class LogContent : IRequiresSessionState
{
public LogContent()
{

}

public LogContent(string Id, string tableName, string columnName, string oldValue, string newValue, string operateType, DateTime? operateTime, string operateUserID, string operateUserName)
{
ID = Id;
TableName = tableName;
ColumnName = columnName;
OldValue = oldValue;
NewValue = newValue;
OperateType = operateType;
OperateTime = operateTime;
OperateUserID = operateUserID;
OperateUserName = operateUserName;
}


/// <summary>
/// 主键ID
/// </summary>
public System.String ID { get; set; }

/// <summary>
/// 表名称
/// </summary>
public System.String TableName { get; set; }

/// <summary>
/// 列名
/// </summary>
public System.String ColumnName { get; set; }

/// <summary>
/// 旧值
/// </summary>
public System.String OldValue { get; set; }

/// <summary>
/// 新值
/// </summary>
public System.String NewValue { get; set; }

/// <summary>
/// 操作类型
/// </summary>
public System.String OperateType { get; set; }

/// <summary>
/// 操作时间
/// </summary>
public System.DateTime? OperateTime { get; set; }

/// <summary>
/// 操作人ID
/// </summary>
public System.String OperateUserID { get; set; }

/// <summary>
/// 操作人姓名
/// </summary>
public System.String OperateUserName { get; set; }
}

public class MyLayout : PatternLayout
{
public MyLayout()
{
this.AddConverter("property", typeof(LogInfoPatternConverter));
}
}

public class LogInfoPatternConverter : PatternLayoutConverter
{

protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (Option != null)
{
// Write the value for the specified key
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
}
else
{
// Write all the key value pairs
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
}
}
/// <summary>
/// 通过反射获取传入的日志对象的某个属性的值
/// </summary>
/// <param name="property"></param>
/// <returns></returns>

private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
{
object propertyValue = string.Empty;
PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
if (propertyInfo != null)
propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
return propertyValue;
}
}

8、上面7步完成之后就可以轻松愉快的调用写日志的方法了!

info:LogHelper.WriteLog("ListenStatus,DateTime:" + dateTime.ToString("yyyyMMddHHmmss"));

Error:LogHelper.WriteLog("ListenStatus,DateTime:" + dateTime.ToString("yyyyMMddHHmmss"),ex);

注意:log4net.config的属性设置:

原文地址:https://www.cnblogs.com/niuniu0108/p/11149841.html