暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

DotNet开发跳槽 2021-07-22
827

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

                }
                }
                复制

                复制

                 使用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

                    使用Elmah 

                    这个使用超级简单

                    1. 添加ElmahCore的NuGet包


                    2. 注册Elmah服务

                      services.AddElmah();    //默认配置
                      复制

                          3.配置路径,默认配置下:日志在/Elmah路径,如      http://localhost:1996/elmah

                       

                        services.AddElmah(option =>
                        {
                        option.Path = "/elm";  //设置路径
                        });
                        复制

                        Elmah的记录方式有三种:

                        MemoryErrorLog、XmlFileErrorLog、SqlErrorLog,分别是内存记录,文件(XML)记录,数据库记录,以上为内存记录,劣势:一旦应用程序重启,之前记录的信息将会消失,适合测试用。文件记录:每一个报错日志信息生成一个xml文件,需要进行一定配置:

                          services.AddElmah<XmlFileErrorLog>(option =>   //使用泛型的重载Add方法
                          {
                          string path = Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName;
                          option.Path = "/elm";
                          option.LogPath = path; //设置存放文件的路径
                          });
                          复制

                          出处1:https://www.cnblogs.com/netlock/p/13359248.html

                          出处2:https://www.icode9.com/content-1-586132.html


                          版权申明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。


                          支持小微:

                          腾讯云 搞活动了?玩服务器的可以搞搞。就这几天时间。

                          轻量  1C2G6M 60GB SSD盘297元/3年

                          链接:https://curl.qcloud.com/bR8ycXZa



                          右下角,您点一下在看图片

                          小微工资涨1毛

                          商务合作QQ:185601686



                          文章转载自DotNet开发跳槽,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                          评论