winform 应用log4net做日志记录到mysql
1.nuget装log4net
2.nuget控件台装 mysql.data
Install-Package mysql.data -version 6.8.3 (太高的版本用不了,切记)
3.修改app.config文件,在configuration节点下添加
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Common
{
public class LogHelper
{
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); public static void WriteLog(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
/// <summary>
/// 错误记录
/// </summary>
/// <param name="info">附加信息</param>
/// <param name="ex">错误</param>
public static void ErrorLog(string info, Exception ex)
{
if (!string.IsNullOrEmpty(info) && ex == null)
{
logerror.ErrorFormat("【附加信息】 : {0}<br>", new object[] { info });
}
else if (!string.IsNullOrEmpty(info) && ex != null)
{
string errorMsg = BeautyErrorMsg(ex);
logerror.ErrorFormat("【附加信息】 : {0}<br>{1}", new object[] { info, errorMsg });
}
else if (string.IsNullOrEmpty(info) && ex != null)
{
string errorMsg = BeautyErrorMsg(ex);
logerror.Error(errorMsg);
}
}
/// <summary>
/// 美化错误信息
/// </summary>
/// <param name="ex">异常</param>
/// <returns>错误信息</returns>
private static string BeautyErrorMsg(Exception ex)
{
string errorMsg = string.Format("【异常类型】:{0} <br>【异常信息】:{1} <br>【堆栈调用】:{2}", new object[] { ex.GetType().Name, ex.Message, ex.StackTrace });
errorMsg = errorMsg.Replace("\r\n", "<br>");
errorMsg = errorMsg.Replace("位置", "<strong style=\"color:red\">位置</strong>");
return errorMsg;
} }
}
using Common;
using log4net.Appender;
using log4net.Config;
using log4net.Layout;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace testLog4N
{
public class LogExceptionHandle
{
private static string _ConnectionString = "server=xxx;port=3306;database=xxx;uid=xxx;pwd=xxx;";
/// <summary>
/// 绑定程序中的异常处理
/// </summary>
public static void BindExceptionHandler()
{
//设置应用程序处理异常方式:ThreadException处理
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
//处理UI线程异常
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
//处理未捕获的异常
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
//加载log4net组件
LoadADONetAppender();
}
/// <summary>
/// 处理UI线程异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
LogHelper.ErrorLog(null, e.Exception as Exception);
}
/// <summary>
/// 处理未捕获的异常
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
LogHelper.ErrorLog(null, e.ExceptionObject as Exception);
}
/// <summary>
/// 使用SQLSERVER记录异常日志
/// </summary>
/// <Author>Ryanding</Author>
/// <date>2011-05-01</date>
public static void LoadADONetAppender()
{ log4net.Repository.Hierarchy.Hierarchy hier =
log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy; if (hier != null)
{
log4net.Appender.AdoNetAppender adoAppender = new log4net.Appender.AdoNetAppender();
adoAppender.Name = "AdoNetAppender";
adoAppender.CommandType = CommandType.Text;
adoAppender.BufferSize = ;
adoAppender.ConnectionType = "MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d";
adoAppender.ConnectionString = _ConnectionString;
adoAppender.CommandText = @"INSERT INTO `ddylog` (`Date`, `Thread`, `Level`, `Logger`, `Method`, `Location`,`Message`,`Exception`) VALUES (@Date, @Thread, @Level, @Logger, @Method,@Location,@Message,@Exception)";
adoAppender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@Date",
DbType = System.Data.DbType.DateTime,
Layout = new log4net.Layout.RawTimeStampLayout()
});
adoAppender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@Thread",
DbType = System.Data.DbType.String,
Size = ,
Layout = new Layout2RawLayoutAdapter(
new PatternLayout("%thread")
)
});
adoAppender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@Level",
DbType = System.Data.DbType.String,
Size = ,
Layout = new Layout2RawLayoutAdapter(
new PatternLayout("%level")
)
});
adoAppender.AddParameter(
new AdoNetAppenderParameter
{
ParameterName = "@Logger",
DbType = System.Data.DbType.String,
Size = ,
Layout = new Layout2RawLayoutAdapter(
new PatternLayout("%logger")
)
});
adoAppender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@Method",
DbType = System.Data.DbType.String,
Size = ,
Layout = new Layout2RawLayoutAdapter(new PatternLayout("%method")
)
});
adoAppender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@Location",
DbType = System.Data.DbType.String,
Size = ,
Layout = new Layout2RawLayoutAdapter(
new PatternLayout("%location")
)
});
adoAppender.AddParameter(
new AdoNetAppenderParameter
{
ParameterName = "@Message",
DbType = System.Data.DbType.String,
Size = ,
Layout = new Layout2RawLayoutAdapter(
new PatternLayout("%message")
)
});
adoAppender.AddParameter(
new AdoNetAppenderParameter
{
ParameterName = "@Exception",
DbType = System.Data.DbType.String,
Size = ,
Layout = new Layout2RawLayoutAdapter(new ExceptionLayout()
)
});
adoAppender.ActivateOptions();
BasicConfigurator.Configure(adoAppender);
}
}
/// <summary>
/// 使用文本记录异常日志
/// </summary>
/// <Author>Ryanding</Author>
/// <date>2011-05-01</date>
public static void LoadFileAppender()
{
string currentPath = AppDomain.CurrentDomain.BaseDirectory;
string txtLogPath = string.Empty;
string iisBinPath = AppDomain.CurrentDomain.RelativeSearchPath; if (!string.IsNullOrEmpty(iisBinPath))
txtLogPath = Path.Combine(iisBinPath, "ErrorLog.html");
else
txtLogPath = Path.Combine(currentPath, "ErrorLog.html"); log4net.Repository.Hierarchy.Hierarchy hier =
log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy; FileAppender fileAppender = new FileAppender();
fileAppender.Name = "LogFileAppender";
fileAppender.File = txtLogPath;
fileAppender.AppendToFile = true; PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "<HR COLOR=red>%n【异常时间】:%d [%t] <BR>%n【异常级别】:%-5p <BR>%n【异 常 类】:%c [%x] <BR>%n%m <BR>%n <HR Size=1>";
patternLayout.ActivateOptions();
fileAppender.Layout = patternLayout; //选择UTF8编码,确保中文不乱码。
fileAppender.Encoding = Encoding.UTF8; fileAppender.ActivateOptions();
BasicConfigurator.Configure(fileAppender); }
}
}
使用:
LogExceptionHandle.BindExceptionHandler();//绑定程序中的异常处理
winform 应用log4net做日志记录到mysql的更多相关文章
- C# 利用Log4Net进行日志记录
概述 本文主要简单说明如何使用Log4Net进行日志记录,在程序开发过程中记录日志的优点: 它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug: 一旦在程序中加入了Log 输出 ...
- 使用log4net无法将日志记录插入mysql数据库解决办法
写在前面 今天没事研究了下,将日志文件写入mysql数据库,因为新公司用的数据库也是mysql,项目中需要将日志信息写入数据库,没办法,就研究了下.在使用过程中遇到一个很蛋疼的问题.最后解决了,郁闷了 ...
- 使用独立的log4net.config文件配置log4net,将日志记录到Mysql数据库【原创】
开发环境: VS2013, Asp.Net MVC 4.0, .Net Framework 4.0, Log4net 1.2.13.0, Mysql.Data.dll,6.8.3.0 设置步骤: 1. ...
- 【转】使用Log4Net进行日志记录
首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志系统所记录的信息为系统进行排错, ...
- Log4Net异常日志记录在asp.net mvc3.0的应用
前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...
- Log4Net异常日志记录在asp.net mvc3.0的应用(转载)
这篇博客写的很好:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html 前言 log4net是.Net下一个非常优秀的开源 ...
- 【改进】用Log4net建立日志记录
上一篇随笔中只使用了普通的文件读写来进行日志的写入,正如很多朋友说的,频繁的对文件进行读写会造成很多的问题,代码缺少边界控制和操作控制,没有对资源进行管理,是非常典型的bad code. 然后经过前辈 ...
- 日志记录:MySQL系列之十一
一.SQL命令历史 ~/.mysql_history 记录了在mysql中执行的命令历史 二.事务日志 transaction log:事务型存储引擎自行管理和使用 在一个事务提交后还没有存到磁盘的情 ...
- [经验]Textbox 做日志记录,
private void Log(string msg) { txtLog.MaxLength = ; txtLog.AppendText(msg); } 起因:在Winform中用Textbox显示 ...
随机推荐
- 【Windows】windows核心编程整理(上)
小续 这是我11年看<windows核心编程>时所作的一些笔记,现整理出来共享给大家 windows核心编程整理(上) windows核心编程整理(下) 线程的基础知识 进程是不活泼的,进 ...
- Leetcode:Scramble String 解题报告
Scramble String Given a string s1, we may represent it as a binary tree by partitioning it to two no ...
- 1. pyhanlp介绍和简单应用
1. pyhanlp介绍和简单应用 2. 观点提取和聚类代码详解 1. 前言 中文分词≠自然语言处理! 中文分词只是第一步:HanLP从中文分词开始,覆盖词性标注.命名实体识别.句法分析.文本分类等常 ...
- Base64与MD5的区别
Base64和MD5都可用于做信息的简单加密,两者的简单差别如下: Base64 可逆性. 可以将图片等二进制文件转换为文本文件. 可以把非ASCII字符的数据转换成ASCII字符,避免不可见字符. ...
- 【Unity】角色沿路线移动/朝着目标移动
先在场景中放置一连串物体作为角色移动路线的关键点,可以把关键点的触发器Trigger拉得大一些方便角色接触到(如酷跑/赛车类项目可以把关键点的触发器做成拦截整个道路的墙面形状).让角色从开始位置朝着第 ...
- C语言 · 瓷砖铺放
算法训练 瓷砖铺放 时间限制:1.0s 内存限制:512.0MB 锦囊1 递归或递推. 问题描述 有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长 ...
- STM32f103的数电采集电路的双ADC的设计与使用
STM32F103C8T6拥有3个ADC,其独立使用已经在本文的3.1.3里面有详细的介绍,这里主要是介绍双ADC的同时使用,即STM32的同步规则模式使用.在此模式在规则通道组上执行时,外部触发来自 ...
- HTTP 响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding
Tomcat 中响应头信息(Http Response Header) Content-Length 和 Transfer-Encoding 客户端(PC浏览器或者手机浏览器)在接受到Tomcat的响 ...
- 【转】26张PPT让你告别拖延症
不论你如何富有,你都赚不到更多的时间,你也回不到过去.没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在. 可能的话,请仔细读读PPT原件而不要只是看翻译吧. 1.时间常有,时间优先. 2 ...
- 教你如何禁用U盘、屏蔽USB端口的三种方法
如果想禁止所有U盘的使用,则可以通过修改注册表来实现. 打开”运行“对话框,输入命令“Regedit”进入注册表界面. 依次展开“HKEY_LOCAL_MACHINE”→“SYSTEM”→“ Cu ...