.net添加Log4Net日志的配置及使用,以及将其设置为全局异常过滤器,主要有以下步骤:
1. 新建一个Web应用程序
2. 引用log4net.dll
3. 添加config文件
4. 在AssemblyInfo.cs进行注册
5. 在Global.asax中进行初始化设置
6. 添加Log4Helper.cs帮助类
7. 新增过滤器LogExceptionFilter.cs文件
8. 在FilterConfig.cs中添加过滤器
9. 在Global.asax中注册过滤器
详细步骤如下:
1.新建一个web应用程序,如下图所示
2.利用Nuget引用log4net.dll
3.为了便于管理,添加log4net.config文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
</system.web>
<log4net>
<appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\\Warn"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
<staticLogFileName value="false"/>
<param name="MaxSizeRollBackups" value="100"/>
<maximumFileSize value="1GB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程编号】[%thread]
%n【执行时间】[%r]毫秒
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline"/>
</layout>
</appender>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\\LogInfo"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
<staticLogFileName value="false"/>
<param name="MaxSizeRollBackups" value="100"/>
<maximumFileSize value="1GB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程编号】[%thread]
%n【执行时间】[%r]毫秒
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline"/>
</layout>
</appender>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\\LogError"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
<staticLogFileName value="false"/>
<param name="MaxSizeRollBackups" value="100"/>
<maximumFileSize value="1GB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程编号】[%thread]
%n【执行时间】[%r]毫秒
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline"/>
</layout>
</appender>
<logger name="logerror">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
</logger>
<logger name="warning">
<level value="WARN" />
<appender-ref ref="WarnAppender" />
<!--<appender-ref ref="ConsoleAppender" />-->
</logger>
<logger name="info">
<level value="ALL"/>
<appender-ref ref="InfoAppender" />
</logger>
</log4net>
</configuration>
config文件中节点说明如下:
<!--错误日志:记录错误日志-->
<!--按日期分割日志文件 一天一个-->
<!-- appender 定义日志输出方式 将日志以回滚文件的形式写到文件中。-->
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!--保存路径:下面路径项目启动的时候会在相应目录创建logs、logError文件夹-->
<file value="Logs\\LogError"/>
<!-- 如果想在本项目中添加路径,那就直接去掉C:\\ 只设置log\\LogError 项目启动中默认创建文件夹 -->
<appendToFile value="true"/>
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
<rollingStyle value="Date"/>
<!--这是按日期产生文件夹-->
<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'"/>
<!--是否只写到一个文件中-->
<staticLogFileName value="false"/>
<!--保留的log文件数量 超过此数量后 自动删除之前的 好像只有在 按Size分割时有效 设定值value="-1"为不限文件数-->
<param name="MaxSizeRollBackups" value="100"/>
<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
<maximumFileSize value="1GB" />
<!-- layout 控制Appender的输出格式,也可以是xml 一个Appender只能是一个layout-->
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<!--输出格式 模板-->
<!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>-->
<conversionPattern value="%n==========
%n【日志级别】%-5level
%n【记录时间】%date
%n【线程编号】[%thread]
%n【执行时间】[%r]毫秒
%n【出错文件】%F
%n【出错行号】%L
%n【出错的类】%logger 属性[%property{NDC}]
%n【错误描述】%message
%n【错误详情】%newline"/>
</layout>
</appender>
<appender/>节点的name属性的值对应<logger/>节点中的name属性的值
4.在AssemblyInfo.cs文件中对log4net.config文件进行注册,添加代码如下
// 为项目注册Log4Net.config配置文件
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
5.在Global.asax中对其进行初始化设置
//读取日志 如果使用log4net,应用一开始的时候,都要进行初始化设置
log4net.Config.XmlConfigurator.Configure();
6.如果不需要添加全局异常过滤器的话,则执行到这一步即可,添加Log4Helper.cs文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using log4net;
namespace LogDemo
{
public class Log4netHelper
{
public static readonly ILog logInfo = log4net.LogManager.GetLogger("info");
public static readonly ILog logWarn = log4net.LogManager.GetLogger("warning");
public static readonly ILog logError = log4net.LogManager.GetLogger("logerror");
public static void Info(string info)
{
if (logInfo.IsInfoEnabled)
{
logInfo.Info(info);
}
}
public static void Warn(string info, Exception ex)
{
if (logWarn.IsWarnEnabled)
{
logWarn.Warn(info, ex);
}
}
public static void Debug(string info, Exception ex)
{
if (logError.IsDebugEnabled)
{
logError.Debug(info, ex);
}
}
public static void ErrorLog(object msg)
{
//Task.Run(() => logError.Error(msg)); // 异步
logError.Error(msg);
}
public static void ErrorLog(Exception ex)
{
//Task.Run(() => logError.Error(Newtonsoft.Json.JsonConvert.SerializeObject(ex)));
logError.Error(Newtonsoft.Json.JsonConvert.SerializeObject(ex));
}
public static void ErrorLog(object msg, Exception ex)
{
if (ex != null)
{
//Task.Run(() => logError.Error(msg, ex)); // 异步
logError.Error(msg, ex);
}
else
{
//Task.Run(() => logError.Error(msg)); // 异步
logError.Error(msg);
}
}
}
}
7.新增Filters文件夹,添加LogExceptionFilter.cs文件,如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace LogDemo.Filters
{
/// <summary>
/// 异常过滤器
/// </summary>
public class LogExceptionFilter : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (!filterContext.ExceptionHandled)
{
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
string msgTemplate = "在执行 controller[{0}] 的 action[{1}] 时产生异常:[{2}]";
log4net.ILog log = log4net.LogManager.GetLogger("LogError");//获取一个日志记录器
log.Error(DateTime.Now.ToString() + ": login success");//写入一条新log
Log4netHelper.ErrorLog(string.Format(msgTemplate, controllerName, actionName, filterContext.Exception.Message), filterContext.Exception);
filterContext.HttpContext.Response.Redirect("/Error/Index");
return;
}
else
{
base.OnException(filterContext);
}
}
}
}
8.在App_Start文件中添加FilterConfig.cs文件
using LogDemo.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace LogDemo.App_Start
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// 注册异常处理过滤器
filters.Add(new LogExceptionFilter());
filters.Add(new CustomerFilterAttribute());
}
}
}
9.在Global.asax文件中进行注册
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
如果本文对你有所帮助,请留下痕迹。
本文参考地址:
https://www.cnblogs.com/shiruina/p/9284446.html
https://www.cnblogs.com/Hmd528/p/11082814.html