前文
这两天自己写的同步任务脚本出现了问题,由于自己的懒惰,并没有打log的习惯,这一点以后需要改正。在三番五次排查错误,消耗了大部分的时间,现在我就在想我要是能打印日志,把异常抛出是不是就能发现的快一些。决定修改一下源代码,把ILogger给加上,但是我发现这个只是一个接口,具体实现需要一个实现类,比如Log4NetLogger,公司的代码是使用了Autofac来做容器管理的,没有在Autofac 的DI中注入ILogger,只在.net core默认的容器中注入了,这里我先展示一下默认注入的方式
program代码
1 2 3 4 5 6 7 8 9 10 11 12
| public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggingBuilder => { loggingBuilder.AddLog4Net("log4net.config"); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
|
如果要将日志以文件的形式存储到本地需要配置log4net.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| <?xml version="1.0" encoding="utf-8"?> <log4net> <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"> <file value="App_Data/logs/logs.txt" /> <appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Composite" />
<datePattern value="yyyyMM/yyyy-MM-dd.log" />
<maxSizeRollBackups value="20" />
<maximumFileSize value="3MB" />
<staticLogFileName value="true" />
<filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ALL" /> <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>
|
可是主要问题是,我只能在默认注入的情况下才能使用,我的服务类都是注入在autofac容器中的的,我就必须得将ILogger注入到autofac容器,为此消耗了一个下午加一个早上的时间,中间甚至都想把业务逻辑写到控制器里头去了,可是就在今天这个早晨被我发现了。
我的方法是注入ILoggerFactory,利用工厂模式直接创建出来。
autofac注册代码
1 2 3 4 5 6 7 8
| builder.Register<ILoggerFactory>(c => { var loggerFactory = new LoggerFactory(); loggerFactory.AddLog4Net("log4net.config"); return loggerFactory; }).SingleInstance();
|
构造函数注入代码
1 2 3 4
| private readonly ILogger _logger; public GjAreaService(ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<GjAreaService>(); }
|