1、引言

在上位机开发中,日志记录是必不可少的,我们可以通过日志记录做日志分析及错误追踪。初学者会采用txt文本写入来实现日志保存,但是文本写入不是线程安全,当存在多个线程同时写入日志时,就会出现一些问题。Log4net库是.Net下一个非常优秀的开源日志记录组件,是一个帮助开发者将日志信息输出到各种目标(控制台、文件、数据库等)的工具。本节主要采用开源组件Log4Net来实现错误ERROR信息文本存储,并结合SQLite数据库,将日志INFO信息存储到数据库中,便于后续的查询。+vx:xiketang777领取源码

2、开发准备

  • 首先新建一个Windows窗体应用,取名为thinger.cn.Log4NetSQLitePro,UI界面设计如下所示:

  • 通过Nuget添加Log4Net开源组件,如下所示:

  • 通过Nuget添加SQLite组件,如下所示:

3、文本存储

一般情况下,我们可以将一些错误及异常信息存储在文本中,便于随时打开文件进行查询,文本存储将自动以天为单位,每天对应一个文件,步骤如下:

  • 添加一个应用程序配置文件项目右击添加新建项,项目类型选择应用程序配置文件,名称为log4net.config,如下所示:

  • 配置文件编写日志配置文件增加相关节点,如下所示:

配置文件规定了日志信息的相关属性、存储方式、日志内容格式等,配置信息如下所示:

其中,较为重要的是日志信息的格式,对应上面文件中的ConversionPattern,值为"[%d]%n%m%n%n",每个占位符有对应的含义,如下所示:+vx:xiketang777领取源码

字符格式

说明%m(message)输出的日志消息%n(newline)换行%d(datetime)输出当前语句运行的时刻%r(runtime)输出程序执行到当前消耗的毫秒数%t(threadid)当前语句所在的线程ID%p(priority)日志的当前日志级别%c(class)当前日志对象的名称%L输出语句所在的行号%F输出语句所在的文件名%-10最小长度为10,不够空格填充

  • 配置文件属性中的复制到输出目录,设置为始终复制或如果较新则复制,如下图所示:

  • 项目的AssemblyInfo.cs类中添加一行代码,如下所示:

  • 添加一个LogHelper类,编写2个Error的方法,如下所示:

  • 在ini文本存储按钮事件下,调用错误日志写入,如下所示:

  • 执行完成后,在项目目录,Log\Error目录下,产生一条当天日志命名的文件,打开如下所示:

4、SQLite存储

日志信息存储到数据库的好处在于便于用户通过界面进行查询,这里采用开源免费数据库SQLite,其他关系型数据库,如SQLServer、mysql,原理都是一样的,具体步骤如下所示:

  • 创建数据库及数据表通过SQLiteStudio软件创建一个数据库,取名为Log4NetSQLite,执行以下脚本创建一个Log数据表:

  • 将数据库文件复制到项目根目录下的DataBase文件夹中
  • 修改log4net.config文件,增加数据库存储相关配置,如下所示:

bufferSize:日志缓存写入条数 设置为0时只要有一条就立刻写到数据库

connectionString:SQLite指向的是数据库文件的绝对路径

  • LogHelper类中增加一个Info方法,如下所示:

  • 在SQLite存储按钮事件下,调用Info日志写入,如下所示:

  • 执行完成后,打开数据库,查看是否有相关记录:

5、实际应用

通过上面一系列的描述,相信大家对Log4Net的应用有了一些了解,Log4Net构建的日志系统是很多项目必备的一个功能,对项目开发、调试及后续维护都有着至关重要的作用。实际使用时,我们还可以将Log4Ne作为一个简单的数据存储工具,甚至可以使用Log4Net做多表多库存储,这些内容后续再给大家进行介绍。

6、写在最后【需要源码必看】

最近发现越来越多的小伙伴投入到C#上位机学习中,初学者学习最大的困扰就是无人交流,可以+vx:xiketang777 拉你进入工控上位机学习交流群,欢迎各位小伙伴加入,仅限前200名,本文源码也可通过加群获取。

