本文最后更新于 2024-05-07,文章可能存在过时内容,如有过时内容欢迎留言或者联系我进行反馈。

前言

开发工具:Visual Studio 2022

.NET版本:.NET Framework 4.7.2

log4net版本:2.0.15

教程

  1. 在NuGet中搜索“log4net”,安装最新稳定版本。

  2. 新建一个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&quot;.log&quot;" />
    			<!--文件创建的方式,这里是以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>
  3. 在“assemblyInfo.cs”中标注log4net的配置文件。

    //Log4net
    [assembly: XmlConfigurator(Watch = true, ConfigFileExtension = "config", ConfigFile = "Config\\Log4Net.config")]
  4. 新建一个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");
    
            /// <summary>信息</summary>
            /// <param name="msg"></param>
            public static void Info(string msg)
            {
                if (logAll.IsInfoEnabled)
                    logAll.Info(msg);
            }
    
            /// <summary>异常</summary>
            /// <param name="msg"></param>
            public static void Error(string msg)
            {
                if (logAll.IsErrorEnabled)
                    logAll.Error(msg);
            }
    
            /// <summary>调试</summary>
            /// <param name="msg"></param>
            public static void Debug(string msg)
            {
                if (logAll.IsDebugEnabled)
                    logAll.Debug(msg);
            }
    
            /// <summary>警告</summary>
            /// <param name="msg"></param>
            public static void Warn(string msg)
            {
                if (logAll.IsWarnEnabled)
                    logAll.Warn(msg);
            }
    
            #region 自定义消息格式输出
    
            /// <summary>调试</summary>
            /// <param name="methodBase"></param>
            /// <param name="added"></param>
            public static void Debug(MethodBase methodBase, string message)
            {
                if (logAll.IsErrorEnabled)
                {
                    string msg = $"在【{methodBase.DeclaringType.Namespace}】命名空间内有异常信息{Environment.NewLine}" +
                        $"类名:{methodBase.DeclaringType.FullName}{Environment.NewLine}" +
                        $"方法名:{methodBase.DeclaringType.Name}{Environment.NewLine}" +
                        $"调试信息:{message}{Environment.NewLine}";
                    Debug(msg);
                }
            }
    
            /// <summary>警告</summary>
            /// <param name="methodBase"></param>
            /// <param name="message"></param>
            public static void Warn(MethodBase methodBase, string message)
            {
                if (logAll.IsErrorEnabled)
                {
                    string msg = $"在【{methodBase.DeclaringType.Namespace}】命名空间内有警告信息{Environment.NewLine}" +
                        $"类名:{methodBase.DeclaringType.FullName}{Environment.NewLine}" +
                        $"方法名:{methodBase.DeclaringType.Name}{Environment.NewLine}" +
                        $"警告信息:{message}{Environment.NewLine}";
                    Warn(msg);
                }
            }
    
            /// <summary>异常</summary>
            /// <param name="methodBase"></param>
            /// <param name="error"></param>
            public static void Error(MethodBase methodBase, string error)
            {
                if (logAll.IsErrorEnabled)
                {
                    string msg = $"在【{methodBase.DeclaringType.Namespace}】命名空间内有异常信息{Environment.NewLine}" +
                        $"类名:{methodBase.DeclaringType.FullName}{Environment.NewLine}" +
                        $"方法名:{methodBase.DeclaringType.Name}{Environment.NewLine}" +
                        $"异常信息:{error}";
                    Error(msg);
                }
            }
    
            /// <summary>异常</summary>
            /// <param name="methodBase"></param>
            /// <param name="ex"></param>
            /// <param name="added"></param>
            public static void Error(MethodBase methodBase, Exception ex, string added = "NULL")
            {
                if (logAll.IsErrorEnabled)
                {
                    string msg = $"在【{methodBase.DeclaringType.Namespace}】命名空间内有异常信息{Environment.NewLine}" +
                        $"类名:{methodBase.DeclaringType.FullName}{Environment.NewLine}" +
                        $"方法名:{methodBase.DeclaringType.Name}{Environment.NewLine}" +
                        $"异常信息:{ex.Message}{Environment.NewLine}" +
                        $"堆栈跟踪:{Environment.NewLine}{ex.StackTrace}{Environment.NewLine}" +
                        $"补充说明:{added}";
                    Error(msg);
                }
            }
    
            #endregion 自定义消息格式输出
        }
    }

使用

private static void Main()
{
	try
	{
    	...

		LogUtil.Info("@小小笔记大大用处(https://blog.uptoz.cn)");
	}
	catch (Exception ex)
	{
    	LogUtil.Error(MethodBase.GetCurrentMethod(), ex);
	}
}