asp.netcore Log4Net鏈接kafka的方法

一、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 "";
            }
        }
    }
}

這樣,就能夠在任意地方使用了:

相關文章
相關標籤/搜索