[我在ASP.NET 5.0 features上阅读了Scott Gu的博客,博客中提到的新功能之一是使用json文件作为配置并消除了Web.config文件。
我对该功能没有什么疑问。
假定我具有以下log4net配置,该配置先前已在ASP.NET的早期版本中添加到Web.Config中
配置文件
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<log4net debug="true">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\\TestProj\\TestLog.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
如何在config.json中添加节?
如何将上面的xml转换并添加到config.json中?
第3方库(在我的示例中为log4net)或库的用户是否必须添加某种类型的自定义转换api以支持基于json的配置,以便利用ASP.NET 5.0中提供的新配置功能?
最近,我对log4net
遇到了同样的问题。我设法做到了如下:
创建包含log4net的配置部分的log4net.xml
文件
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
...
</log4net>
您可以将文件放在项目根文件夹中。
并且在Startup.Startup()
方法中,您可以配置提供XML作为配置的log4net
:
public Startup(IApplicationEnvironment appEnv)
{
// ...
XmlConfigurator.Configure(new FileInfo(Path.Combine(appEnv.ApplicationBasePath, "log4net.xml")));
}
我希望这会有所帮助。
当前的log4net版本不支持Json项目,因此配置必须位于单独的xml文件中。
如果使用Microsoft.Extensions.Logging.Log4Net.AspNetCore nuget包,有一种方法可以将log4net配置保留在appsettings.json中(但实际上不是很有用)。
您可以写入覆盖从log4net配置文件中的节点的规则到appsettings.json(或针对不同环境的appsettings.Environment.json)中。
从appsettings.json设置日志记录级别的示例。
appsettings.json:
{
"Log4NetCore": {
"PropertyOverrides": [
{
"XPath": "/log4net/root/level",
"Attributes": {
//"value": "ALL"
//"value": "DEBUG"
//"value": "INFO"
"value": "WARN"
//"value": "ERROR"
//"value": "FATAL"
//"value": "OFF"
}
}
]
}
}
您仍然需要log4net配置文件,以及要从appsettings.json中覆盖的节点:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
<file value="example.log" />
<appendToFile value="true" />
<maximumFileSize value="100KB" />
<maxSizeRollBackups value="2" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="DebugAppender" />
<appender-ref ref="RollingFile" />
</root>
</log4net>
Startup.cs中的注册:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// Add these lines
var loggingOptions = this.Configuration.GetSection("Log4NetCore")
.Get<Log4NetProviderOptions>();
loggerFactory.AddLog4Net(loggingOptions);
app.UseMvc();
}
}