【CSharp】使用log4net输出程序日志
本文最后更新于 2024-05-07,文章可能存在过时内容,如有过时内容欢迎留言或者联系我进行反馈。
前言
开发工具:Visual Studio 2022
.NET版本:.NET Framework 4.7.2
log4net版本:2.0.15
教程
在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"); /// <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);
}
}
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果