重新整理 .net core 實踐篇—————日志系統之服務與日志之間[十六]


前言

前文介紹了一些基本思路,那么這里介紹一下,服務如何與配置文件配合。

正文

服務:

public interface ISelfService
{
	 void ShowLog();
}

public class SelfService : ISelfService
{
	public ILogger<SelfService> _Logger;

	public SelfService(ILogger<SelfService> logger)
	{
		_Logger = logger;
	}

	public void ShowLog()
	{
		_Logger.LogInformation("I am a log.");
	}
}

配置:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "Console": {
      "LogLevel": {
        "Default": "Information",
        "Program": "Trace",
        "loggerObj": "Debug"
      }
    }
  }
}

測試代碼:

static void Main(string[] args)
{
	IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
	configurationBuilder.AddJsonFile("appsettings.json",optional:false,reloadOnChange:true);
	var config = configurationBuilder.Build();

	IServiceCollection serviceCollection = new ServiceCollection();
	serviceCollection.AddSingleton<IConfiguration>(p=>config);
	serviceCollection.AddSingleton<ISelfService,SelfService>();
	serviceCollection.AddLogging(builder =>
	{
		builder.AddConfiguration(config.GetSection("Logging"));
		builder.AddConsole();
	});

	IServiceProvider service = serviceCollection.BuildServiceProvider();

	var selfService = service.GetService<ISelfService>();
	selfService.ShowLog();
	Console.ReadKey();
}

結果:

那么如何要配置單個服務的Logger級別呢?

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "Console": {
      "LogLevel": {
        "Default": "Information",
        "Program": "Trace",
        "loggerObj": "Debug",
        "ConfigureDemo.SelfService": "Error"
      }
    }
  }
}

設置這個ConfigureDemo.SelfService的值就可以。為什么這樣呢?

看ILogger 的實現類Logger:

public Logger(ILoggerFactory factory)
{
	if (factory == null)
	{
		throw new ArgumentNullException(nameof(factory));
	}

	_logger = factory.CreateLogger(TypeNameHelper.GetTypeDisplayName(typeof(T), includeGenericParameters: false, nestedTypeDelimiter: '.'));
}

這里會創建一個默認的TypeNameHelper.GetTypeDisplayName(typeof(T))的logger實例名字。

這個會獲取到全名,故而設置好全名,那么會去使用這個配置。

我們一般打印log的時候,要去輸出時間,建議這樣寫:

public class SelfService : ISelfService
{
	public ILogger<SelfService> _Logger;

	public SelfService(ILogger<SelfService> logger)
	{
		_Logger = logger;
	}

	public void ShowLog()
	{
		_Logger.LogInformation("I am a log.",DateTime.Now);
	}
}

效果如下:

_Logger.LogInformation("I am a log.",DateTime.Now);

這樣寫的好處因為我們的log有過濾機制,如果我們過濾不輸出,那么"I am a log."和DateTime.Now就不會去做拼接執行。

這也是一種延遲思想的表現。

以上只是個人整理,如有錯誤,望請指點。

下一節日志作用域


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM