在使用log4net之前先安装log4net。这里操作很简单,通过nuget下载并安装log4net很方便。如下图。

  • log4net配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections> <log4net>
<!--定义输出到一个固定文件中-->
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log/log.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<header value=" [============================应用程序日志开始============================ ] " />
<footer value=" [ ===========================应用程序日志结束=============================] " />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%newline%newline记录时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
</layout>
</appender> <!--定义输出到文件中,循环创建日志文件,以日期命名-->
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置 保存当前日期的日志,当第二天新日志产生时会把当前日期的日志保存备份-->
<file value="log/log" />
<!--禁止覆盖原有文件,true:覆盖原有文件-->
<appendToFile value="false" />
<rollingStyle value="Date" />
<!--以天为单位进行日志滚动,保存过去日期的日志-->
<datePattern value="yyyy-MM-dd-HHmm&quot;.txt&quot;" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<header value=" [============================应用程序日志开始============================ ] " />
<footer value=" [ ===========================应用程序日志结束=============================] " />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%newline%newline记录时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
</layout>
</appender> <!--定义输出到控制台命令行中-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<!--输出格式-->
<conversionPattern value="%newline时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
</layout>
</appender> <!--定义以不同颜色输出到控制台-->
<appender name="ManagedColoredConsoleAppender" type="log4net.Appender.ManagedColoredConsoleAppender">
<mapping>
<level value="ERROR" />
<foreColor value="DarkRed" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Yellow" />
</mapping>
<mapping>
<level value="INFO" />
<foreColor value="DarkGray" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="DarkGreen" />
</mapping> <layout type="log4net.Layout.PatternLayout">
<!--输出格式-->
<conversionPattern value="%newline时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
</layout>
</appender> <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为log4net.mdb(可以自定义路径)-->
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
<connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=logDB/log4net.mdb" />
<commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
<!--定义各个参数-->
<parameter>
<parameterName value="@logDate" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date" />
</layout>
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@logLevel" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
<!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。--> <root>
<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
如果没有定义LEVEL的值,则缺省为DEBUG-->
<level value="ALL"/>
<!--文件形式记录日志-->
<appender-ref ref="RollingFileAppender" />
<!--控制台控制显示日志-->
<!--<appender-ref ref="ConsoleAppender" />-->
<!--控制台以不同颜色显示日志-->
<appender-ref ref="ManagedColoredConsoleAppender" />
<!--定义输出到数据库中。 如果不启用相应的日志记录,可以通过这种方式注释掉-->
<!--<appender-ref ref="AdoNetAppender_Access" />-->
</root>
</log4net>
</configuration>
  • 日志帮助类——Logger
using System;
using log4net;
using log4net.Repository; namespace wxApp.Code.Creater.Api.Common
{
public static class Logger
{
private static ILoggerRepository loggerRepository; public static ILoggerRepository LoggerRepository { get; private set; }
public static ILog Log { get; private set; } /// <summary>
/// 静态构造函数,程序启动时自动执行
/// </summary>
//static Logger()
//{
// LoggerRepository = CreateLoggerRepository();
// LoadLog4NetConfig();
//} /// <summary>
/// 初始化日志
/// </summary>
/// <returns></returns>
public static void LoadLogger()
{
LoggerRepository = CreateLoggerRepository();
LoadLog4NetConfig();
} /// <summary>
/// 创建日志仓储实例
/// </summary>
/// <returns></returns>
private static ILoggerRepository CreateLoggerRepository()
{
loggerRepository = loggerRepository ?? LogManager.CreateRepository("GlobalExceptionHandler"); // 单例
return loggerRepository;
} /// <summary>
/// 加载log4net配置
/// </summary>
private static void LoadLog4NetConfig()
{
// 配置log4net
log4net.Config.XmlConfigurator.Configure(loggerRepository, new System.IO.FileInfo(System.IO.Directory.GetCurrentDirectory() + "/Config/log4net.config")); // 创建log实例
Log = LogManager.GetLogger(loggerRepository.Name, AppDomain.CurrentDomain.FriendlyName); Log.Info("已加载日志配置");
}
}
}
  • 全局异常捕获过滤器

全局异常捕获过滤器的代码如下,代码中并没有对异常做处理,只是直接输出到日志中,可以进一步对日志信息做处理使日志信息可读性更强。

using Microsoft.AspNetCore.Mvc.Filters;

