Autofac ILogger Log4Net注入

faith team

前文

这两天自己写的同步任务脚本出现了问题,由于自己的懒惰,并没有打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)
//配置log4Net配置文件
.ConfigureLogging(loggingBuilder => {
loggingBuilder.AddLog4Net("log4net.config");
})
.ConfigureWebHostDefaults(webBuilder =>
{
// webBuilder.UseUrls("http://*:9015");
// webBuilder.UseNLog();
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>
<!-- Define some output appenders -->
<appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
<!--指定了日志文件的路径和名称为 App_Data/logs/logs.txt。-->
<file value="App_Data/logs/logs.txt" />
<!--追加日志内容-->
<appendToFile value="true" />

<!--防止多线程时不能写Log,官方说线程非安全-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

<!--可以为:Once|Size|Date|Composite-->
<!--Composite为Size和Date的组合-->
<rollingStyle value="Composite" />

<!--当备份文件时,为文件名加的后缀-->
<datePattern value="yyyyMM/yyyy-MM-dd.log" />

<!--日志最大个数,都是最新的-->
<!--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>
<!--:指定了日志的格式模式,例如 %date [%thread] %-5level %logger - %message%newline。-->
<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();
// 在这里配置你的日志提供程序,比如 Log4Net
//需要引入包
loggerFactory.AddLog4Net("log4net.config");
return loggerFactory;
}).SingleInstance();

构造函数注入代码

1
2
3
4
private readonly ILogger _logger;
public GjAreaService(ILoggerFactory loggerFactory) {
_logger = loggerFactory.CreateLogger<GjAreaService>();
}
  • Title: Autofac ILogger Log4Net注入
  • Author: faith team
  • Created at: 2023-12-15 11:21:05
  • Updated at: 2025-11-29 09:01:08
  • Link: https://redefine.ohevan.com/2023/12/15/20240118autofac/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments
On this page
Autofac ILogger Log4Net注入