zoukankan      html  css  js  c++  java
  • NetCore2.x 使用Log4Net(一)

    前言:本章仅仅是Log4Net的基本简单的运用,后续章节会按照我的项目使用情况进行深入研究

    1.项目搭建

    • 新建一个基于.netCore2.x的Web项目          =>   过程略
    • 给新建项目安装log4net包(NuGet安装 )  => 过程略

    2.添加配置文件 log4Net.config

     配置文件路径暂时就放在根目录,我怕到时候读取不到(尽量少给自己找事)

    2.1 配置文件内容

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <log4net>
        <root>
            <level value="ALL" />
            <appender-ref ref="RollingFile" />
        </root>
        <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
          <!--文件路径 如果不设置(去掉 value="Log")会默认保存到[App_Data]文件夹中-->
          <param name="File" value="Log"/>
          <!--追加到文件-->
          <param name="AppendToFile" value="true"/>
          <!--最多保留的文件数,设为"-1"则不限-->
          <param name="MaxSizeRollBackups" value="365"/>
          <!--写到一个文件-->
          <param name="StaticLogFileName" value="false"/>
          <!--文件名,按日期命名-->
          <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
          <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
          <param name="RollingStyle" value="Date"/>
          <!--日志格式-->
          <layout type="log4net.Layout.PatternLayout">
          <!--%newline输出的日志会换行 [%date{HH:mm:ss fff}]表示记录的时间   -->
            <conversionPattern value="[%date{HH:mm:ss fff}] %- %message%newline" />
          <!--如果想自己设置格式就只需要-->
          <!--<conversionPattern value="%message"/>-->
          </layout>
        </appender>
      </log4net>
    </configuration>

    ps:看不懂没关系,先用起来再说,没有直观体验,说了没有用

    2.2  注册Log4Net服务

    • 实现方式一

    这是我看了网上大多数实现方式,是在 Startup.cs 中创建一个静态变量 ,然后在其它类中调用这个静态方法获取Log对象,如下:

        public class Startup
        {
            public static ILoggerRepository repository { get; set; }
    public Startup(IConfiguration configuration) { Configuration = configuration; repository = LogManager.CreateRepository("NETCoreRepository"); // 指定配置文件 XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); } } public class HomeController : Controller { private ILog log; public HomeController(IHostingEnvironment hostingEnv) { this.log = LogManager.GetLogger(Startup.repository.Name, typeof(HomeController)); } public IActionResult Index() { log.Error("测试日志"); return View(); } }

    ps: 我在想,既然都在使用netcore 为啥不将 ILog 注入的服务中,构造函数注入直接获得呢。其实最大的可能就是在获取 Log实例的时候传入一个参数 typeof(HomeController),请移驾到该博客

      https://blog.csdn.net/lixwjava/article/details/45950559

    在我的项目中,会对写日志进行二次封装,对输出格式会有一定规定,所以,我会将Log 直接注入service中,如何封装将在后续博客中详细分析。

    • 实现方式二

    在 Startup.cs 文件的 ConfigureServices 方法中添加代码,结果如下

            public void ConfigureServices(IServiceCollection services)
            {
                services.Configure<CookiePolicyOptions>(options =>
                {
                    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                    options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
                var repository = LogManager.CreateRepository("NETCoreLogRepository");
                XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
                services.AddSingleton<ILog>(LogManager.GetLogger(repository.Name, typeof(Startup)));
            }        

    创建分为三步:

    a.创建一个Log4Net 仓库  repository

    b.指定该仓库的配置文件路径

    c.创建一个Log 实例 注入到 Service中

      2.2  使用方法

      项目中需要写日志的地方直接构造函数注入,代码如下:

        public class HomeController : Controller
        {
            public readonly ILog _log;
            public HomeController(ILog log)
            {
                _log = log;
                _log.Info("This is Info Info");
            }
        }

       以上,最简单的使用方式。下篇将介绍如何根据不同日志等级写入不同的文件中。

      后记:后来想了一想,其实我们可以在将  ILoggerRepository 注入到services中而不是将ILog注入,在使用的地方就可以动态指定typeof,以便跟踪对象,反正就是不想用静态变量,如下: 

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            var repository = LogManager.CreateRepository("NETCoreLogRepository");
            XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
            services.AddSingleton<ILoggerRepository>(repository));
        }
        public class HomeController : Controller
        {
            public readonly ILog _log;
            public HomeController(ILoggerRepository repository)
            {
                _log = LogManager.GetLogger(repository.Name,typeof(HomeController));
                _log.Info("This is Info Info");
            }
        }
  • 相关阅读:
    艾伟_转载:ASP.NET缓存 狼人:
    艾伟_转载:VS 2010 和 .NET 4.0 系列之《在VS 2010中查询和导航代码》篇 狼人:
    艾伟_转载:Visual Studio DSL 入门 2 狼人:
    艾伟_转载:VS 2010 和 .NET 4.0 系列之《代码优化的Web开发Profile》篇 狼人:
    艾伟_转载:对ArrayList中的自定义类型进行搜索 狼人:
    艾伟_转载:总结字符串比较函数 狼人:
    poj 2739 Sum of Consecutive Prime Numbers
    BBIT工作感想(二)
    Zenoss4.2.3对中文事件的部分支持修改
    第五周项目一(扩展)矩形类
  • 原文地址:https://www.cnblogs.com/NemoWork/p/11330001.html
Copyright © 2011-2022 走看看