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

23

我已将log4net实现到了.NET Core 2.0中,用于记录到文本文件中。由于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>

这是我的XML配置。

我在这个问题中发现了提到log4net不支持Json项目。是否可以将其配置编写到appsettings.json中。

2个回答

7
也许这不是正确的方法,但无论如何我成功将log4net.config用于appSettings.json。我在此分享我的解决方案,如果有人不想为其项目使用额外的配置文件,则可以参考一下。所以我转换了我的XMLJSON,并将JSON作为字符串添加到appSettings.json中,之后使用以下代码读取该字符串。

appSettings.json

{
  "ConnectionStrings": {
    "LoggerConfig": "Config string"
  }
}

使用Newtonsoft.Json将Json转换为XML
 string xmlElement = _configuration["ConnectionStrings:LoggerConfig"];
 XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(xmlElement);
 XmlConfigurator.Configure(logRepository, GenerateStreamFromString(doc.InnerXml));

这段代码用于将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作为字符串,那么它可以减少一些代码。


4
如果您使用Microsoft.Extensions.Logging.Log4Net.AspNetCore nuget包,有一种方法可以在appsettings.json中保留log4net配置(但老实说不太实用)。
您可以将规则写入appsettings.json(或appsettings.Environment.json以适应不同的环境),以覆盖来自log4net配置文件的节点。 文档 从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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接