.netcore3.1使用log4net/nlog记录日志

.netcore3.1与2.x之间很是有不少差异的。本来想通过ctrl+c,ctrl+v将在2.2中实现的简单日志记录搬到.netcore3.1项目上,才发现姿势不对。所以在此做个简单的记录。

使用log4net

第一步、在对应项目中引入Microsoft.Extensions.Logging.Log4Net.AspNetCore

第二步、创建log4net.config文件(详细的配置说明请参照其官方文档),配置好日志参数。并将改文件设置成【始终复制】或者【如果较新则复制】

log4net.config文件内容示例

<?xml version="1.0" encoding="utf-8"?>
<log4net>
<!-- Define some output appenders -->
<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
<file value="log\log.txt" />
<!--追加日志内容-->
<appendToFile value="true" />
<!--防止多线程时不能写Log,官方说线程非安全-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--可以为:Once|Size|Date|Composite-->
<!--Composite为Size和Date的组合-->
<rollingStyle value="Composite" />
<!--当备份文件时,为文件名加的后缀-->
<datePattern value="yyyyMMdd.txt" />
<!--日志最大个数,都是最新的-->
<!--rollingStyle节点为Size时,只能有value个日志-->
<!--rollingStyle节点为Composite时,每天有value个日志-->
<maxSizeRollBackups value="20" />
<!--可用的单位:KB|MB|GB-->
<maximumFileSize value="5MB" />
<!--置为true,当前最新日志文件名永远为file节中的名字-->
<staticLogFileName value="true" />
<!--输出级别在INFO和ERROR之间的日志-->
<!--过滤级别 FATAL > ERROR > WARN > INFO > DEBUG-->
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="FATAL" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
</layout>
</appender>
<root>
<priority value="ALL"/>
<level value="ALL"/>
<appender-ref ref="rollingAppender" />
</root>
</log4net>

第三步、代码注入log4net

修改program.cs代码注入log4net

 public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging((context, logBuilder) =>
{
logBuilder.AddFilter("System", LogLevel.Warning);
logBuilder.AddFilter("Microsoft", LogLevel.Warning);
logBuilder.AddLog4Net(); //注入log4net
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});

再修改startup.cs

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env , ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} // app.UseHttpsRedirection();
#region 添加log4net
loggerFactory.AddLog4Net();
#endregion app.UseRouting();
......
}
测试

    [Route("api/[controller]")]
[ApiController]
public class TestLoggerController : ControllerBase
{
private readonly ILogger<TestLoggerController> _logger;
public TestLoggerController(ILogger<TestLoggerController> logger)
{
this._logger = logger;
} [HttpPost("testWriteLogException")]
public void TestWriteLogException()
{
_logger.LogError("这是一个简单日志测试"); }
}

结果


------------------------------------

使用NLog

第一步,项目中引入NLog.Web.AspNetCore

第二步、创建nlog.config文件(详细的配置说明请参照NLog官方文档),配置好日志参数。并将改文件设置成【始终复制】或者【如果较新则复制】

nlog.config文件示例


<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Off"
internalLogFile="d:\temp\internal-nlog.txt"> <!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions> <!-- the targets to write to -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace} ${newline} ${exception:format=tostring} ${newline}" /> <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
<target xsi:type="Debugger" name="debugger" layout="${date:format=HH\:mm\:ss.fff}: ${message}" />
</targets> <!-- rules to map from logger name to target -->
<rules>
<!--Skip non-critical Microsoft logs and so log only own logs-->
<!--<logger name="Microsoft.*" maxlevel="Error" final="true" />-->
<logger name="*" minlevel="Debug" writeTo="allfile" />
<!--<logger name="*" minlevel="Info" writeTo="allfile" />-->
</rules>
</nlog>

第三步、代码中注入NLog

只需修改program.cs

        public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).UseNLog();// 注入nlog

测试

    [Route("api/[controller]")]
[ApiController]
public class TestLoggerController : ControllerBase
{
private readonly ILogger<TestLoggerController> _logger;
public TestLoggerController(ILogger<TestLoggerController> logger)
{
this._logger = logger;
} [HttpPost("testWriteLogException")]
public void TestWriteLogException()
{
_logger.LogError("这是一个简单日志测试-----NLog"); }
}

结果

-----------------------------------------

附,配置全局异常过滤

程序在运行中避免会出现各种异常,而我们不可能在所有地方都进行try..catch捕获异常记录日志。这时我们可以定义全局异常捕获并记录日志。

在netcore中我们只需要定义对应的异常过滤类(其必须继承自ExceptionFilterAttribute或者是实现接口IExceptionFilter;ExceptionFilterAttribute实现了接口IExceptionFilter),并在程序中进行注入异常过滤即可(日志的记录还是要依赖具体的实现,可以是log4net、NLog或者其他)。

以下定义了GlobalExceptionFilter

    public class GlobalExceptionFilter : ExceptionFilterAttribute
{
private readonly ILogger<GlobalExceptionFilter> _logger;
public GlobalExceptionFilter(ILogger<GlobalExceptionFilter> logger)
{
_logger = logger;
} public override void OnException(ExceptionContext context)
{ var operation = context.HttpContext.Request.RouteValues["controller"] + "/" + context.HttpContext.Request.RouteValues["action"]; _logger.LogError(context.Exception,$"{operation} Exception:" + context.Exception.Message); //记录错误日志
//拦截处理
if (!context.ExceptionHandled)
{
context.Result = new JsonResult(new
{
status = false,
msg ="系统内部错误:"+ context.Exception.Message
});
context.ExceptionHandled = true;
}
}
}

