编辑
2025-09-25
C#
00

目录

摘要
正文

摘要

log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。

正文

最常用的日志记录需求

  1. 日志文件保存到项目启动目录下的logs文件夹
  2. 以天为单位进行日志文件的保存

通过NuGet直接搜索log4net进行安装

image.png

项目下右键新建log4net.config文件

image.png

设置总是copy

image.png

log4net.config文件

XML
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!--配置节点--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <!--日志路径--> <param name="File" value="Log\\Info\\" /> <!--是否是向文件中追加日志--> <param name="AppendToFile" value="true" /> <!--log保留天数--> <param name="MaxSizeRollBackups" value="30" /> <!--log文件大小--> <param name="maximumFileSize" value="100MB"/> <!--日志文件名是否是固定不变的--> <param name="StaticLogFileName" value="false" /> <!--日志文件名格式为:2008-08-31.log--> <param name="DatePattern" value="yyyyMMdd'.html'" /> <!--日志根据日期滚动--> <param name="RollingStyle" value="Composite" /> <!--最小锁定模型以允许多个进程可以写入同一个文件--> <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> <!--错误日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="&lt;HR COLOR=rreen&gt;%n异常时间:%d [%t] &lt;BR&gt;%n异常级别:%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" /> </layout> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="INFO" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> </appender> <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"> <!--日志路径--> <param name="File" value="Log\\Debug\\" /> <!--是否是向文件中追加日志--> <param name="AppendToFile" value="true" /> <!--log保留天数--> <param name="MaxSizeRollBackups" value="30" /> <!--log文件大小--> <param name="maximumFileSize" value="100MB"/> <!--日志文件名是否是固定不变的--> <param name="StaticLogFileName" value="false" /> <!--日志文件名格式为:20230101.log--> <param name="DatePattern" value="yyyyMMdd'.html'" /> <!--日志根据日期滚动--> <param name="RollingStyle" value="Composite" /> <!--最小锁定模型以允许多个进程可以写入同一个文件--> <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> <!--错误日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="&lt;HR COLOR=blue&gt;%n异常时间:%d [%t] &lt;BR&gt;%n异常级别:%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" /> </layout> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="DEBUG" /> </filter> <filter type="log4net.Filter.DenyAllFilter" /> </appender> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <!--日志路径--> <param name="File" value="Log\\Error\\" /> <!--是否是向文件中追加日志--> <param name="AppendToFile" value="true" /> <!--log保留天数--> <param name="MaxSizeRollBackups" value="30" /> <!--log文件大小--> <param name="maximumFileSize" value="100MB"/> <!--日志文件名是否是固定不变的--> <param name="StaticLogFileName" value="false" /> <!--日志文件名格式为:2008-08-31.log--> <param name="DatePattern" value="yyyyMMdd'.html'" /> <!--日志根据日期滚动--> <param name="RollingStyle" value="Composite" /> <!--最小锁定模型以允许多个进程可以写入同一个文件--> <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> <!--错误日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n异常时间:%d [%t] &lt;BR&gt;%n异常级别:%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="WARN" /> <levelMax value="FATAL"/> </filter> </appender> <root> <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --> <!--系统上线初期或发生异常可将此Level设定为DEBUG或ALL--> <level value="ALL" /> <appender-ref ref="InfoAppender" /> <appender-ref ref="DebugAppender" /> <appender-ref ref="ErrorAppender" /> </root> </log4net> </configuration>

输出的日志消息
%n(newline)  //换行
%d(datetime)  //输出当前语句运行的时刻
%r(runtime)  //输出程序执行到当前消耗的毫秒数
%t(threadid)  //当前语句所在的线程ID
%p(priority)  //日志的当前日志级别
%c(class)  //当前日志对象的名称
%L  //输出语句所在的行号
%F  //输出语句所在的文件名
%-10  //最小长度为10,不够空格填充

LogHelper类

C#
/// <summary> /// Log4Net日志记录类 /// </summary> public class LogHelper { private static readonly ILog Log; static LogHelper() { XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4net.config")); Log = LogManager.GetLogger(typeof(LogHelper)); } /// <summary> /// 记录调试信息 /// </summary> /// <param name="message">信息</param> public static void Debug(object message) { Log.Debug(message); } /// <summary> /// 记录警告信息 /// </summary> /// <param name="message">信息</param> public static void Warn(object message) { Log.Warn(message); } /// <summary> /// 记录错误信息 /// </summary> /// <param name="message">信息</param> public static void Error(object message) { Log.Error(message); } /// <summary> /// 记录重要提示信息 /// </summary> /// <param name="message">信息</param> public static void Info(object message) { Log.Info(message); } /// <summary> /// 记录信息和异常信息 /// </summary> /// <param name="message">错误信息</param> /// <param name="ex">异常对象</param> public static void Debug(object message, Exception ex) { Log.Debug(message, ex); } /// <summary> /// 记录信息和异常信息 /// </summary> /// <param name="message">错误信息</param> /// <param name="ex">异常对象</param> public static void Warn(object message, Exception ex) { Log.Warn(message, ex); } /// <summary> /// 记录信息和异常信息 /// </summary> /// <param name="message">错误信息</param> /// <param name="ex">异常对象</param> public static void Error(object message, Exception ex) { Log.Error(message, ex); } /// <summary> /// 记录信息和异常信息 /// </summary> /// <param name="message">错误信息</param> /// <param name="ex">异常对象</param> public static void Info(object message, Exception ex) { Log.Info(message, ex); } }

保存到数据表

image.png

修改配制文件

在.net6环境下需要nuget安装System.Data.SqlClient

XML
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--注册Appender--> <root> <level value="ALL" /> <appender-ref ref="AdoNetAppender" /> </root> <!--配置Appender--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="-1" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="data source=idio-002;initial catalog=bzscada;persist security info=True;user id=sa;password=123;MultipleActiveResultSets=True;" /> <commandText value="INSERT INTO sys_log ([Createddate],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@createddate, @thread, @log_level, @logger, @message, @exception)" /> <parameter> <parameterName value="@createddate" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </appender> </log4net> </configuration>

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!