网上关于log4net日志写入mysql数据库的博客感觉比较少,所以这边搞定之后先过来记录一下。

首先新建个项目,我命名是log4netDemo,然后需要引入两个dll,一个是mysql.dll,一个是log4net.dll。可以通过NuGet安装这两个dll,如下图

我这边mysql和log4net的版本分别是6.10.8和2.0.8,当然mysql更高版本的也是可以的。

然后在项目中新建一个log4net.config的配置文件,配置全文如下:

<?xml version="1.0"?>
<configuration><system.web><compilation debug="true" targetFramework="4.5" /><httpRuntime targetFramework="4.5" /></system.web><configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><log4net><appender name="AdoNetAppender_MySql" type="log4net.Appender.AdoNetAppender"><bufferSize value="1" /><param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/><param name="ConnectionString" value="server=localhost;database=test_log4net;Uid=root;Pwd=123456;port=3306;"/><commandText value="INSERT INTO loggermall (`log_thread`,`log_level`,`log_logger`,`log_message`) VALUES (@log_thread,@log_level,@log_logger,@log_message)" /><parameter><parameterName value="@log_thread"/><dbType value="String"/><size value="255"/><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%thread"/></layout></parameter><parameter><parameterName value="@log_level"/><dbType value="String"/><size value="50"/><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%-5level"/></layout></parameter><parameter><parameterName value="@log_logger"/><dbType value="String"/><size value="50"/><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%logger"/></layout></parameter><parameter><parameterName value="@log_message"/><dbType value="String"/><size value="4000"/><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%message"/></layout></parameter></appender><!--错误日志--><appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"><file value="log\\LogError\\"/><appendToFile value="true"/><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><rollingStyle value="Date"/><datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/><staticLogFileName value="false"/><param name="MaxSizeRollBackups" value="100"/><layout type="log4net.Layout.PatternLayout"><!--每条日志末尾的文字说明--><!--输出格式--><!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info--><conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n错误描述:%message%newline %n"/></layout></appender><!--Info日志--><appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"><param name="File" value="Log\\LogInfo\\" /><param name="AppendToFile" value="true" /><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><param name="MaxFileSize" value="10240" /><param name="MaxSizeRollBackups" value="100" /><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" /><param name="RollingStyle" value="Date" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n日志描述:%message%newline %n"/></layout></appender><!--监控日志--><appender name="MonitorAppender" type="log4net.Appender.RollingFileAppender"><param name="File" value="Log\\LogMonitor\\" /><param name="AppendToFile" value="true" /><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><param name="MaxFileSize" value="10240" /><param name="MaxSizeRollBackups" value="100" /><param name="StaticLogFileName" value="false" /><param name="DatePattern" value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" /><param name="RollingStyle" value="Date" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n跟踪描述:%message%newline %n"/></layout></appender><!--Error日志--><logger name="logerror"><level value="ERROR" /><appender-ref ref="AdoNetAppender_MySql"/><appender-ref ref="RollingLogFileAppender" /></logger><!--Info日志--><logger name="loginfo"><level value="INFO" /><appender-ref ref="AdoNetAppender_MySql"/><appender-ref ref="InfoAppender" /></logger><!--监控日志--><logger name="logmonitor"><level value="WARN" /><appender-ref ref="AdoNetAppender_MySql"/><appender-ref ref="MonitorAppender" /></logger></log4net>
</configuration>

