一 简介
无论是微服务还是其他任何分布式系统,都需要一个统一处理日志的系统,这个系统
必须有收集,索引,分析查询的功能。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:UsersAdministratorAppDataLocalASP.NETDataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. dbug: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[37] Reading data from file 'C:UsersAdministratorAppDataLocalASP.NETDataProtection-Keyskey-7fc5773e-c3fa-4523-b57f-aee522ecc0c2.xml'. dbug: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[37] Reading data from file 'C:UsersAdministratorAppDataLocalASP.NETDataProtection-Keyskey-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模块给出的信息完全一致。