2017-08-31 10 views
11

में ASP.NET कोर 2.0 जब में सांत्वना और डिबग वालों निकालें ASP.NET कोर 2.0 हम CreateDefaultBuilder(args) कई उपयोगी चूक है इसउत्पादन मोड

public static IWebHost BuildWebHost(string[] args) => 
    WebHost.CreateDefaultBuilder(args) 
     .UseStartup<Startup>() 
     .Build(); 

यही है। हालांकि यह contains this:

.ConfigureLogging((context, logging) => { 
    logging.AddConfiguration(context.Configuration.GetSection("Logging")); 
    logging.AddConsole(); // HERE IS THE PROBLEM 
    logging.AddDebug();  // HERE IS THE PROBLEM 
}) 

तो सांत्वना और डीबग लॉगिंग प्रदाताओं हमेशा पंजीकृत हैं।

मुझे लगता है मैं कैसे निकाल/उन्हें अपंजीकृत है जब उत्पादन मोड में चल रहा उन्हें इस

if (env.IsDevelopment()) 
{ 
    // register them here 
} 

तरह रजिस्टर करने के लिए प्रयोग किया जाता है? मेरा मतलब लॉगिंग स्तर को बदलना नहीं है, मेरा मतलब है कि मैं उन्हें उत्पादन मोड में बिल्कुल पंजीकृत नहीं करना चाहता हूं।

+0

'CreateDefaultBuilder' को एक नई परियोजना सेटअप (कुल सामानों की कुल संख्या) को कम करने के लिए बनाया गया था। अंतिम 2.0 से पहले कोई 'डिफॉल्टबिल्डर' नहीं था। मैं आपको उस स्रोत कोड से कोड कॉपी करने का सुझाव दूंगा जो आपने अभी लिंक किया है और इसे स्वयं से बदल दिया है, जैसा कि मैंने कहा था, 'CreateDefaultBuilder' इस चरण को कम करने के लिए है। एक नज़र डालें कि यह पहले कैसे किया गया था: https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/index#rely-on-plication-insights-light-up-features । सादर। – dime2lo

+0

@ dime2lo मुझे उम्मीद है कि मुझे ऐसा करने की ज़रूरत नहीं है। उत्पादन मोड के दौरान लॉगिंग को छोड़कर, मैं डिफ़ॉल्ट से खुश हूं। निश्चित रूप से उन विशेष पंजीकरणों को पूर्ववत करने का एक तरीका है। – grokky

उत्तर

11

मैं कहूंगा कि तैयार किया गया तरीका यह है लॉगिंग विन्यास बदलने नहीं द्वारा किया जाएगा उन प्रदाताओं को कुछ भी लॉग इन करने के लिए। लेकिन मैं समझता हूं कि आप उत्पादन के लिए किसी भी कॉल को हटाना चाहते हैं; और आप अभी भी कोड में इसे ठीक से कर सकते हैं।

आप बस HostBuilderContextConfigureLogging लैम्ब्डा के लिए पारित हो जाता है कि से होस्टिंग वातावरण पहुँच सकते हैं:

.ConfigureLogging((context, logging) => 
{ 
    logging.AddConfiguration(context.Configuration.GetSection("Logging")); 

    if (context.HostingEnvironment.IsDevelopment()) 
    { 
     logging.AddConsole(); 
     logging.AddDebug(); 
    } 
}); 

जाहिर है, इस अकेले पूर्ववत करने के लिए क्या CreateDefaultBuilder कॉल पहले से ही स्थापित करने में मदद नहीं करता है। सबसे पहले, आपको उन प्रदाताओं को अनधिकृत करने की आवश्यकता होगी।

.ConfigureLogging((context, logging) => 
{ 
    // clear all previously registered providers 
    logging.ClearProviders(); 

    // now register everything you *really* want 
    // … 
}); 

यह this logging issue on GitHub के जवाब में पेश किया गया था: के लिए, आप नए ILoggingBuilder.ClearProviders विधि का उपयोग कर सकते हैं।

1

मुझे लगता है कि आप CreateDefaultBuilder का उपयोग नहीं कर सकते हैं या लॉगलेवल को किसी को भी सेट नहीं कर सकते हैं। दस्तावेज़ों के अनुसार आप इसका उपयोग कर सकते हैं।

public static void Main(string[] args) 
{ 
var webHost = new WebHostBuilder() 
    .UseKestrel() 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
    .ConfigureAppConfiguration((hostingContext, config) => 
    { 
     var env = hostingContext.HostingEnvironment; 
     config.AddJsonFile("appsettings.json", optional: true, 
reloadOnChange: true) 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", 
optional: true, reloadOnChange: true); 
     config.AddEnvironmentVariables(); 
    }) 
    .ConfigureLogging((hostingContext, logging) => 
    { 


logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); 
     logging.AddConsole(); 
     logging.AddDebug(); 
    }) 
    .UseStartup<Startup>() 
    .Build(); 

webHost.Run(); 
} 

कैसे प्रदाताओं धारा https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging?tabs=aspnetcore2x

मिला एक और विकल्प जोड़ें, बस अपने appsettings.json

"Logging": { 
"IncludeScopes": false, 
"LogLevel": { 
    "Default": "Debug", 
    "System": "Information", 
    "Microsoft": "Information" 
}, 
"Console": { 
    "LogLevel": { 
    "Default": "None" 
    } 
} 

} में कंसोल के लिए एक लॉगिंग फ़िल्टर जोड़ने के लिए,

+0

हाँ, हमने यह 1.1 में कैसे किया।मैं डिफ़ॉल्ट रखना चाहता हूं, लेकिन उन रजिस्ट्रेशन को पूर्ववत करना, एक तरीका होना चाहिए। – grokky

+0

मुझे ऐसा करने का एकमात्र तरीका है, उस वर्ग को अपने कोड के साथ ओवरराइड करना होगा। मुझे पहचान पासवर्ड हैशर के लिए ऐसा करना पड़ा। –

0

मैं इस कोशिश की नहीं किया खुद, बस एक विचार हालांकि। एक स्थिर संपत्ति public static IHostingEnvironment Environment { get; set; } घोषित करने और इस पर आधारित प्रोप लॉगिंग जोड़ने .. फिर अपरीक्षित कोड :) यह अपने जोखिम पर उपयोग करें

public static IHostingEnvironment Environment { get; set; } 

    public Startup(IHostingEnvironment env) 
    { 
      Environment = env; 
    } 

    public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
      .UseIISIntegration() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseKestrel() 
      .UseStartup<Startup>() 
      .ConfigureLogging(factory => 
      { 
       if (Environment.IsDevelopment()) 
       { 
        factory.AddConsole(); 
        factory.AddDebug(); 
       } 
      }) 
      .Build(); 
} 
+0

यह काम नहीं करेगा। लॉगिंग कॉन्फ़िगरेशन अब 'वेबहोस्टबिल्डर' का हिस्सा है क्योंकि लॉगिंग बहुत शुरुआत से ही है। इसलिए 'स्टार्टअप' इंस्टेंस लॉगिंग कॉन्फ़िगरेशन प्रतिनिधि चलाने के बाद बनाया गया है, जो 'स्टार्टअप' प्रकार के लिए पर्यावरण नाम के साथ प्रतिनिधि को प्रदान करना असंभव बनाता है। - इसके अलावा, एक स्थिर चर में सामान भंडारण एक हैक की तरह है। सौभाग्य से, एक बेहतर तरीका है :) – poke

संबंधित मुद्दे