WebForm应用log4net记录错误日志——使用线程列队写入
我的项目结构如下图:

日志帮助类库需要log4net包:工具—NuGet包管理器—管理解决方案NuGet程序包

线程日志帮助类 FlashLogger.cs 代码
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
using log4net;
using log4net.Config; namespace FlashLog
{
public sealed class FlashLogger
{
/// <summary>
/// 记录消息Queue
/// </summary>
private readonly ConcurrentQueue<FlashLogMessage> _que; /// <summary>
/// 信号
/// </summary>
private readonly ManualResetEvent _mre; /// <summary>
/// 日志
/// </summary>
private readonly ILog _log; /// <summary>
/// 日志
/// </summary>
private static FlashLogger _flashLog = new FlashLogger(); private FlashLogger()
{
var configFile = new FileInfo(HttpContext.Current.Server.MapPath("~/log4net.config"));
if (!configFile.Exists)
{
throw new Exception("未配置log4net配置文件!");
} // 设置日志配置文件路径
XmlConfigurator.Configure(configFile); _que = new ConcurrentQueue<FlashLogMessage>();
_mre = new ManualResetEvent(false);
_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
} /// <summary>
/// 实现单例
/// </summary>
/// <returns></returns>
public static FlashLogger Instance()
{
return _flashLog;
} /// <summary>
/// 另一个线程记录日志,只在程序初始化时调用一次
/// </summary>
public void Register()
{
Thread t = new Thread(new ThreadStart(WriteLog));
t.IsBackground = false;
t.Start();
} /// <summary>
/// 从队列中写日志至磁盘
/// </summary>
private void WriteLog()
{
while (true)
{
// 等待信号通知
_mre.WaitOne(); FlashLogMessage msg;
// 判断是否有内容需要如磁盘 从列队中获取内容,并删除列队中的内容
while (_que.Count > && _que.TryDequeue(out msg))
{
// 判断日志等级,然后写日志
switch (msg.Level)
{
case FlashLogLevel.Debug:
_log.Debug(msg.Message, msg.Exception);
break;
case FlashLogLevel.Info:
_log.Info(msg.Message, msg.Exception);
break;
case FlashLogLevel.Error:
_log.Error(msg.Message, msg.Exception);
break;
case FlashLogLevel.Warn:
_log.Warn(msg.Message, msg.Exception);
break;
case FlashLogLevel.Fatal:
_log.Fatal(msg.Message, msg.Exception);
break;
}
} // 重新设置信号
_mre.Reset();
Thread.Sleep();
}
} /// <summary>
/// 写日志
/// </summary>
/// <param name="message">日志文本</param>
/// <param name="level">等级</param>
/// <param name="ex">Exception</param>
public void EnqueueMessage(string message, FlashLogLevel level, Exception ex = null)
{
if ((level == FlashLogLevel.Debug && _log.IsDebugEnabled)
|| (level == FlashLogLevel.Error && _log.IsErrorEnabled)
|| (level == FlashLogLevel.Fatal && _log.IsFatalEnabled)
|| (level == FlashLogLevel.Info && _log.IsInfoEnabled)
|| (level == FlashLogLevel.Warn && _log.IsWarnEnabled))
{
_que.Enqueue(new FlashLogMessage
{
Message = "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss,fff") + "]\r\n" + message,
Level = level,
Exception = ex
}); // 通知线程往磁盘中写日志
_mre.Set();
}
} public static void Debug(string msg, Exception ex = null)
{
Instance().EnqueueMessage(msg, FlashLogLevel.Debug, ex);
} public static void Error(string msg, Exception ex = null)
{
Instance().EnqueueMessage(msg, FlashLogLevel.Error, ex);
} public static void Fatal(string msg, Exception ex = null)
{
Instance().EnqueueMessage(msg, FlashLogLevel.Fatal, ex);
} public static void Info(string msg, Exception ex = null)
{
Instance().EnqueueMessage(msg, FlashLogLevel.Info, ex);
} public static void Warn(string msg, Exception ex = null)
{
Instance().EnqueueMessage(msg, FlashLogLevel.Warn, ex);
} }
/// <summary>
/// 日志等级
/// </summary>
public enum FlashLogLevel
{
Debug,
Info,
Error,
Warn,
Fatal
}
/// <summary>
/// 日志内容
/// </summary>
public class FlashLogMessage
{
public string Message { get; set; }
public FlashLogLevel Level { get; set; }
public Exception Exception { get; set; } }
}
WebForm项目创建:
1.需要引用线程日志类库 FlashLog
2.添加log4net配置文件 log4net.config,实现了数据库及文件记录日志
CREATE TABLE ErrorLog
(
dtDate DATETIME,
sThread NVARCHAR(),
sLevel NVARCHAR(),
sLogger NVARCHAR(),
sMessage NVARCHAR(),
sException NTEXT
)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net debug="false">
<!-- 将日志信息写入SQL Server数据库-->
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="SERVER=服务器;DATABASE=数据库;UID=用户名;PWD=密码;Connect Timeout=15;" />
<commandText value="INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender> <!-- 将日志信息写入到项目日志文件 -->
<appender name="LogToFile" type="log4net.Appender.RollingFileAppender">
<encoding value="utf-8" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<file value="Logs\" />
<datePattern value="yyyy.MM.dd'.log'" />
<staticLogFileName value="false" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="" />
<maximumFileSize value="50MB" />
<layout type="log4net.Layout.PatternLayout">
<ConversionPattern value="%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message %newline" />
</layout>
</appender> <!--设置根目录,添加appenders并设置默认日志等级 -->
<root>
<level value="All" />
<appender-ref ref="ADONetAppender" />
<appender-ref ref="LogToFile"/>
</root>
</log4net> </configuration>
3.需要添加全局应用程序类 Global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState; namespace LogWeb
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
FlashLog.FlashLogger.Instance().Register();
}
}
}
4.实例应用:访问无效域名时记录错误日志
try
{
string checkTonkenUrl = "http://url.abcde.com";
WebRequest wRequest = WebRequest.Create(checkTonkenUrl);
wRequest.Method = "GET";
wRequest.ContentType = "text/html;charset=UTF-8";
WebResponse wResponse = wRequest.GetResponse();
Stream stream = wResponse.GetResponseStream();
StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);
string str = reader.ReadToEnd(); //url返回的值
}
catch (Exception ex)
{
FlashLogger.Error("Error", ex);
}


