Log4net使用配置及常见异常

 关于 Log4net的使用本人也是头一次,折腾了挺久,写个博文记录一下 ^_^,当然可能不全,如有需要可参考一下地址(本文暂不谈数据库记录日志及控制台记录日志)
  可以参考如下博客:
  1、https://www.jianshu.com/p/d6297d90c01d 
  2、https://blog.csdn.net/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="&quot;DebugLogs_&quot;yyyyMMdd&quot;.txt&quot;"/>
      <!--按照何种方式产生多个日志文件(日期[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,则清除文本框防止内存增加
            }
        }

三、嗯 ,到这里我觉得基本已搞定,欢迎各位补充哈!后续若有需要可补充!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值