其中appender中Name为AdoNetAppender_MySql的配置是配置连接数据库的类型、连接字符串及插入数据库的语句、语句对应的值等配置信息。然后建立类代码如下:
using System;
using System.Collections.Generic;namespace Log4NetDemo
{/// <summary>/// 日志配置/// </summary>public static class LogConfig{
/// <summary>/// 异常日志语句/// </summary>/// <param name="ControllerName"></param>/// <param name="ActionName"></param>/// <param name="ActionParams"></param>/// <param name="HttpRequestHeaders"></param>/// <param name="HttpMethod"></param>/// <param name="ip"></param>/// <returns></returns>public static string GetLogErrorString(string ControllerName = null, string ActionName = null, Dictionary<string, object> ActionParams = null, string HttpRequestHeaders = null, string HttpMethod = null, string ip = null){return $@"请求【{ControllerName}Controller】的【{ActionName}】产生异常:Action参数:{GetCollections(ActionParams)}Http请求头:{HttpRequestHeaders}ip地址:{ip},请求类型:{HttpMethod}";}/// <summary>/// 获取Action 参数/// </summary>/// <param name="Collections"></param>/// <returns></returns>public static string GetCollections(Dictionary<string, object> Collections){string Parameters = string.Empty;if (Collections == null || Collections.Count == 0){return Parameters;}foreach (string key in Collections.Keys){Parameters += $"{key}={Collections[key]}&";}if (!string.IsNullOrWhiteSpace(Parameters) && Parameters.EndsWith("&")){Parameters = Parameters.Substring(0, Parameters.Length - 1);}return Parameters;}}/// <summary>/// 日志配置/// </summary>public class LoggerWebConfig{/// <summary>/// 控制器/// </summary>public string ControllerName { get; set; }/// <summary>/// 方法/// </summary>public string ActionName { get; set; }/// <summary>/// 开始时间/// </summary>public DateTime ExecuteStartTime { get; set; }/// <summary>/// 结束时间/// </summary>public DateTime ExecuteEndTime { get; set; }/// <summary>/// 请求的Action 参数/// </summary>public Dictionary<string, object> ActionParams { get; set; }/// <summary>/// Http请求头/// </summary>public string HttpRequestHeaders { get; set; }/// <summary>/// 请求方式/// </summary>public string HttpMethod { get; set; }/// <summary>/// 请求的IP地址/// </summary>public string IP { get; set; }/// <summary>/// 返回监控语句/// </summary>/// <param name="mtype"></param>/// <returns></returns>public string GetInfoString(){string Msg = $@"Action执行时间监控:控制器名:{ControllerName}访问方法:   {ActionName}开始时间:{ExecuteStartTime}结束时间:{ExecuteEndTime}总耗时间:{(ExecuteEndTime - ExecuteStartTime).TotalSeconds}秒请求参数:{LogConfig.GetCollections(ActionParams)}请求头部:   {HttpRequestHeaders}请求地址:{IP}请求方式:   {HttpMethod}";return Msg;}}
}

以上类建好之后,建立一个Loggerhelper用来加载配置信息重写写入相应的日志信息的方法。

using System;
using log4net;
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "~/Log4net.config", Watch = true)]
namespace Taihua.Log4
{/// <summary>/// 日志/// </summary>public class LoggerHelper{/// <summary>/// 定义日志模块/// </summary>private static readonly ILog loginfo = LogManager.GetLogger("loginfo");private static readonly ILog logerror = LogManager.GetLogger("logerror");private static readonly ILog logwarn = LogManager.GetLogger("logmonitor");/// <summary>/// 错误日志/// </summary>/// <param name="ErrorMsg">错误信息</param>/// <param name="ex">异常</param>public static void Error(string ErrorMsg, Exception ex = null){if (ex != null){logerror.Error(ErrorMsg, ex);}else{logerror.Error(ErrorMsg);}}/// <summary>/// 警告日志/// </summary>/// <param name="Msg">错误信息</param>public static void Info(string Msg){loginfo.Info(Msg);}/// <summary>/// 监控日志/// </summary>/// <param name="Msg">错误信息</param>public static void Warn(string Msg){logwarn.Warn(Msg);}}
}

在需要记录日志的地方使用如下代码调用

      LoggerHelper.Info($"测试测试");LoggerHelper.Warn($"警告测试警告测试");LoggerHelper.Error($"错误测试错误测试");

最后建立一个demo数据库及log4net的数据库表,数据库表代码如下:

DROP TABLE IF EXISTS `loggerbackstage`;
CREATE TABLE `loggerbackstage`  (`id` int(11) NOT NULL AUTO_INCREMENT,`log_datetime` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0),`log_thread` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`log_level` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`log_logger` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`log_message` text CHARACTER SET utf8 COLLATE utf8_general_ci,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

然后就log4net日志就可以记录到文本文件中和数据库中了。如果警告、错误、信息需要记录到不同的表中,那么需要配置不同的append节点,并且调用。

本文参考了:

https://blog.csdn.net/Javon_huang/article/details/77727389

https://www.cnblogs.com/wangqiideal/p/4692651.html

等博客,看得太多不一定记得下来。大致就是这两篇吧,另外配置数据库连接方式的时候不要指定mysql的版本 ,因为我指定版本的时候写不进去,不知道是什么原因。还有一点就是配置文件中的

<bufferSize value="1" />

是代表缓存大小,在没达到缓存大小时,暂时不会存到数据库中,当程序关闭之后会,将未插入数据库的记录加入到数据库中。

转载于:https://www.cnblogs.com/wcj1/p/10112645.html

