在wpf中使用log4net.dll保存日志有两种方法,一种是在App.config文件中设置log4net保存属性,第二种是使用本地log4net配置文件。以下是两种方法的详细描述
- 方法一,使用App.config配置
1.1 在nuget中添加log4net.dll
1.2 在configuration中添加以下代码
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="DateFileAppender" type="log4net.Appender.RollingFileAppender">
<!-- 相对路径:Logs 目录 -->
<file value="Logs\log-" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyy-MM-dd".txt"" /><!--日志文件格式为日期.txt-->
<staticLogFileName value="false" /><!--是否为绝对路径-->>
<maxSizeRollBackups value="10" /><!--每天最多10个备份文件--><!--比如只保留30天的log文件,必须用代码删除-->
<maximumFileSize value="10MB" /><!--每个文件最大15兆-->>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="DateFileAppender" />
</root>
</log4net>
<appSettings>
<add key="log4net.Internal.Debug" value="true" />
</appSettings>
关键参数含义可以看后面的备注
1.3 新建一个LogBase类用于专门写日志文件
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
namespace Motion
{
public class LogBase
{
private static ILog _log;
public static ILog Log
{
get
{
if (_log == null)
{
log4net.Config.XmlConfigurator.Configure(LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()));//使用App.Config中的日志配置信息
//log4net.Config.XmlConfigurator.Configure(new FileInfo("Log4Net.config"));//使用Log4Net.config中的配置
_log = LogManager.GetLogger(typeof(App));
_log.Info("Log初始化成功");
}
return _log;
}
}
//public LogBase()
//{
//}
//public static readonly ILog Log = LogManager.GetLogger("RollingLogFileAppender");
//public static readonly ILog Log = LogManager.GetLogger(typeof(App));
// log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
//ALL 最低等级的,用于打开所有日志记录。
//DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
//INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,
//WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
//ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
//FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
//TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。
//OFF 最高等级的,用于关闭所有日志记录。
//如果将log level设置在某一个级别上,那么比此级别优先级高的log都能打印出来。例如,如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出,而INFO、DEBUG、TRACE、 ALL级别的log则会被忽略。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
#region DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
public static void debug(string write)
{
Log.Debug("日志记录:" + write);
}
public static void debug(string write, Exception ex)
{
Log.Debug("日志记录:" + write + "。错误记载:" + ex.ToString());
}
#endregion
#region INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,
/// <summary>
/// 1
/// </summary>
/// <param name="write"></param>
public static void Info(string write)
{
Log.Info("日志记录:" + write);
}
public static void Info(string write, Exception ex)
{
Log.Info("日志记录:" + write + "。错误记载:" + ex.ToString());
}
#endregion
#region WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。,可以使用这个级别。
public static void warn(string write)
{
Log.Warn("日志记录:" + write);
}
public static void warn(string write, Exception ex)
{
Log.Warn("日志记录:" + write + "。错误记载:" + ex.ToString());
}
#endregion
#region ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
public static void error(string write)
{
Log.Error("日志记录:" + write);
}
public static void error(string write, Exception ex)
{
Log.Error("日志记录:" + write + "。错误记载:" + ex.ToString());
}
#endregion
#region FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
public static void fatal(string write)
{
Log.Fatal("日志记录:" + write);
}
public static void fatal(string write, Exception ex)
{
Log.Fatal("日志记录:" + write + "。错误记载:" + ex.ToString());
}
//#endregion
#endregion
}
}
注意代码中的第19行
log4net.Config.XmlConfigurator.Configure(LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()));//表示从当前 WPF 应用的 App.config 中加载 log4net 的配置,并将其应用到日志系统中。
1.4使用
LogBase.Info(info);//常规日志
LogBase.error(info);//错误日志
LogBase.warn(info);//警告日志
- 方法二,使用本地配置
2.1 参考上面的1.1添加dll
2.2 在程序的debug目录新建Log4Net.config文件,在里面写入保存日志的设置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
<add key=" "/>
</appSettings>
<log4net debug="true">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="Logs\log-" />
<datePattern value="yyyy-MM-dd".txt""/>
<appendToFile value="true" />
<staticLogFileName value="false"/>
<rollingStyle value="Composite" />
<maxSizeRollBackups value="10"/>
<maximumFileSize value="5MB"/>
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%L] - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<!--指定将此级别及以上的log打印到log文件中-->
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
</configuration>
保存文件
2.3 参考1.3中新建LogBase类,代码一样,只要将19行的
log4net.Config.XmlConfigurator.Configure(LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()));//使用App.Config中的日志配置信息
//log4net.Config.XmlConfigurator.Configure(new FileInfo("Log4Net.config"));//使用Log4Net.config中的配置
替换为
//log4net.Config.XmlConfigurator.Configure(LogManager.GetRepository(System.Reflection.Assembly.GetEntryAssembly()));//使用App.Config中的日志配置信息
log4net.Config.XmlConfigurator.Configure(new FileInfo("Log4Net.config"));//使用Log4Net.config中的配置
这个替换起什么作用呢?其实很好理解,就是设置log4net保存日志时配置信息的来源,直接通过Log4Net.config来设置日志保存配置信息,好处是什么呢?也很简单,就是可直接修改Log4Net文件来改保存配置,而不需要修改代码