如何将log4net配置写入appsettings.json?

如何将log4net配置写入appsettings.json?,log4net,asp.net-core-2.0,log4net-configuration,Log4net,Asp.net Core 2.0,Log4net Configuration,我已经在.netcore2.0中实现了log4net,以登录到文本文件。因为log4net有一个配置文件,其中包含XML配置。因此,我创建了一个单独的文件log4net.config来设置它的配置,它工作正常。但我想将其配置设置为appsettings.json。是否可以将log4net配置写入appsettings.json <appSettings> <add key="IsLog" value="True" /> <add key="MaxTh

我已经在
.netcore2.0
中实现了
log4net
,以登录到文本文件。因为log4net有一个配置文件,其中包含
XML配置
。因此,我创建了一个单独的文件
log4net.config
来设置它的配置,它工作正常。但我想将其配置设置为
appsettings.json
。是否可以将log4net配置写入
appsettings.json

<appSettings>
    <add key="IsLog" value="True" />
    <add key="MaxThreads" value="3" />
  </appSettings>
  <log4net debug="false">
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="./logs/logfile.txt" />
    <appendToFile value="false" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="-1" />
    <maximumFileSize value="50GB" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
</appender>   
  </log4net>

其中提到
log4net不支持Json项目
。是否可以将其配置写入
appsettings.json

也许这不是正确的方法,但无论如何,我设法在
appsettings.json
中使用了我的
log4net.config
。我把我的答案放在这里,这样如果有人不想在那个项目中使用额外的配置文件,它可以帮助他们

<appSettings>
    <add key="IsLog" value="True" />
    <add key="MaxThreads" value="3" />
  </appSettings>
  <log4net debug="false">
    <root>
      <level value="ALL" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="./logs/logfile.txt" />
    <appendToFile value="false" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="-1" />
    <maximumFileSize value="50GB" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
</appender>   
  </log4net>
因此,我所做的是将我的XML转换为JSON,并在我的
appSettings.JSON上使用JSON作为字符串,然后使用以下代码读取字符串

appSettings.json

使用
Newtonsoft.Json

此代码用于将JSON转换为XML,但它不会将XML内容作为元素提供,因此,我将其用作流。 为了将字符串转换为流,我使用了以下代码

        public static Stream GenerateStreamFromString(string s)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);
            writer.Write(s);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }
而且效果很好

在这里,我首先将
XML转换为JSON
,然后再次将
JSON转换为XML
将其用作
log4net配置
,但如果有人想使用XML 直接作为字符串,这样可以减少一些代码

如果您使用的是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"
        }
      }
    ]
  }
}
<?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>
您仍然需要log4net配置文件,其中包含要从appsettings.json覆盖的节点:

{
  "Log4NetCore": {
    "PropertyOverrides": [
      {
        "XPath": "/log4net/root/level",
        "Attributes": {
          //"value": "ALL"
          //"value": "DEBUG"
          //"value": "INFO"
          "value": "WARN"
          //"value": "ERROR"
          //"value": "FATAL"
          //"value": "OFF"
        }
      }
    ]
  }
}
<?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();
    }
}
使用Microsoft.AspNetCore.Builder;
使用Microsoft.AspNetCore.Hosting;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.DependencyInjection;
使用Microsoft.Extensions.Logging;
公营创业
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
//添加这些行
var loggingpoptions=this.Configuration.GetSection(“Log4NetCore”)
.Get();
loggerFactory.AddLog4Net(loggingOptions);
app.UseMvc();
}
}