【问题标题】:How to write log4net config into appsettings.json?如何将 log4net 配置写入 appsettings.json?
【发布时间】:2018-08-29 06:23:33
【问题描述】:

我已将log4net 实现为.NET core 2.0,以登录文本文件。由于 log4net 有一个配置文件,其中包含 XML configuration。所以,我创建了一个单独的文件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 配置。

我发现了这个question,其中提到了log4net don't support Json projects。是否可以将其配置写入appsettings.json

【问题讨论】:

    标签: log4net asp.net-core-2.0 log4net-configuration


    【解决方案1】:

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

    所以我所做的就是将我的 XML 转换为 JSON 并在我的appSettings.json 之后使用 JSON 作为字符串我使用下面的代码来读取字符串。

    appSettings.json

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

    JsonXML 转换使用Newtonsoft.Json

     string xmlElement = _configuration["ConnectionStrings:LoggerConfig"];
     XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(xmlElement);
     XmlConfigurator.Configure(logRepository, GenerateStreamFromString(doc.InnerXml));
    

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

            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 to JSONJSON to XML 转换为 将其用作log4net config,但如果有人想要,请使用 XML 直接作为字符串,所以会减少一些代码。

    【讨论】:

      【解决方案2】:

      如果您使用Microsoft.Extensions.Logging.Log4Net.AspNetCore nuget 包,有一种方法可以将 log4net 配置保存在 appsettings.json 中(但老实说不是很有用)。

      您可以从 log4net 配置文件写入 appsettings.json(或 appsettings.Environment.json 用于不同环境)覆盖节点的规则。

      Documentation

      从 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 1970-01-01
        • 2016-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多