zoukankan      html  css  js  c++  java
  • ASP.NET Core 3.1使用log4net/nlog/Serilog记录日志

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

    在大多数情况下,Serilog的延迟是NLog的延迟的一半,吞吐量是其两倍。测试链接

    使用NLog

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

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

    nlog.config文件示例

    具体的配置说明 可以参考 https://www.cjavapy.com/article/183/ 

    <?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="Info">
      <!-- 启用.net core的核心布局渲染器 -->
      <extensions>
        <add assembly="NLog.Web.AspNetCore" />
      </extensions>
      <!-- 写入日志的目标配置 archiveAboveSize="102400" maxArchiveDays="60" -->
      <targets>
        <!-- 调试  -->
        <target xsi:type="File" name="debug" fileName="../logs/debug-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
        <!-- 警告  -->
        <target xsi:type="File" name="warn" fileName="../logs/warn-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
        <!-- 错误  -->
        <target xsi:type="File" name="error" fileName="../logs/error-${shortdate}.log" layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
        <!-- 控制台  -->
        <target xsi:type="Console" name="console" layout="${message}" />
      </targets>
      <!-- 映射规则 -->
      <rules>
        <!-- 调试  -->
        <logger name="*" minlevel="Trace" maxlevel="Debug" writeTo="debug" />
        <!--<logger name="*" minlevel="Trace" writeTo="console" />-->
        <!-- 警告  -->
        <logger name="*" minlevel="Info" maxlevel="Warn" writeTo="warn" />
        <!-- 错误  -->
        <logger name="*" minlevel="Error" maxlevel="Fatal" writeTo="error" />
        <!--跳过不重要的微软日志-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
      </rules>
    </nlog>

    第三步、代码中注入NLog

    只需修改program.cs

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

    四. 控制器里使用

    /// <summary>
            /// 日志
            /// </summary>
            private readonly ILogger<DemoController> _logger;
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="logger"></param>
            public DemoController(ILogger<DemoController> logger)
            {
                _logger = logger;
            }
    
            public IActionResult Test()
            {
                _logger.LogError("我是日志内容");
                return Ok("ok");
            }

    使用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="loglog.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("这是一个简单日志测试");
                 
            }
        }

     使用Serilog

    添加 Nuget 引用

    Serilog.AspNetCore日志包主体

    Serilog.Sinks.RollingFile 将日志写入文件

    日志记录器的四种级别(Log4j)的要求

    • error   错误信息(较严重)
    • warn   警告级别的信息(不严重)
    • info     需要持续输出的信息(无论调试还是发布状态)
    • debug 需要在调试过程中输出的信息,但发布后是不需要的(当然发布后,也是看不到的)

    级别由上自下依次降低

    appsettings.json 中添加 Serilog 节点

    {
      "Serilog": {
        "WriteTo": [
          {
            "Name": "RollingFile",
            "Args": {
              "pathFormat": "logs\{Date}.txt",
              "RestrictedToMinimumLevel": "Warning"
            }
          },
          {
            "Name": "Console"
          }
        ],
        "MinimumLevel": {
          "Default": "Debug",
          "Override": {
            "Microsoft": "Information",
            "System": "Information" 
          }
        } 
      },
    }

    简单说明下配置文件的意思:

    • 将日志写入RollingFile(文件)和Console(控制台)。
    • RollingFile 的具体配置:记录文件到 根目录/logs/{日期}.txt 文件内,每天记录一个文件,并且只记录 Warning 及其以上的日志;
    • 默认日志级别记录 Debug 及其以上的日志。
    • 如果日志包含 Microsoft System ,只记录级别为 Information 及以上的日志。

    修改 program.cs,注册 Serilog

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            }).UseSerilog((context, configure) =>
            {
                configure.ReadFrom.Configuration(context.Configuration);
            });

     简单配置完成,现在可以在项目中方便的使用 Serilog 了。

    private readonly ILogger<HomeController> _logger;
    
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }
    
    public IActionResult Index()
    {
        _logger.LogError("Error 测试");
        return View();
    }

    更多详情

    https://www.cnblogs.com/diwu0510/p/12828519.html

  • 相关阅读:
    org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)
    快速制作gif动图
    Linux中安装Oracle11g后出现监听的问题及解决办法
    navicat连接不上Linux服务器上的MySQL
    lapacke svd实例
    ubuntu lapack安装与使用
    python numpy访问行列元素的方法
    numpy opencv matlab eigen SVD结果对比
    相似变换 SimilarityTransform 以及skimage源码
    OpenCV仿射变换+投射变换+单应性矩阵
  • 原文地址:https://www.cnblogs.com/netlock/p/13359248.html
Copyright © 2011-2022 走看看