我在使用 Log4NET 与 ASP.NET 7.0 时遇到问题,它不会写入我的日志文件,但他会创建日志文件并写入控制台。 所以我读了很多关于程序集参考、log4net 布局模式等的内容,但没有任何效果。在 StartupBase 中,我通过传递 log4net.config 来配置 Log4Net。 找到 log4net.config ,我通过重命名来测试它。 重命名后,文件也发生了变化。所以,我认为配置文件已找到。
StartUpBase.cs
public class StartUpBase
{
public ILog Logger { get; set; }
public void ConfigureServiceBase(IServiceCollection services)
{
var repo = LogManager.CreateRepository(
Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
XmlConfigurator.Configure(repo, new FileInfo("log4net.config"));
Logger = LogManager.GetLogger(typeof(StartUpBase));
services.AddSingleton(typeof(ILog), Logger);
}
}
Startup.cs
public class Startup : StartUpBase
{
public Startup(IWebHostEnvironment env, IConfiguration configuration) : base(env, configuration)
{
}
public void ConfigureServices(IServiceCollection services)
{
ConfigureServiceBase(services);
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
}
}
程序.cs
class ServiceTemplate
{
static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
根控制器
[ApiController]
[Route("api/[controller]")]
public class Root : Controller
{
public Root(ILogger<Root> Logger)
{
Logger.LogDebug("Hello DEBUG");
Logger.LogInformation("Hello DEBUG");
Logger.LogWarning("Hello DEBUG");
Logger.LogError("Hello DEBUG");
}
}
log4net
<log4net debug="true">
<root>
<level value="ALL" />
<appender-ref ref="Console" />
<appender-ref ref="RollingFile" />
</root>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="C:\Repository\ShareSoftware\Logs\ServiceTemplate.log" />
<staticLogFileName value="true" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="5MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<!-- Pattern to output the caller's file name and line number -->
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
</log4net>
我找到原因了。在我的 StartUpBase 中,我将一个 Logger 实例从 ILog (Log4Net) 类型绑定到 service.AddSingleton(...)。在我的控制器中,在构造函数中绑定了 ILogger (Microsoft.Extensions.Logging)。这是其他 Logger 库,因此无法工作。经过这个小修复后,它就可以工作了:
public Root(ILog Logger)
{
Logger.Debug("Hallo DEBUG");
Logger.Info("Hallo DEBUG");
Logger.Warn("Hallo DEBUG");
Logger.Error("Hallo DEBUG");
}