【新阁教育】基于Log4Net实现日志信息双向存储(含源码)的更多相关文章

  1. 基于微软企业库的AOP组件(含源码)

    软件开发,离不开对日志的操作.日志可以帮助我们查找和检测问题,比较传统的日志是在方法执行前或后,手动调用日志代码保存.但自从AOP出现后,我们就可以避免这种繁琐但又必须要实现的方式.本文是在微软企业库 ...

  2. 【新阁教育】S7.NET+Log4Net+SQLSugar+MySQL搭建Iot平台

    1.搭建西门子S7仿真环境 新阁教育提醒您基于PLCSIM-Advanced搭建西门子S7仿真环境注意事项: 1.通过dotNet工控上位机公众号后台发送PLCSIM-Advanced获取软件 2.安 ...

  3. 【新阁教育】基于ModbusTCP实现西门子1200PLC定位控制案例

    1. 引言 今天新阁教育给大家分享一个<基于ModbusTCP实现西门子1200PLC定位控制案例>,从PLC输入输出及步进电机接线开始,到PLC运动控制程序编写,再到后续的ModbusT ...

  4. 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)

    背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...

  5. Python 基于python实现的http接口自动化测试框架(含源码)

    基于python实现的http+json协议接口自动化测试框架(含源码) by:授客 QQ:1033553122      欢迎加入软件性能测试交流 QQ群:7156436  由于篇幅问题,采用百度网 ...

  6. Python 日志打印之logging.getLogger源码分析

    日志打印之logging.getLogger源码分析 By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #函数说明 logging.getLogger(nam ...

  7. 基于Log4Net本地日志服务简单实现

    背景 项目开发中,我们或多或少会使用诸如NLog,Log4Net,Kafka+ELK等等日志套件: 基于关注点分离原则,业务开发的时候不应该关注日志具体实现:并且后续能方便切换其他日志套件: 这里先实 ...

  8. 【5】基于Log4Net的日志系统

    阅读目录 日志系统应具备的特性  Log4Net 配置文件:log4net.config 初始化 输出信息 对Log4Net的封装 log4net.config复杂配置   不管是Web应用程序还是W ...

  9. 基于深度学习的恶意样本行为检测(含源码) ----采用CNN深度学习算法对Cuckoo沙箱的动态行为日志进行检测和分类

    from:http://www.freebuf.com/articles/system/182566.html 0×01 前言 目前的恶意样本检测方法可以分为两大类:静态检测和动态检测.静态检测是指并 ...

随机推荐

  1. 学习Python(新手教程链接)

    1.这个是地址: https://www.ggdoc.com/cHl0aG9uIG1zaeaYr_S7gOS5iA2/NTY4Nzc1MWQxMDJkZTJiZDk3MDU4OGE20/

  2. 编译hotspot8

    编译hotspot8 ubuntu desktop 18 全新准备与编译过程再记录下: # 建议使用此gcc和g++版本,过高版本比如gcc7或引发编译报错 sudo apt-get install ...

  3. 【CF1174D】 Ehab and the Expected XOR Problem - 构造

    题面 Given two integers \(n\) and \(x\), construct an array that satisfies the following conditions: · ...

  4. PAT 2-09. 装箱问题模拟(20)

    题目链接 :http://www.patest.cn/contests/ds/2-09 解题思路:直接模拟, 记录已经使用的箱子的剩余容量, 如果已经使用的箱子中没有可以放下物品的箱子, 在增加另一个 ...

  5. 使用hexo+github搭建博客

    https://blog.csdn.net/qq_36667170/article/details/105789610这一篇已经写得很详细了,下面的内容是我操作的时候遇到的问题及解决方法. 1.下载N ...

  6. Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0

    在用Navicat for MySQL远程连接mysql的时候,出现了 Lost connection to MySQL server at ‘reading initial communicatio ...

  7. 操作系统-I/O(1)设备控制器

    I/O设备通常是物理上相互独立的设备,它们一般通过通信总线(电缆)与I/O控制器连接. 例如,图中IDE接口是通信总线而非I/O总线. I/O控制器(I/O接口)在扩展卡或者南桥芯片内,通过I/O总线 ...

  8. muduo源码解析4-exception类

    exception class exception:public std::exception { }; 作用: 实现了一个异常类,继承于std::exception,主要用于实现打印线程调用栈信息. ...

  9. Linux环境编程进程间通信机制理解

    一.Linux系统调用主要函数 二.创建进程 1.创建子进程系统调用fork() 2.验证fork()创建子进程效果 3.系统调用fork()与挂起系统调用wait() 三.模拟进程管道通信 四.pi ...

  10. Qt 改变鼠标形状

    Qt 改变鼠标形状(转载) 改变鼠标形状,在绘制坐标系的时候有用到,特此记下: 1 this->setMouseTracking(true); //设置为不按下鼠标键触发moveEvent 2 ...