一 簡介
無論是微服務還是其他任何分布式系統,都需要一個統一處理日志的系統,這個系統
必須有收集,索引,分析查詢的功能。asp
.net core自己的日志是同步方式的,正如文檔所言:
所以必須自己提供一個日志提供程序,那正如文檔所言,還有什么比kafka更合適的呢。
從kafka往后那就是elasticsearch kibana,那是自然而然的事情。
二 asp.net core 日志詳解
概念:
類別:類別是以使用的用途進行分類的,比如var log= LoggerFac.CreateLogger<Startup>();這一句,
以StartUp類的全名作為一個分類,還有一些內置的system,Microsoft,主要是為了更細粒度控制日志。
如果StartUp類出現了問題,打印日志就可以控制在StartUp這一類別下,為這個類別設置debug,
僅僅打印這個類別這個級別的日志信息,使用filter功能可以很容易控制。
日志級別:Trace,debug,info,warning,error等
Trace:因為可以看到組件內部運行狀況,而且會有很大安全隱患,所以不建議在生產開啟這個功能,
比如mysql lib庫的trace可以打印出數據庫連接字符串的。
日志提供程序:日志提供程序可以看作日志信息的的io重定向。
控制台:這個不用說了。
調試:就是debug,在 Linux 中,此提供程序將日志寫入 /var/log/message。
在windows中就是經典的System.Diagnostics.Debug功能,這是.net提供的調試功能,
非常詳細,在開發中非常有用,而且通過配置可以自定義存儲,比如一個log文件。
下面是vs中最常見的。
EventSource 提供程序在windows下可用,在linux下沒可用但是沒有相關事件,所以和沒用一樣。
Windows EventLog 提供程序和TraceSource 提供程序都是在windows環境下是使用。
三 開發
添加各種事件提供程序:因為是windows下所以EventSource事件是可以用的。
var host = new WebHostBuilder().ConfigureAppConfiguration((webHostBuild,configBuild) => { var env = webHostBuild.HostingEnvironment; configBuild.AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{env.EnvironmentName}.json" ,optional:true,reloadOnChange:true) .SetBasePath(Directory.GetCurrentDirectory()); }).ConfigureLogging((hostingContext, logging) => { logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")) .AddConsole() .AddDebug() .AddEventSourceLogger(); }).UseKestrel() .UseStartup<Startup>(); host.Start(); Console.ReadKey();
{ "Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } } }
日志配置:默認日志debug,system分類info級別,Microsoft分類是info級別。
這個LogLevel下的節點就是日志篩選功能。
{ "Logging": { "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } } }
windows運行效果:只給加console
testtesttest dbug: Walt.TestMcroServoces.Webapi.Startup[0] 服務配置完成 dbug: Microsoft.AspNetCore.Hosting.Internal.WebHost[3] Hosting starting info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0] User profile is available. Using 'C:\Users\Administrator\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. dbug: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[37] Reading data from file 'C:\Users\Administrator\AppData\Local\ASP.NET\DataProtection-Keys\key-7fc5773e-c3fa-4523-b57f-aee522ecc0c2.xml'. dbug: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[37] Reading data from file 'C:\Users\Administrator\AppData\Local\ASP.NET\DataProtection-Keys\key-b6c77378-6ca9-4d96-a5e2-f5952a8c2a6f.xml'. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[18] Found key {7fc5773e-c3fa-4523-b57f-aee522ecc0c2}. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[18] Found key {b6c77378-6ca9-4d96-a5e2-f5952a8c2a6f}. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver[13] Considering key {7fc5773e-c3fa-4523-b57f-aee522ecc0c2} with expiration date 2019-03-03 07:56:30Z as default key. dbug: Microsoft.AspNetCore.DataProtection.TypeForwardingActivator[0] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 dbug: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor[51] Decrypting secret element using Windows DPAPI. dbug: Microsoft.AspNetCore.DataProtection.TypeForwardingActivator[0] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.0.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 dbug: Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.CngCbcAuthenticatedEncryptorFactory[4] Opening CNG algorithm 'AES' from provider '(null)' with chaining mode CBC. dbug: Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.CngCbcAuthenticatedEncryptorFactory[3] Opening CNG algorithm 'SHA256' from provider '(null)' with HMAC. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider[2] Using key {7fc5773e-c3fa-4523-b57f-aee522ecc0c2} as the default key. dbug: Microsoft.AspNetCore.DataProtection.Internal.DataProtectionStartupFilter[0] Key ring with default key {7fc5773e-c3fa-4523-b57f-aee522ecc0c2} was loaded during application startup. info: Walt.TestMcroServoces.Webapi.Startup[0] infomation dbug: Microsoft.AspNetCore.Mvc.MvcJsonOptions[0] Compatibility switch AllowInputFormatterExceptionMessages in type MvcJsonOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch AllowCombiningAuthorizeFilters in type MvcOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch AllowBindingHeaderValuesToNonStringModelTypes in type MvcOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch AllowValidatingTopLevelNodes in type MvcOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch InputFormatterExceptionPolicy in type MvcOptions is using compatibility value MalformedInputExceptions for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch SuppressBindingUndefinedValueToEnumType in type MvcOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions[0] Compatibility switch AllowAreas in type RazorPagesOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions[0] Compatibility switch AllowMappingHeadRequestsToGetHandler in type RazorPagesOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcViewOptions[0] Compatibility switch SuppressTempDataAttributePrefix in type MvcViewOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory[12] Registered model binder providers, in the following order: Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BinderTypeModelBinderProvider
linux下docker運行效果:debug和 console
testtesttest dbug: Microsoft.AspNetCore.Hosting.Internal.WebHost[3] Hosting starting info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0] User profile is available. Using '/root/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver[53] Repository contains no viable default key. Caller should generate a key with immediate activation. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider[57] Policy resolution states that a new key should be added to the key ring. info: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[58] Creating key {0fe5f8aa-0875-4612-83aa-59df0ed4f0c8} with creation date 2018-12-18 19:04:09Z, activation date 2018-12-18 19:04:09Z, and expiration date 2019-03-18 19:04:09Z. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[32] Descriptor deserializer type for key {0fe5f8aa-0875-4612-83aa-59df0ed4f0c8} is 'Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[34] No key escrow sink found. Not writing key {0fe5f8aa-0875-4612-83aa-59df0ed4f0c8} to escrow. warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35] No XML encryptor configured. Key {0fe5f8aa-0875-4612-83aa-59df0ed4f0c8} may be persisted to storage in unencrypted form. info: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[39] Writing data to file '/root/.aspnet/DataProtection-Keys/key-0fe5f8aa-0875-4612-83aa-59df0ed4f0c8.xml'. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[23] Key cache expiration token triggered by 'CreateNewKey' operation. dbug: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[37] Reading data from file '/root/.aspnet/DataProtection-Keys/key-0fe5f8aa-0875-4612-83aa-59df0ed4f0c8.xml'. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[18] Found key {0fe5f8aa-0875-4612-83aa-59df0ed4f0c8}. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver[13] Considering key {0fe5f8aa-0875-4612-83aa-59df0ed4f0c8} with expiration date 2019-03-18 19:04:09Z as default key. dbug: Microsoft.AspNetCore.DataProtection.TypeForwardingActivator[0] Forwarded activator type request from Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 dbug: Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ManagedAuthenticatedEncryptorFactory[11] Using managed symmetric algorithm 'System.Security.Cryptography.Aes'. dbug: Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ManagedAuthenticatedEncryptorFactory[10] Using managed keyed hash algorithm 'System.Security.Cryptography.HMACSHA256'. dbug: Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider[2] Using key {0fe5f8aa-0875-4612-83aa-59df0ed4f0c8} as the default key. dbug: Microsoft.AspNetCore.DataProtection.Internal.DataProtectionStartupFilter[0] Key ring with default key {0fe5f8aa-0875-4612-83aa-59df0ed4f0c8} was loaded during application startup. info: Walt.TestMcroServoces.Webapi.Startup[0] infomation dbug: Microsoft.AspNetCore.Mvc.MvcJsonOptions[0] Compatibility switch AllowInputFormatterExceptionMessages in type MvcJsonOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch AllowCombiningAuthorizeFilters in type MvcOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch AllowBindingHeaderValuesToNonStringModelTypes in type MvcOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch AllowValidatingTopLevelNodes in type MvcOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch InputFormatterExceptionPolicy in type MvcOptions is using compatibility value MalformedInputExceptions for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcOptions[0] Compatibility switch SuppressBindingUndefinedValueToEnumType in type MvcOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions[0] Compatibility switch AllowAreas in type RazorPagesOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions[0] Compatibility switch AllowMappingHeadRequestsToGetHandler in type RazorPagesOptions is using compatibility value True for version Version_2_1 dbug: Microsoft.AspNetCore.Mvc.MvcViewOptions[0] Compatibility switch SuppressTempDataAttributePref
總結:asp.net core中集成了很多以前.net的日志和調試功能,有點混亂,linux目前能用的提供程序有console和debug,EventSource和事件查看器還有Trace只能在windows專用。上面日志有一些區別,所以加debug提供程序,在相同分類和都具有console提供程序下debug會多出一些信息,所以並不是每個提供程序都共享所有日志信息,根據提供程序不同,會有多余的一些日志信息被加進來。但是如上圖所示,並不影響,因為僅僅是一些系統級別的debug提供程序會多出一些信息,mvc模塊給出的信息完全一致。