本次想在winform中用log4net,网上教程很多,但是也让我走了几下弯路。现记录详细使用步骤如下:
1、lot4net简介:
log4net(Log For Net)是Apache开源的应用于.Net框架的日志记录工具,详细信息参见Apache网站.它是针对Java的log4j(Log For Java的)姊妹工具.用过log4j的都知道,它功能强大,可配置性灵活,线程安全,对日志的输出管理和级别管理方便。使用log4net需要知道其中两个比较重要的概念:logger 和 appender。前者是日志记录对象,后者是日志记录的目标载体,包括控制台,文件,定量大小的文件,远程广播。log4net的工作原理简单地说是这样的:获得一个用来记录日志的工具对象logger,然后为logger对象指定日志的记录位置。值得一提的是这一切工作都可以在应用程序的配置文件中完成,所需代码量极少。
2、单项目配置
2.1、引用log4net.dll
两个方式:
a、在NuGet包管理器中安装
b、下载dll,引用
2.2、在app.config中添加配置
写在<configuration>节点内。具体配置信息见附录。
2.3、在Properties-->AssemblyInfo.cs文件中添加配置
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
2.4、创建LogHelper.cs,方便使用
具体类信息见附录。
2.5、在程序中使用,方式示例如下
log.Info("ft输出INfO信息");
log.Debug("ft输出Debug信息");
log.Warn("ft输出Warn信息");
log.Error("ft输出Error信息");
3、多项目配置
把LogHelper.cs提取出来公用,其它配置信息每个需要打印日志的项目还是都需要单独配置的。
4、全局异常捕获
在下面的连个事件中进行捕获(具体写法见附3):
①Application.ThreadException 事件--当UI线程中某个异常未被捕获时出现。
②AppDomain.UnhandledException 事件--当非UI线程中某个异常未被捕获时出现。
附1、在app.config中添加的配置信息
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="AdjustMeter.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<system.diagnostics>
<sources>
<!-- 本部分定义 My.Application.Log 的登录配置-->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog"/>
<!-- 取消以下部分的注释,以写入应用程序事件日志-->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"/>
<!-- 取消以下部分的注释,并用应用程序名替换 APPLICATION_NAME,以写入应用程序事件日志-->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<applicationSettings>
<AdjustMeter.My.MySettings>
<setting name="HL_Meter_WebReference_Service" serializeAs="String">
<value>http://172.16.23.63/webjmj/Service.asmx</value>
</setting>
</AdjustMeter.My.MySettings>
</applicationSettings>
<log4net>
<root>
<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
<!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录-->
<!--如果没有定义LEVEL的值,则缺省为DEBUG-->
<level value="ALL" />
<appender-ref ref="InfoAppender" />
<appender-ref ref="DebugAppender" />
<appender-ref ref="ErrorAppender" />
</root>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置-->
<file value="TermLog\\Frames\\"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyyMMdd'.txt'"/>
<staticLogFileName value="false"/>
<param name="MaxSizeRollBackups" value="100"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%t]Frames %c - %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="DEBUG" />
</filter>
</appender>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置-->
<file value="TermLog\\Error\\"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyyMMdd'.txt'"/>
<staticLogFileName value="false"/>
<param name="MaxSizeRollBackups" value="100"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%t]%-5p %c - %n%m%n%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
</log4net>
附录2、LogHelper.cs
public class LogHelper
{
private static readonly ILog logInfo = LogManager.GetLogger("Log");
private static readonly ILog logErr = LogManager.GetLogger("Err");
/// <summary>
/// 记录正常的消息
/// </summary>
/// <param name="msg">消息内容</param>
public static void info(string msg)
{
logInfo.Info(msg);
}
/// <summary>
/// 记录异常信息
/// </summary>
/// <param name="msg">异常信息内容</param>
public static void error(string msg)
{
StackTrace stackTrace = new StackTrace();
StackFrame stackFrame = stackTrace.GetFrame(1);
MethodBase methodBase = stackFrame.GetMethod();
logErr.Error("类名:" + methodBase.ReflectedType.Name + " 方法名:" + methodBase.Name + " 信息:" + msg);
}
附3、全局异常捕获
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Text;
using Common;
namespace testLog4N
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
BindExceptionHandler();//绑定程序中的异常处理
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
/// <summary>
/// 绑定程序中的异常处理
/// </summary>
private static void BindExceptionHandler()
{
//设置应用程序处理异常方式:ThreadException处理
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
//处理UI线程异常
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
//处理未捕获的异常
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
/// <summary>
/// 处理UI线程异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
LogHelper.ErrorLog(null, e.Exception as Exception);
}
/// <summary>
/// 处理未捕获的异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
LogHelper.ErrorLog(null, e.ExceptionObject as Exception);
}
}
}