テキストファイルにログインするために、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.config
でappSettings.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 XML
をlog4net config
として使用するように変換していましたが、誰かがXMLを文字列として直接使用したい場合は、コードを削減します。
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();
}
}