• Asp.Net Core 进阶(二) —— 集成Log4net


      Asp.Net Core 支持适用于各种内置日志记录API,同时也支持其他第三方日志记录。在我们新建项目后,在Program 文件入口调用了CreateDefaultBuilder,该操作默认将添加以下日志记录提供程序:ConsoleLogger、DebugLogger、EventSourceLogger。

      在工作中笔者使用的最多的日志记录组件是log4net,接下来我们就来看一下在Asp.Net Core中怎么集成 log4net。

      首先我们需要添加 log4net 组件,通过Nuget安装 log4net 和 Microsoft.Extensions.Logging.Log4Net.AspNetCore。

      接着我们引入配置文件log4net.config,放在项目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="3MB" />
    
        <!--置为true,当前最新日志文件名永远为file节中的名字-->
        <staticLogFileName value="true" />
    
        <!--输出级别在INFO和ERROR之间的日志-->
        <filter type="log4net.Filter.LevelRangeFilter">
          <param name="LevelMin" value="ALL" />
          <param name="LevelMax" value="FATAL" />
        </filter>
    
        <!--必须结合起来用,第一个只过滤出WARN,第二个拒绝其它其它日志输出-->
        <!--
            <filter type="log4net.Filter.LevelMatchFilter">
                <param name="LevelToMatch" value="WARN" />
            </filter>
            <filter type="log4net.Filter.DenyAllFilter" />-->
    
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
        </layout>
      </appender>
    
    
      <!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL -->
      <root>
        <priority value="ALL"/>
        <level value="ALL"/>
        <appender-ref ref="rollingAppender" />
      </root>
    </log4net>

      然后在Program文件中进行配置日志,如果不需要使用ConsoleLogger,DebugLogger或EventSourceLogger,可以使用ClearProviders方法清空默认的日志记录组件,AddFilter是过滤掉系统自带的System,Microsoft开头的日志,LogLevel。具体做法参考以下代码

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
        .ConfigureLogging((context, loggingBuilder) =>
        {
            //loggingBuilder.ClearProviders();
            loggingBuilder.AddFilter("System", LogLevel.Warning);
            loggingBuilder.AddFilter("Microsoft", LogLevel.Warning);//过滤掉系统自带的System,Microsoft开头的,级别在Warning以下的日志
            loggingBuilder.AddLog4Net("config/log4net.config"); //会读取appsettings.json的Logging:LogLevel:Default级别
        })
        .UseStartup<Startup>();

      配置完log4net后,可以使用 ILoggerFactory 或者 ILogger<T> 来记录日志,具体做法如下,其中的ILoggerFactory可以替换成ILogger<Starup>。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory logFactory)
    {
        //ILogger logger = logFactory.CreateLogger(typeof(Log4NetLogger));
        ILogger logger = logFactory.CreateLogger<Startup>();
        logger.LogError("this is the first error");
        logger.LogInformation("this is the first info");
        logger.LogDebug("this is the first debug");
        logger.LogWarning("this is the first warning");
        logger.LogInformation(System.Diagnostics.Process.GetCurrentProcess().ProcessName);
    }

      上述是在Startup文件中调用日志,同样的在Controller中也可以调用日志进行记录。

    private readonly IStudentRepository _studentRepository;
    
    private readonly ILogger<HomeController> _logger;
    
    //构造函数注入
    public HomeController(IStudentRepository studentRepository,ILogger<HomeController> logger)
    {
        _studentRepository = studentRepository;
        _logger = logger;
    }

      如果要在Program中创建日志,则需要从DI容器中获取ILogger实列

    public static void Main(string[] args)
    {
      var
    host = CreateWebHostBuilder(args).Build();   var logger = host.Services.GetRequiredService<ILogger<Program>>();   logger.LogInformation("Seeded the database.");   host.Run();
    }

      

      

  • 相关阅读:
    WinForm开发中几种找控件的方法
    C#读取Excel文件时提示:无法指出的错误
    数据库中取随机记录的方法
    C#写数据到Excel
    从数据库导出数据到word、excel、.txt
    Telerik RadTreeView查寻值的方法
    如何导出WinForm 控件界面的矢量图
    简单数据缓存类(c#)
    Windows Installer 清理实用工具说明
    硬盘安装Win7全攻略
  • 原文地址:https://www.cnblogs.com/jesen1315/p/11067231.html
Copyright © 2020-2023  润新知