本文最后更新于 2024-05-07,文章可能存在过时内容,如有过时内容欢迎留言或者联系我进行反馈。
前言 {#%E5%89%8D%E8%A8%80}
开发工具:Visual Studio 2022
.NET版本:.NET Framework 4.7.2
log4net版本:2.0.15
教程 {#%E6%95%99%E7%A8%8B}
-
在NuGet中搜索"log4net",安装最新稳定版本。
-
新建一个config配置文件,命名为"Log4Net.config",文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- Level的级别,由高到低 --> <!-- None > Fatal > ERROR > WARN > DEBUG > INFO > ALL--> <!-- 解释:如果level是ERROR,则在cs文件里面调用log4net的info()方法,则不会写入到日志文件中--> <!--所有日志类--> <log4net> <!--日志类的名字--> <logger name="LogAll"> <!--定义记录的日志级别--> <level value="ALL" /> <!--记录到哪个介质中去--> <appender-ref ref="AllAppender" /> </logger> <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质--> <appender name="AllAppender" type="log4net.Appender.RollingFileAppender"> <!--允许多个进程读取日志文件--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--日志输出到exe程序这个相对目录下--> <param name="File" value="Log\\" /> <!--输出的日志不会覆盖以前的信息--> <param name="AppendToFile" value="true" /> <!--备份文件的个数--> <param name="MaxSizeRollBackups" value="100" /> <!--当个日志文件的最大大小--> <param name="MaxFileSize" value="10240" /> <!--是否使用静态文件名--> <param name="StaticLogFileName" value="false" /> <!--日志文件名--> <param name="DatePattern" value="yyyyMMdd".log"" /> <!--文件创建的方式,这里是以Date方式创建--> <param name="RollingStyle" value="Date" /> <!--错误日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%n%d [%t] %p - %m%n" /> </layout> </appender> </log4net> </configuration>
-
在"assemblyInfo.cs"中标注log4net的配置文件。
//Log4net [assembly: XmlConfigurator(Watch = true, ConfigFileExtension = "config", ConfigFile = "Config\\Log4Net.config")]
-
新建一个Class,命名为"LogUtil.cs",内容如下:
using System; using log4net; using System.Linq; using System.Text; using System.Reflection; using System.Threading.Tasks; using System.Collections.Generic;
namespace Common { public class LogUtil { public static readonly ILog logAll = LogManager.GetLogger("LogAll");
/// &lt;summary&gt;信息&lt;/summary&gt; /// &lt;param name="msg"&gt;&lt;/param&gt; public static void Info(string msg) { if (logAll.IsInfoEnabled) logAll.Info(msg); }
/// &amp;lt;summary&amp;gt;异常&amp;lt;/summary&amp;gt; /// &amp;lt;param name=&quot;msg&quot;&amp;gt;&amp;lt;/param&amp;gt; public static void Error(string msg) { if (logAll.IsErrorEnabled) logAll.Error(msg); } /// &amp;lt;summary&amp;gt;调试&amp;lt;/summary&amp;gt; /// &amp;lt;param name=&quot;msg&quot;&amp;gt;&amp;lt;/param&amp;gt; public static void Debug(string msg) { if (logAll.IsDebugEnabled) logAll.Debug(msg); } /// &amp;lt;summary&amp;gt;警告&amp;lt;/summary&amp;gt; /// &amp;lt;param name=&quot;msg&quot;&amp;gt;&amp;lt;/param&amp;gt; public static void Warn(string msg) { if (logAll.IsWarnEnabled) logAll.Warn(msg); } #region 自定义消息格式输出 /// &amp;lt;summary&amp;gt;调试&amp;lt;/summary&amp;gt; /// &amp;lt;param name=&quot;methodBase&quot;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&quot;added&quot;&amp;gt;&amp;lt;/param&amp;gt; public static void Debug(MethodBase methodBase, string message) { if (logAll.IsErrorEnabled) { string msg = $&quot;在【{methodBase.DeclaringType.Namespace}】命名空间内有异常信息{Environment.NewLine}&quot; + $&quot;类名:{methodBase.DeclaringType.FullName}{Environment.NewLine}&quot; + $&quot;方法名:{methodBase.DeclaringType.Name}{Environment.NewLine}&quot; + $&quot;调试信息:{message}{Environment.NewLine}&quot;; Debug(msg); } } /// &amp;lt;summary&amp;gt;警告&amp;lt;/summary&amp;gt; /// &amp;lt;param name=&quot;methodBase&quot;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&quot;message&quot;&amp;gt;&amp;lt;/param&amp;gt; public static void Warn(MethodBase methodBase, string message) { if (logAll.IsErrorEnabled) { string msg = $&quot;在【{methodBase.DeclaringType.Namespace}】命名空间内有警告信息{Environment.NewLine}&quot; + $&quot;类名:{methodBase.DeclaringType.FullName}{Environment.NewLine}&quot; + $&quot;方法名:{methodBase.DeclaringType.Name}{Environment.NewLine}&quot; + $&quot;警告信息:{message}{Environment.NewLine}&quot;; Warn(msg); } } /// &amp;lt;summary&amp;gt;异常&amp;lt;/summary&amp;gt; /// &amp;lt;param name=&quot;methodBase&quot;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&quot;error&quot;&amp;gt;&amp;lt;/param&amp;gt; public static void Error(MethodBase methodBase, string error) { if (logAll.IsErrorEnabled) { string msg = $&quot;在【{methodBase.DeclaringType.Namespace}】命名空间内有异常信息{Environment.NewLine}&quot; + $&quot;类名:{methodBase.DeclaringType.FullName}{Environment.NewLine}&quot; + $&quot;方法名:{methodBase.DeclaringType.Name}{Environment.NewLine}&quot; + $&quot;异常信息:{error}&quot;; Error(msg); } } /// &amp;lt;summary&amp;gt;异常&amp;lt;/summary&amp;gt; /// &amp;lt;param name=&quot;methodBase&quot;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&quot;ex&quot;&amp;gt;&amp;lt;/param&amp;gt; /// &amp;lt;param name=&quot;added&quot;&amp;gt;&amp;lt;/param&amp;gt; public static void Error(MethodBase methodBase, Exception ex, string added = &quot;NULL&quot;) { if (logAll.IsErrorEnabled) { string msg = $&quot;在【{methodBase.DeclaringType.Namespace}】命名空间内有异常信息{Environment.NewLine}&quot; + $&quot;类名:{methodBase.DeclaringType.FullName}{Environment.NewLine}&quot; + $&quot;方法名:{methodBase.DeclaringType.Name}{Environment.NewLine}&quot; + $&quot;异常信息:{ex.Message}{Environment.NewLine}&quot; + $&quot;堆栈跟踪:{Environment.NewLine}{ex.StackTrace}{Environment.NewLine}&quot; + $&quot;补充说明:{added}&quot;; Error(msg); } } #endregion 自定义消息格式输出
}
}
使用 {#%E4%BD%BF%E7%94%A8}
private static void Main()
{
try
{
...
LogUtil.Info("@小小笔记大大用处(https://blog.uptoz.cn)");
}
catch (Exception ex)
{
LogUtil.Error(MethodBase.GetCurrentMethod(), ex);
}
}