namespace wxApp.Code.Creater.Api.Common
{
public class HttpGlobalExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
Logger.Log.Error("全局异常过滤器捕获的异常:", context.Exception);
}
}
}
  • 指定日志提供程序为log4net以及全局异常捕获

在Startup类的ConfigureServices方法中指定日志提供程序,代码如下。

            // 配置日志
services.AddLogging(logConfig => {
//log4net.Config.XmlConfigurator.Configure(Common.Logger.LoggerRepository);
Common.Logger.LoadLogger();
});

代码中Common.Logger.LoggerRepository为日志帮助类——Logger中创建的日志仓储实例。

在Startup类的ConfigureServices方法中添加全局异常捕获过滤器,代码如下。

            // 添加全局异常捕获
services.AddMvc(option =>
{
option.Filters.Add<Common.HttpGlobalExceptionFilter>();
});

ConfigureServices方法中完整代码如下。

.NET Core整合log4net以及全局异常捕获实现的更多相关文章

  1. .NET Core整合log4net以及全局异常捕获实现2

    Startup代码 public static ILoggerRepository repository { get; set; } public Startup(IConfiguration con ...

  2. Spring-MVC开发之全局异常捕获全面解读

    异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...

  3. gRPC全局异常捕获

    gRPC全局异常捕获 引 一般的.net项目比如ASP.NET.控制台程序.Windows服务.桌面程序等都会有framework自带的全局异常捕获机制.ASP.NET的ExceptionFilter ...

  4. MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获

    public class BaseController : Controller { /// <summary> /// Called after the action method is ...

  5. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

  6. C#中的那些全局异常捕获

    1.WPF全局捕获异常     public partial class App : Application     {         public App()         {    // 在异 ...

  7. Asp.Net MVC3(三)-MvcApp实现全局异常捕获

    定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...

  8. 使用spring利用HandlerExceptionResolver实现全局异常捕获

    最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...

  9. .Net下的全局异常捕获问题

    全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...

随机推荐

  1. SecondaryNameNode 的作用

    Secondary NameNode:它究竟有什么作用? 尽量不要将 secondarynamede 和 namenode 放在同一台机器上. 1. NameNode NameNode 主要是用来保存 ...

  2. UITextView的一些事1

    TextView如果只是作为展示文本时,要设置如下属性: //不可编辑(是否弹出键盘) TextView_label.editable=NO; //不可选择(长按不会出现复制.粘贴) TextView ...

  3. Erlang/OTP 中文手册

    http://erldoc.com/ Open Telecom Platform application array asn1rt base64 binary calendar code dbg di ...

  4. 小强的HTML5移动开发之路(23)—— jQuery Mobile入门

    一.下载jQuery Mobile 下载地址:http://jquerymobile.com/ 点击Download 下载如下zip包 下载成功后如下图 解压目录如图: 点击index.html进入d ...

  5. hadoop 3.x 启动过程中 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

    出现这种状况是因为当前账号没有配置ssh免密登录 进入到以下目录,查看是否生成过秘钥对,如果有的话直接ssh-copy-id 主机名 没有的话执行ssh-keygen -t rsa后再重新执行ssh- ...

  6. Tower与DevCloud对比分析报告

    1. 产品介绍 Tower是彩程设计公司出品的远程办公和团队协作工具,为小企业和小团队提供简单.靠谱的在线协作服务. DevCloud是集华为研发实践.前沿研发理念.先进研发工具为一体的研发云平台.D ...

  7. Scala-Numbers

    Scala之Numbers 一.前言 前面已经学习了Scala中的String,接着学习Scala的Numbers. 二.Numbers 在Scala中,所有的数字类型,如Byte,Char,Doub ...

  8. sqlserver中获取最后一个字符所在的位置

    CHARINDEX('字符',reverse(字段名称)) 这个意思就是将字段进行反转,就是从后往前取,这样就能够获取一个字符最后所在的位置

  9. mod_timer函数及其他定时器函数

    当一个定时器已经被插入到内核动态定时器链表中后,我们还能够改动该定时器的expires值.函数mod_timer()实现这一点 改动注冊入计时器列表的handler的起动时间 int mod_time ...

  10. ubuntu12.04下编译安装x86平台qt库qt-everywhere-opensource-src-4.8.5

    本文记录PC(x86)下安装Linux/X11版Qt 开发环境.下载页面:http://qt-project.org/downloads ARM嵌入式版本qt库的编译安装详见<unbunt12. ...