关于log4net日志写入mysql数据库记录相关推荐

  1. 【python】通过loging模块将日志写入mysql数据库

    建立新的py文件,用于写DB日志写入 文件名dblog.py # coding: utf-8 import logging import pymysqlclass DatabaseLogHandler ...

  2. Python将日志写入MySQL数据库

    今天开发需求:把某个日志里面的内容写入数据库存储,方便调阅. 日志类型,每天会生成一个,里面有6个字段: 第一个字段是时间,但是只有时分秒(xx:xx:xx) 第二个字段和第三个字段还有第五个字段只是 ...

  3. log4j2 mysql_spring boot使用log4j2将日志写入mysql数据库

    log4j2官方例子在spring boot中报错而且还是用的是org.apache.commons.dbcp包 我给改了一下使用org.apache.commons.dbcp2包 1.log4j2. ...

  4. ELK之收集日志到mysql数据库

    写入数据库的目的是持久化保存重要数据,比如状态码.客户端浏览器版本等,用于后期按月做数据统计等. 环境准备 linux-elk1:10.0.0.22,Kibana ES Logstash Nginx ...

  5. python 并发 数据库_python写入mysql数据库

    scrapy爬虫成长日记之将抓取内容写入mysql数据库 前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取 ...

  6. pandas读取大文件(chunksize)并通过sqlalchemy写入MySQL数据库

    pandas读取大文件(chunksize)并通过sqlalchemy写入MySQL数据库 在pandas中读取表类文件的时候有一个参数chunksize,只要指定了这个参数的数值,那么得到的结果就不 ...

  7. mysql 刷新二进制日志_使用binlog日志恢复MySQL数据库删除数据的方法

    binlog日志简介: binlog 就是binary log,二进制日志文件,这个文件记录了MySQL所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间. b ...

  8. php mysql表单源码_PHP表单数据写入MySQL数据库的代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: if(!isset($_POST['submit'])){ //如果没有表单提交,显示一个表单 ?> 国家: 动物名称(英文): 动物名称( ...

  9. SparkStreaming读取Kafka数据源并写入Mysql数据库

    SparkStreaming读取Kafka数据源并写入Mysql数据库 一.实验环境 本实验所用到的工具有 kafka_2.11-0.11.0.2: zookeeper-3.4.5: spark-2. ...

最新文章

  1. 昨天,我用 Python 写了一个婚介模型
  2. 问题1:U盘可以识别但无法打开;问题2:U盘成为启动盘之后如何恢复成普通U盘。
  3. android简单歌词,Yuan-LrcView
  4. 【时间序列】时序预测竞赛之异常检测算法综述
  5. Java黑皮书课后题第8章:*8.31(几何:交点)编写一个方法,返回两条直线的交点。四个点存放在4*2的二维数组points中。编写一个程序,提示用户输入4个点,并显示交点
  6. python 调用bat失败_要想顺利通过Python面试,你最起码需要达到白银段位!
  7. 【渝粤教育】国家开放大学2018年秋季 0267-21T摄影技术 参考试题
  8. 电信运营商占IDC市场65%:中国电信占行业半数以上
  9. C# Regex 深入正则表达式
  10. vue 工作项目中 实现消息列表的 全选,反选,删除功能
  11. Consul 服务注册与发现一站式解决方案
  12. 反射:类,构造器,方法使用
  13. war包还原成项目_war包反编译成整个java项目
  14. ESP8266/ESP32 驱动ST7789屏幕
  15. 【JESD204B】基于JESD204B协议的ADC、DAC数据传输
  16. 宝塔面板安装MySQL数据库
  17. 怦然心动(Flipped)-4
  18. WebSocket报错:Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but
  19. Clipper库 | 坐标圆整和精度控制
  20. 银行测试(8)-支付测试用例

热门文章

  1. python中->是什么意思
  2. 远望智库未来产业研究院与资本实验室联合发布《2021全球区块链应用市场报告》...
  3. AI求解薛定谔方程,兼具准确度和计算效率,登上《自然-化学》
  4. 结构化数据不应该被人工智能忘之脑后 !
  5. 人工智能的现状与未来
  6. 全球43亿IPv4地址正式耗尽,IPv6才是物联网的菜
  7. 学习人工智能必须攻克三道门槛:数学基础、英语水平与编程技术
  8. 【图文解析】带你看清全球机器人四大家族现状,四家企业瓜分中国57%、全球50%的市场份额...
  9. 京东AI战略宏图展现 不枉挖来这么多AI大牛
  10. 未来智能实验室成立,建设世界第一个智能系统智商评测和趋势研究机构