修改startup.cs添加异常过滤

 public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddMvc(p => {
p.Filters.Add(typeof(GlobalExceptionFilter)); //添加异常过滤
}); ....
}

示例

    [Route("api/[controller]")]
[ApiController]
public class TestLoggerController : ControllerBase
{
private readonly ILogger<TestLoggerController> _logger;
public TestLoggerController(ILogger<TestLoggerController> logger)
{
this._logger = logger;
} [HttpPost("testWriteLogException")]
public void TestWriteLogException()
{
throw new Exception("这是没有捕获的异常"); }
}

结果

-----------------------------------------

.netcore3.1使用log4net/nlog记录日志的更多相关文章

  1. .NET中使用NLog记录日志

    以前小编记录日志使用的是Log4Net,虽然好用但和NLog比起来稍显复杂.下面小编就和大伙分享一下NLog的使用方式. 引用NLog.Config 在使用NLog之前,我们要首先添加对NLog.Co ...

  2. .net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

    背景 .net core 中已经集成了log的方法, 但是只能控制台输出不能写入文件等等. 常见第三方的的日志工具包括log4net, nlog等等, 本文介绍nlog 一. 引用程序集, nuget ...

  3. [转]C# 使用Nlog记录日志到数据库

    本文转自:http://www.cnblogs.com/weixing/archive/2013/04/26/3044422.html 摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输 ...

  4. Nlog 记录日志到 sqlite

    最近研究了一下Nlog这个日志框架,这里记录一下如何将日志写到sqlite中. 第一步:使用NuGet获取Nlog和Sqlite 第二步:在sqlite中创建一个database,这里我用了SQLit ...

  5. C# 使用Nlog记录日志到数据库 使用LogEventInfo类获取,命名空间名称、类名、方法名

    原文地址:http://dotnet.9sssd.com/csbase/art/793 [摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数 ...

  6. EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象

    EF+LINQ事物处理   在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...

  7. C# 使用Nlog记录日志到数据库

    [摘要]Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台,保存到文本,也可以很方便的记录到数据库中.本文为你介绍C# 使用Nlog记录日志到数据库. Nlog是一个很不错的.NET ...

  8. .Net Core 使用NLog记录日志到文件和数据库

    NLog 记录日志是微软官方推荐使用. 接下来,通过配置日志记录到文件和Sql Server数据库. 第一步:首先添加包NLog.Config (可通过微软添加包命令Install-Package 包 ...

  9. ASP.NET Core 3.1使用log4net/nlog/Serilog记录日志

    Serilog中的结构化日志支持非常好,而且配置简便.我能够比其他任何人更轻松地启动和运行Seirlog.Serilog中的日志可以发送到很多目的地.Serilog称这些东西为"接收器&qu ...

随机推荐

  1. CAS 原子操作

    理会CAS和CAS: 有时候面试官面试问你的时候,会问,谈谈你对CAS的理解,这时应该有很多人,就会比较懵,当然,我也会比较懵,当然我和很多人的懵不同,很多人可能,并不知道CAS是一个什么东西,而在我 ...

  2. 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)

    092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  3. 【题解】[USACO12JAN]Video Game G

    第一道\(AC\)自动机\(+DP.\) 首先,一个自动机上\(DP\)的套路是设\(dp[i][j]\)表示长度为\(i\)匹配到\(j\)节点的最优得分. 那么,由于我们已经建好了\(Trie\) ...

  4. Python中list的合并

    ①差集 方法一: if __name__ == '__main__':     a_list = [{'a' : 1}, {'b' : 2}, {'c' : 3}, {'d' : 4}, {'e' : ...

  5. 手把手教你AspNetCore WebApi:认证与授权

    前言 这几天小明又有烦恼了,之前给小红的接口没有做认证授权,直接裸奔在线上,被马老板发现后狠狠的骂了一顿,赶紧让小明把授权加上.赶紧Baidu一下,发现大家都在用JWT认证授权,这个倒是挺适合自己的. ...

  6. gitlab-配置邮件

    一:配置邮件  1. 进入配置文件,通过修改/etc/gitlab/gitlab.rb来设置邮件功能  修改后的文件 1 ## GitLab URL 2 ##! URL on which GitLab ...

  7. Hello World -- 第一篇博客 -- 活着的意义

    今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...

  8. 实验三 HTML表格和表单的制作

    实验三 HTML表格和表单的制作 [实验目的] 1.掌握表格的创建.结构调整与美化方法: 2.熟悉表格与单元格的主要属性及其设置方法: 3.掌握通过表格来进行网页页面的布局方法. [实验环境] 连接互 ...

  9. 多测师_python基本介绍001

    python 一.python的介绍 python 是一门面向对象,解释型,动态类型语言 面向对象:在python中 一切皆为对象 解释型语言:边解释,边执行, 动态类型:就是检查是在运行才做的. 动 ...

  10. MeteoInfoLab脚本示例:格点数据散点图

    绘制格点数据的散点图,用scaterm函数. 脚本程序: f = addfile('D:/Temp/GrADS/model.ctl') ps = f['PS'][0,(10,60),(60,140)] ...