web-dev-qa-db-ja.com

log4net構成をappsettings.jsonに書き込む方法は?

テキストファイルにログインするために、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設定です。

私はこれを発見しました questionlog4net don't support Json projectsと記載されています。その構成をappsettings.jsonに書き込むことは可能ですか?.

10
DevProf

多分それは正しい方法ではないかもしれませんが、とにかくlog4net.configappSettings.jsonを使用することができました。私はここに私の回答を記載します。そうすれば、プロジェクトで追加の構成ファイルを使用したくない場合に役立ちます。

だから私がやったことは[〜#〜] xml [〜#〜][〜#〜] json [〜#〜]に変換し、 [〜#〜] json [〜#〜]appSettings.jsonの文字列として、その後、次のコードを使用して文字列を読み取ります。

appSettings.json

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

Json to [〜#〜] xml [〜#〜]Newtonsoft.Jsonを使用した変換

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

このコードは[〜#〜] json [〜#〜][〜#〜] xml [〜#〜]に変換するために使用されますが、 Elementという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 to JSONを変換し、次にJSON to XMLlog4net configとして使用するように変換していましたが、誰かがXMLを文字列として直接使用したい場合は、コードを削減します。

4
DevProf

Microsoft.Extensions.Logging.Log4Net.AspNetCore nugetパッケージを使用する場合、log4netの構成をappsettings.jsonに保持する方法があります(ただし、正直、あまり使い道がありません)。

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"
        }
      }
    ]
  }
}

それでも、appsettings.jsonからオーバーライドするノードを含むlog4net構成ファイルが必要です。

<?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();
    }
}
0
Stas Boyarincev