首页 > 其他分享 >.netcore3.1使用log4net/nlog记录日志

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

时间:2022-11-23 09:34:34浏览次数:77  
标签:log4net logBuilder public nlog context logger 日志 netcore3.1

//.netcore 使用log4net替换ILooger实现
services.AddLogging(logBuilder =>
{
logBuilder.ClearProviders();
logBuilder.AddLog4Net("log4net.config");
});

 

使用log4net

第一步、在对应项目中引入log4net.Extensions.Logging

log4net.Extensions.Logging依赖于log4net,所以在引入时自动引入了log4net

第二步、创建log4net.config文件

详细的配置说明请参照文档:https://dotnetgreen.com/log4net-configuration/http://logging.apache.org/log4net/release/manual/configuration.html

创建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,记录日志

在startup.cs中注入log4net替换原有的日志组件

 //.netcore 使用log4net替换ILooger实现
            services.AddLogging(logBuilder =>
            {
                logBuilder.ClearProviders();
                logBuilder.AddLog4Net("log4net.config");
            });

记录日志

[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.Extensions.Logging

第二步、创建nlog.config文件

详细的配置说明请参照NLog官方文档https://github.com/nlog/nlog/wiki/Configuration-file

创建nlog.config文件,设置好日志记录规则信息,并将改文件设置成【始终复制】或者【如果较新则复制】

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

在startup.cs中注入NLog替换原来的日志组件

             services.AddLogging(logBuilder=> {
                 logBuilder.ClearProviders();
                 logBuilder.AddNLog();
             });

记录日志

[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)); //添加异常过滤
            });  

....
        }

 

 

源文:https://www.cnblogs.com/johnyong/p/12940700.html

标签:log4net,logBuilder,public,nlog,context,logger,日志,netcore3.1
From: https://www.cnblogs.com/shy1766IT/p/16917227.html

相关文章

  • .NET6使用NLog向文件、数据库写数据
    1.Nuget引入NLogNLog.Web.AspNetCoreNLog.Database(写入数据库使用)2.创建nlog.config注意数据库连接字符串需要配置TrustServerCertificate=True;不然会有认证问题......
  • log4net 的简单配置
    安装Nuget包▲这个没什么说的。log4net.config右键项目新建程序配置:log4net.config<?xmlversion="1.0"encoding="utf-8"?><configuration><configSections><!--......
  • log4net 的简单配置
    安装Nuget包▲这个没什么说的。log4net.config右键项目新建程序配置:log4net.config<?xmlversion="1.0"encoding="utf-8"?><configuration><configSections><!--......
  • 最长不下降子序列nlogn模板
     #include<bits/stdc++.h>usingnamespacestd;intd[100011],n,len,a[100011];intmain(){//freopen(".in","r",stdin);//freopen(".out","w",stdou......
  • MySQL Binlog 的配置
    binlog简介binlog是一个二进制格式的文件,用于记录用户对数据库增量操作的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记......
  • MySQL 通过 binlog 日志恢复数据
    binlog日志,即binarylog,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日......
  • log4net 的简单配置
    安装Nuget包▲这个没什么说的。log4net.config右键项目新建程序配置:log4net.config<?xmlversion="1.0"encoding="utf-8"?><configuration><configSections......
  • Asp.Net Core中使用日志组件log4net
    我们在开发任何项目过程中,记录各种日志是太正常不过的事情。没有日志记录的项目,也不可能放心进入生产环境运行。因此日志的记录,是必须要做的。在.NET开发中,log4net是个常......
  • 【MySQL(二十一)】binlog 事件
    binlog时机事务提交时写入binlog,但是binlog持久化到磁盘与sync_binlog参数有关:0:只fwrite写入操作系统cache,由操作系统决定什么时候持久化到磁盘,及fsync;1:fsync直接写入磁盘;n:......
  • NetCore3.1引入Nlog
    十年河东,十年河西,莫欺少年穷学无止境,精益求精Net6引入Nlog请参考:https://www.cnblogs.com/chenwolong/p/nlog.html项目引入:<PackageReferenceInclude="NLog"V......