一、NuGet添加2個包:json
Microsoft.Extensions.Logging.Log4Net.AspNetCoreapi
log4net.Kafka.Coreapp
二、Program裏修改CreateWebHostBuilder:測試
public class Program { public static void Main(string[] args) { System.Threading.ThreadPool.SetMinThreads(200, 200); // NLogBuilder.ConfigureNLog("Config/nlog.config"); // NLogBuilder.ConfigureNLog("Config/nlog.config").GetCurrentClassLogger(); CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args). ConfigureLogging((context, loggingbuilder) => { //該方法須要引入Microsoft.Extensions.Logging名稱空間 loggingbuilder.AddFilter("System", LogLevel.Warning); //過濾掉系統默認的一些日誌 loggingbuilder.AddFilter("Microsoft", LogLevel.Warning);//過濾掉系統默認的一些日誌
//最好帶上這句話
loggingbuilder.SetMinimumLevel(LogLevel.Debug); //var path = Directory.GetCurrentDirectory() + "\\log4net.config"; //不帶參數:表示log4net.config的配置文件就在應用程序根目錄下,也能夠指定配置文件的路徑 loggingbuilder.AddLog4Net("Config/log4net.config"); }) .UseStartup<Startup>(); }
添加配置文件:在Config目錄下建立log4net.config,內容以下:ui
<?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name="KafkaAppender" type="log4net.Kafka.Core.KafkaAppender, log4net.Kafka.Core"> <KafkaSettings> <broker value="地址1:端口,地址2:端口,地址3:端口" /> <topic value="kafka的topic" /> </KafkaSettings> <layout type="log4net.Kafka.Core.KafkaLogLayout,log4net.Kafka.Core" > <appid value="sysName" /> </layout> </appender> <root> <level value="ALL"/> <appender-ref ref="KafkaAppender" /> </root> </log4net>
broker: Kafka 服務地址,集羣可以使用,分割;
topic:日誌對應的 Topic 名稱;
appid:服務惟一標識,輔助識別日誌來源;spa
接下來就能夠直接使用了:日誌
using Microsoft.Extensions.Logging;code
[Route("api/[controller]")] public class ValuesController : Controller { private readonly ILogger _logger; public ValuesController(ILogger<ValuesController> logger) { _logger = logger; } // GET api/values [HttpGet] public IEnumerable<string> Get() { _logger.LogInformation("根據appId最後一次測試Kafka!"); return new string[] { "value1", "value2" }; } }
上線後發現會有記錄不下來的狀況。解決方法:orm
appsettings.json文件裏有建立項目時候,自動了默認日誌級別(Warning)。須要改掉:xml
"Logging": { "LogLevel": { "Default": "Information", "System": "Warning", "Microsoft": "Warning" }
使用注入的方式,有時候用起來不是很方便,我仍是比較喜歡封裝個Helper類:
using log4net; using log4net.Config; using log4net.Repository; using System; using System.Diagnostics; using System.IO; using System.Text; namespace Common { /// <summary> /// Helper類 /// </summary> public class LogHelper { private static ILoggerRepository repository { get; set; } private static ILog _log; private static ILog log { get { if (_log == null) { Configure(); } return _log; } } public static void Configure(string repositoryName = "NETCoreRepository", string configFile = "Config/log4net.config") { repository = LogManager.CreateRepository(repositoryName); XmlConfigurator.Configure(repository, new FileInfo(configFile)); _log = LogManager.GetLogger(repositoryName, ""); } /// <summary> /// /// </summary> /// <param name="message"></param> /// <param name="e"></param> public static void Debug(string message, Exception e = null) { log.Debug(GetCurrentMethodFullName() + " " + message, e); } public static void Info(string message, Exception e = null) { log.Info(GetCurrentMethodFullName() + " " + message, e); } public static void Warn(string message, Exception e = null) { log.Warn(GetCurrentMethodFullName() + " " + message, e); } public static void Error(string message, Exception e = null) { log.Error(GetCurrentMethodFullName() + " " + message, e); } public static void Fatal(string message, Exception e = null) { log.Fatal(GetCurrentMethodFullName() + " " + message, e); } private static string GetCurrentMethodFullName() { try { StringBuilder sb = new StringBuilder(); StackTrace stackTrace = new StackTrace(); return string.Concat(stackTrace.GetFrame(2).GetMethod().DeclaringType.ToString(), ".", stackTrace.GetFrame(2).GetMethod().Name); } catch { return ""; } } } }
這樣,就能夠在任意地方使用了: