好处也不多说,主要就是方便维护程序,做个简单的使用方法介绍:
Log4net的结构
log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).
每个组件的功能,请搜索网络,应该是铺天盖地的多,如果只是简单的维护,无需了解过多。
Log4net的安装:
用户可以从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net.sln载入Visual Studio .NET,编译后可以得到log4net.dll。用户要在自己的程序里加入日志功能,只需将log4net.dll引入工程即可。
Log4net的配置:
配置信息可以放在如下几种形式文件的一种中。
在程序的配置文件里,如AssemblyName.config 或web.config.
对应是winform或是asp.net
<?xml version= "1.0" encoding= "utf-8" ?> <configuration> <configSections> <section name= "log4net" type= "System.Configuration.IgnoreSectionHandler" /> </configSections> <log4net> <!--定义输出到文件中--> <appender name= "LogFileAppender" type= "log4net.Appender.FileAppender" > <!--定义文件存放位置--> <file value= "log4netfile.txt" /> <appendToFile value= "true" /> <rollingStyle value= "Date" /> <datePattern value= "yyyyMMdd-HH:mm:ss" /> <layout type= "log4net.Layout.PatternLayout" > <!--每条日志末尾的文字说明--> <footer value= "==========================================================-" /> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [( null )] - info--> <conversionPattern value= "%n记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n出错类:%logger property:[%property{NDC}] %n错误描述:%n%message%n" /> </layout> </appender> <!--定义输出到控制台命令行中--> <appender name= "ConsoleAppender" type= "log4net.Appender.ConsoleAppender" > <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定义输出到windows事件中--> <appender name= "EventLogAppender" type= "log4net.Appender.EventLogAppender" > <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb--> <appender name= "AdoNetAppender_Access" type= "log4net.Appender.AdoNetAppender" > <connectionString value= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" /> <commandText value= "INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> <!--定义各个参数--> <parameter> <parameterName value= "@logDate" /> <dbType value= "String" /> <size value= "240" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%date" /> </layout> </parameter> <parameter> <parameterName value= "@thread" /> <dbType value= "String" /> <size value= "240" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%thread" /> </layout> </parameter> <parameter> <parameterName value= "@logLevel" /> <dbType value= "String" /> <size value= "240" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%level" /> </layout> </parameter> <parameter> <parameterName value= "@logger" /> <dbType value= "String" /> <size value= "240" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%logger" /> </layout> </parameter> <parameter> <parameterName value= "@message" /> <dbType value= "String" /> <size value= "240" /> <layout type= "log4net.Layout.PatternLayout" > <conversionPattern value= "%message" /> </layout> </parameter> </appender> <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。--> <root> <!--文件形式记录日志--> <appender- ref ref = "LogFileAppender" /> <!--控制台控制显示日志--> <appender- ref ref = "ConsoleAppender" /> <!--Windows事件日志--> <appender- ref ref = "EventLogAppender" /> <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉 <appender- ref ref = "AdoNetAppender_Access" /> --> </root> </log4net> </configuration> |
在AssemblyInfo.cs中加入
[assembly: log4net.Config.XmlConfigurator()]
Log4net的使用:
主要是在每个try{}catch{}中使用,当然懒人用法,就是搞个全局的。
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Windows.Forms; namespace WindowsFormsApplication2 { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { //处理未捕获的异常 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //处理UI线程异常 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //处理非UI线程异常 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault( false ); Application.Run( new Form1()); } static void Application_ThreadException( object sender, System.Threading.ThreadExceptionEventArgs e) { Exception error = e.Exception as Exception; log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); log.Info(error.StackTrace); } static void CurrentDomain_UnhandledException( object sender, UnhandledExceptionEventArgs e) { Exception error = e.ExceptionObject as Exception; log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); log.Info(error.StackTrace); } } } |
大功告成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现