关于 Log4net的使用本人也是头一次,折腾了挺久,写个博文记录一下 ^_^,当然可能不全,如有需要可参考一下地址(本文暂不谈数据库记录日志及控制台记录日志)
可以参考如下博客:
1、https://www.jianshu.com/p/d6297d90c01d
2、https://blog.youkuaiyun.com/moshansk/article/details/53374702
3、https://www.cnblogs.com/qiangzi/archive/2009/08/07/1541023.html
4、http://www.cnitblog.com/seeyeah/archive/2009/09/20/61491.aspx
5、https://www.cnblogs.com/zhmore/archive/2009/03/19/1416707.html
6、https://www.cnblogs.com/manhoo/archive/2009/06/25/1511066.html
一、先谈Log4net配置问题:
1、首先得引用Log4net命名空间;
注意点:
①、预定义特性定义:本特性可定义于文件AssemblyInfo.cs文件末尾行或引用项目namespace前,若使用Log4net记录日志本特性必不可少
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = “.config”, Watch = true)]
.CS代码如下:
using log4net;
using log4net.Appender;
using log4net.Config;
using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
//本特性可定义于文件AssemblyInfo.cs文件末尾行或当前位置,若使用Log4net记录日志本特性必不可少
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = ".config", Watch = true)]
.config代码如下
<configSections>
<!--当configSections节点没有放在configuration节点下的第一个节点时,编译时不会报警告,但运行时不会记日志。
这是因为自定义的节点configSections这个必须放在第一个,这是app.config文件的语法规定;-->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<appender name="Debug" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置-->
<!--file可以指定具体的路径 D://logfile.txt。-->
<!--<file value="D://logfile.txt"/>-->
<!--如果放在Debug下,当然名字你可以改 -->
<param name="File" value="D:\\Logs\\Debugs\\"/>
<param name="AppendToFile" value="true"/>
<!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<!--使用Unicode编码-->
<param name="Encoding" value="UTF-8"/>
<!--备份log文件的个数最多10个-->
<param name="MaxSizeRollBackups" value="1"/>
<!--每个log文件最大是10M,如果超过10M将重新创建一个新的log文件,并将原来的log文件备份。-->
<param name="maximumFileSize" value="10MB"/>
<!--是否只写到一个文件中-->
<param name="StaticLogFileName" value="false"/>
<!--日志缓存大小-->
<!--<bufferSize value="128" />-->
<!--在根目录下直接以日期命名txt文件-->
<param name="DatePattern" value=""DebugLogs_"yyyyMMdd".txt""/>
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<!--输出格式-->
<!--样式:记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline-->
<conversionPattern value="%date %-5level 信息描述:%message%newline"/>
</layout>
</appender>
②、关于.config配置文件问题:(重要的事情说三遍!!!)
请严格根据log4net官方文档或是各大博文格式书写,若是书写错误,可导致log不输出,或是代码异常
请严格根据log4net官方文档或是各大博文格式书写,若是书写错误,可导致log不输出,或是代码异常
请严格根据log4net官方文档或是各大博文格式书写,若是书写错误,可导致log不输出,或是代码异常
**在使用log4net时,不可在.cs代码中设置文本读写属性,当设置该属性时,若按以上配置执行,生成的log文件将会出现多个重复命名的log文件,当然如有人有更好的方法 ,请告知作者 ^_^ 非常感谢!**
以下这段配置代码也很重要
<!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
<param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
二、配置好了 到了使用部分 其实各大博客都有很多案例 可根据自己需要实现各自的功能 但是本人目前在网络上没见到,log4net记录的日志如何显示在界面端,废话不多说,上代码,以下代码配合使用
.cs代码–UILog类
/// <summary>
/// 将Log文件通过委托传递到UI
/// </summary>
public class UILog : AppenderSkeleton
{
public static SynchronizationContext sc { get; set; }
public static Action<object> LogPrint { set; get; }
/// <summary>
/// 接收主界面传递进来的上下文对象和委托,以便调用该委托进行界面数据更新
/// </summary>
/// <param name="loggingEvent"></param>
protected override void Append(LoggingEvent loggingEvent)
{
StringWriter writer = new StringWriter();
this.Layout.Format(writer, loggingEvent);
sc.Post(new SendOrPostCallback(LogPrint), writer.ToString());
}//接收主界面传递进来的上下文对象和委托,以便调用该委托进行界面数据更新
}//将Log文件通过委托传递到UI
log4net.config可添加代码
<root>
<level value="ALL"/>
<appender-ref ref="UILogAppender"/>
</root>
<!-- 界面日志文件部分log输出格式的设定 -->
<appender name="UILogAppender" type="Logger.UILog">
<layout type="log4net.Layout.PatternLayout">
<ConversionPattern value="%date %-5level %message%newline"/>
</layout>
</appender>
UI端代码:
public MainWindow()
{
InitializeComponent();
SynchronizationContext mainThreadSynContext = SynchronizationContext.Current;
Logger.UILog.sc = mainThreadSynContext;
Logger.UILog.LogPrint = Updatelog;
}
/// <summary>
/// 接收委托信息
/// </summary>
/// <param name="objLogInfo">Log信息</param>
private void Updatelog(object objLogInfo)
{
lock (this)
{
string logInfo = objLogInfo as string;
this.Tblog.AppendText(logInfo);
if (this.Tblog.LineCount >= 20)//显示文本最大行数超过20,则清除文本框防止内存增加
{
this.Tblog.Text = null;
}//显示文本最大行数超过20,则清除文本框防止内存增加
}
}
三、嗯 ,到这里我觉得基本已搞定,欢迎各位补充哈!后续若有需要可补充!