asp.net core 虽然自带了日志,但是还是老牌Log4Net日志强大。ASP.NET Core有很好的扩展,可以把Log4net配置为类似为内置日志模块,
利用IOC,很好的在其他组件中使用
1 使用第三方组件 Microsoft.Extensions.Logging.Log4Net.AspNetCore,在nuget中搜索即可
2. 注册
public class Startup
{ public static ILoggerRepository repository { get; set; } 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) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } loggerFactory.AddLog4Net(); app.UseMvc(); }3. 使用
[Route("api/[controller]")]
public class ValuesController : Controller { private readonly ILogger log; public ValuesController(ILogger<ValuesController> logger) { this.log = logger; } // GET api/values [HttpGet] public IEnumerable<string> Get() { log.LogInformation("Get values using Log4net "); return new string[] { "value1", "value2","value3","value4" }; } // GET api/values/5 [HttpGet("{id}")] public string Get(int id) { log.LogInformation("Get values by id " + id.ToString() + " using log4net"); return "value test" +id.ToString(); } }}
配置文件 log4net.config
<?xml version="1.0" encoding="utf-8"?>
<configuration> <log4net> <root> <level value="ALL" /> <appender-ref ref="RollingFileAppender" /> </root> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="Logs\log.txt" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="1024KB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> </log4net></configuration>放在发布的根目录下即可。
注意:Microsoft.Extensions.Logging.Log4Net.AspNetCore 默认的配置文件名为log4net.config,并且配置文件的根节点log4net,
查看源码即可看到,上面的配置文件节点是我自己修改过后的,变成 log4netConfig["configuration"]["log4net"];
Microsoft.Extensions.Logging.Log4Net.AspNetCore 部分源码:
/// <summary>
/// The default log4net config file name. /// </summary> private const string DefaultLog4NetConfigFile = "log4net.config";
/// <summary>
/// Parses log4net config file. /// </summary> /// <param name="filename">The filename.</param> /// <returns>The <see cref="XmlElement"/> with the log4net XML element.</returns> private static XmlElement Parselog4NetConfigFile(string filename) { using (FileStream fp = File.OpenRead(filename)) { var settings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Prohibit }; var log4netConfig = new XmlDocument(); log4netConfig.Load(filename); using (var reader = XmlReader.Create(fp, settings)) { log4netConfig.Load(reader); } fp.Flush(); fp.Dispose(); return log4netConfig["log4net"]; } }
较好的做法是利用Common.logging +Log4net,还在实践中...
在windows 7上正常,未在Linux上验证..
参考文章:
http://www.cnblogs.com/linezero/p/log4net.html
https://dotnetthoughts.net/how-to-use-log4net-with-aspnetcore-for-logging/