到此,log4net日志配置完成。
相关程序源码可以点击此处下载:链接: https://pan.baidu.com/s/1bu29Ba9zxyAs-oAmdaSI-A 密码: upw2
另外附上自己整理的.net Core WebAPI 应用log4net,大家可以看下源码:链接: https://pan.baidu.com/s/14wOIi1je0a02blM7_zlASg 密码: gd9b
WebForm应用log4net记录错误日志——使用线程列队写入的更多相关文章
- ASP.NET MVC中Log4Net记录错误日志的使用
第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...
- asp.net mvc中加入log4net记录错误日志
直接上代码示例:https://share.weiyun.com/aff36f2547514cfefe129ebb8ccb28ef 首先添加加log4net的dll,推荐用nuget.... 贴上配置 ...
- Log4Net 记录错误日志。
点击进入推荐链接 1.先添加log4net.dll的引用. 2.在程序入口的地方(Gloabal文件)加上这句log4net.Config.XmlConfigurator.Configure(). ...
- mvc项目用log4net 记录错误日志
1. 首先下载lognet 下载地址 http://logging.apache.org/log4net/download_log4net.cgi 2.找到bin文件中的net文件夹 之后看你电脑 ...
- 点滴积累【C#】---使用log4net组件记录错误日志(以文本形式记录)
效果: 描述: 利用log4net组件进行错误日志的记录,log4net记录错误的方式我所了解的有4种,No.1 文本形式记录日志,No.2存储到数据库形式记录日志,No.3控制台控制显示日志,No. ...
- 在ASP.NET MVC中使用Log4Net记录异常日志,出错时导向到静态页
本篇体验在ASP.NET MVC 4中使用Log4Net记录日志. 通过NuGet安装Log4Net. 需求是:当出错时导向到Error.html静态页面,Log4Net记录错误信息. 大致的思路是: ...
- C# 使用Log4Net记录程序日志
在之前的博客中,写过使用系统内置的Trace类记录程序日志,具体请参考:C# 使用Trace记录程序日志.这篇博客将介绍如何使用Log4Net记录程序日志. 首先需要引用Log4Net.dll,我们可 ...
- C#中四步轻松使用log4net记录本地日志
在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...
- C#中四步轻松使用log4net记录本地日志(WPF有点小区别)
在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...
随机推荐
- Express路由
1. 路由器的配置分为两个,一个是需要做页面的渲染,一个是需要直接进行对数据进行输出,对于路由器的配置需要对路由器在公共的app.js进行注册与注入才能生效,否则是不能生效的.配置时根据不同的应用场景 ...
- Windows 10 +VS2019 编译OpenCV 4.1.0
准备环境 安装cmake 官网 获取代码 github 下载拓展库opencv_contrib github 生成Sln cmake安装完后桌面会有一个快捷方式,可打开cmakeGUI,打开它. 第一 ...
- SQL Server 2008 R2中配置作业失败后邮件发送通知
SQL Server日常维护中难免会遇到作业失败的情况.失败后自然需要知道它失败了,除了例行检查可以发现出错以外,有一个较实时的监控还是很有必要的.比较专业的监控系统比如SCOM虽然可以监控作业执行情 ...
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
- 彻底解决windows10+matlab2018a调用libsvm时出现找不到编译器问题
本文转载自:Shane Zhao博客(CSDN) https://blog.csdn.net/silence2015/article/details/53106156 个人申明,只是因为解决这个问题花 ...
- 6.3 基于二分搜索树、链表的实现的集合Set复杂度分析
两种集合类的复杂度分析 在[6.1]节与[6.2]节中分别以二分搜索树和链表作为底层实现了集合Set,在本节就两种集合类的复杂度分析进行分析:测试内容:6.1节与6.2节中使用的书籍.测试方法:测试两 ...
- python 虚拟环境使用与管理(virtualenv)
安装虚拟环境 pip install virtualenv 安装虚拟环境管理工具 pip install virtualenvwrapper-win 设置虚拟环境目录(虚拟环境存放位置) 默认创建的虚 ...
- IIS下uploadify上传大文件出现404错误(提示上传文件大小超过400M)
原因:由于IIS7下的默认设置限制了上传大小,所以Web.Config中的大小设置也就失效了. 解决步骤: 1.打开IIS管理器,找到Default Web Site(也就是你的发布站点),先进行停止 ...
- python yield 与 yield from转
python yield 与 yield from转 https://blog.csdn.net/chenbin520/article/details/78111399?locationNum=7&a ...
- python算法之冒泡排序和选择排序
一.冒泡排序(Bubble sort) Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorith ...