WinForm之日志模块

一 配置log4net.config文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
	</configSections>
	<log4net>
		<!--配置日志的目标存储形式-->
		<root>
			<!--输出等级-->
			<level value="ALL" />
			<!--控制台形式-->
			<appender-ref ref="ConsoleAppender" />
			<!--文件形式-->
			<appender-ref ref = "FileAppender" />
		</root>

		<!--控制台形式-->
		<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
			<layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
		</appender>

		<!--文件形式-->
		<appender name="FileAppender" type="log4net.Appender.FileAppender" >
			<!--文件路径-->
			<file value = "Log/log-file.txt" />
			<!--是否追加-->
			<appendToFile value = "true" />
			<!--显示格式-->
			<layout type="log4net.Layout.PatternLayout">
				<param name="Header" value="&#xD;&#xA;-------------------------软件启动-----------------------&#xD;&#xA;" />
				<param name="Footer" value="&#xD;&#xA;-------------------------软件关闭-----------------------&#xD;&#xA;" />
				<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} --%-5p-- %m%n" />
			</layout>

		</appender>
	</log4net>
</configuration>




二 绑定log4net.config文件

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

三 同步更新到TextBox控件进行显示日志内容

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using log4net.Appender;
using log4net.Core;
using log4net.Layout;
using System.Windows.Forms;

namespace WinForm之AOI外观检测
{
    /// <summary>
    /// 文本框添加信息类
    /// </summary>
    public class TextBoxBaseAppender : AppenderSkeleton
    {

        /// <summary>
        /// 文本输入框
        /// </summary>
        public TextBox TextBox { get; set; }

        /// <summary>
        /// 构造器
        /// </summary>
        static TextBoxBaseAppender()
        {

        }

        /// <summary>
        /// 复现Append方法
        /// </summary>
        /// <param name="loggingEvent"></param>
        protected override void Append(LoggingEvent loggingEvent)
        {
            PatternLayout patternLayout = (PatternLayout)this.Layout;
            string str = string.Empty;
            if (patternLayout != null)
            {
                str = patternLayout.Format(loggingEvent);
                if (loggingEvent.ExceptionObject != null)
                    str += loggingEvent.ExceptionObject.ToString() + Environment.NewLine;
            }
            else
                str = loggingEvent.LoggerName + "-" + loggingEvent.RenderedMessage + Environment.NewLine;
            // 打印
            printf(str);
        }

        private bool m_Flag = false;//线程开启


        private List<string> m_LogStrList = new List<string>();

        /// <summary>
        /// 锁
        /// </summary>
        private Object m_LockObj = new Object();

        /// <summary>
        /// 打印信息
        /// </summary>
        /// <param name="str"></param>
        private void printf(string str)
        {
            lock (m_LockObj)
            {
                Debug.WriteLine(str);
                m_LogStrList.Add(str);
            }

            if (m_Flag == false)
            {
                m_Flag = true;
                Task.Run(
                () =>
                {
                    while (true)
                    {
                        Thread.Sleep(300);//日志刷新周期300ms 避免抢占主线程
                        if (m_LogStrList.Count == 0) continue;
                        List<string> tempList = new List<string>();
                        lock (m_LockObj)
                        {
                            for (int i = 0; i < m_LogStrList.Count; i++)
                            {
                                tempList.Add(m_LogStrList[i]);
                            }
                            m_LogStrList.Clear();
                        }
                        if (tempList.Count > 0)
                        {
                            try
                            {
                                if(TextBox.IsHandleCreated)
                                {
                                    TextBox.Invoke(
                                       new Action(() =>
                                       {
                                           try
                                           {
                                               if (TextBox.Lines.Length > 100)
                                               {
                                                   TextBox.Clear();
                                               }
                                               foreach (var strTemp in tempList)
                                               {
                                                   ListViewItem item = new ListViewItem();
                                                   item.Text = strTemp.ToString();
                                                   TextBox.AppendText(strTemp);
                                               }
                                           }
                                           catch (Exception e)
                                           {
                                               throw e;
                                           }
                                       }));
                                }
                               
                            }
                            catch (TaskCanceledException)
                            {
                                //TaskCanceledException 异常是关闭时候可能出现 直接忽略
                            }
                            catch (Exception)
                            {
                                throw;
                            }
                        }
                    }
                });
            }
        }
    }

}

在这里插入图片描述

四 日志类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using log4net;
using log4net.Layout;
using log4net.Repository.Hierarchy;

namespace WinForm之AOI外观检测.LogModule
{
    public class Log
    {

        /// <summary>
        /// 创建日志接口对象实例
        /// </summary>
       private static ILog log = LogManager.GetLogger("myLog");
        /// <summary>
        /// 日志记录类
        /// </summary>

        #region 记录日志
        public static void Info(string msg)
        {
            log.Info(msg);
        }

        public static void Debug(string msg)
        {
            log.Debug(msg);
        }

        public static void Error(string msg)
        {
            log.Error(msg);
        }

        public static void Warn(string msg)
        {
            log.Warn(msg);
        }

        public static void Fatal(string msg)
        {
            log.Fatal(msg);
        }


        #endregion




        #region 初始化textBox控件

        /// <summary>
        /// /只需要在窗口初始化的时候注册TextBox就可以了,意思是让TextBox这个控件也显示日志信息
        /// </summary>
        /// <param name="richTextBox_log"></param>
        public static void InitializeTextBox(TextBox textBox)
        {
            if (textBox == null) return;

            // 设置listview打印日志
            var logPattern = "%d{yyyy-MM-dd HH:mm:ss} --%-5p-- %m%n";
            var list_logAppender = new TextBoxBaseAppender();
            list_logAppender.TextBox = textBox;
            list_logAppender.Layout = new PatternLayout(logPattern);

            Logger log4NetLogger = log.Logger as Logger;//单独配置appender
            log4NetLogger.AddAppender(list_logAppender);

        }

        #endregion
    }
    /// <summary>
    /// 日志记录级别
    /// </summary>
    public enum LogLevel
    {
        Debug,
        Info,
        Warn,
        Error,
        Fatal,
    }


}


五 使用日志

    /// <summary>
    /// 窗口加载
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void MainForm_Load(object sender, EventArgs e)
    {
        Log.Info("欢迎进入-AOI视觉外观缺陷检测系统");

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值