2015-09-06 11 views
5

मैं वेब एपी 2 और ओविन का उपयोग करके अपने ऐप में लॉगिंग जोड़ने की कोशिश कर रहा हूं, इसलिए मैंने माइक्रोसॉफ्ट ओविन लॉगिंग का उपयोग करना शुरू किया, जिसके लिए ILogger और ILoggerFactory की आवश्यकता होती है, जिसे कार्यान्वित किया गया है और जब मुझे STARTUP के अंदर कुछ भी लॉग इन करने की आवश्यकता होती है तो यह बहुत अच्छा काम करता है विधि या Owin Middleware घटकों के किसी भी।माइक्रोसॉफ्ट Owin लॉगिंग - वेब एपीआई 2 - मैं लकड़हारा कैसे बनाऊं?

उदाहरण के लिए, जब मैं Startup विधि में हूँ मैं का उपयोग कर लकड़हारा बना सकते हैं:

public void Configuration(IAppBuilder app) 
    { 
     // Creates configuration 
     var configuration = new HttpConfiguration(); 

     // Configure WebApi Settings 
     WebApiConfig.Register(configuration); 

     app.SetLoggerFactory(new OwinLog4NetLoggerFactory("Default")); 

     var logger = app.CreateLogger<Startup>(); 
     logger.WriteInformation("test log"); 

     // Enabled WebApi in OWIN 
     app.UseWebApi(configuration); 
    } 

कहाँ "OwinLog4NetLoggerFactory" मेरे कस्टम ILoggerFactory कार्यान्वयन है।

अभी तक, बहुत अच्छा ... लेकिन ... जब मैं वास्तविक वेब एपीआई एक्शन विधि में हूं तो मैं लॉगर कैसे बना सकता हूं? ... मैंने Request.GetOwinEnvironment() तक पहुंचने का प्रयास किया और लॉगर फ़ैक्टरी शब्दकोश में नहीं है ।

उदाहरण के लिए:

public class AccountController : ApiController 
{ 
    public int Get(int id) 
    { 
     // Create logger here 

     return id + 1; 
    } 
} 

मैं जानता हूँ कि मैं एपीआई नियंत्रक से लकड़हारा जोड़ने के लिए लॉगर फैक्टरी या यहाँ तक कि इंजेक्शन के लिए एक संदर्भ के साथ एक स्थिर वर्ग बना सकते हैं, लेकिन यह है कि कुछ करने के लिए जटिल लगता है कि ऐसा करना चाहिए पहले से ही वहाँ हो।

कोई भी विचार की सराहना की जाएगी।

+0

किसी को भी वास्तविक उत्तर दे सकते हैं:

<common> <logging> <factoryAdapter type="Common.Logging.NLog.NLogLoggerFactoryAdapter, Common.Logging.NLog41"> <arg key="configType" value="FILE" /> <arg key="configFile" value="~/NLog.config" /> </factoryAdapter> </logging> </common> 

यहाँ कुछ अतिरिक्त लिंक हैं: तो फिर अपने web.config में, आप अपने NLog विन्यास का उपयोग करने के Common.Logging कॉन्फ़िगर करेंगे मूल पोस्टर का सवाल? नीचे दिया गया एक जवाब वह नहीं है जो उसने पूछा था। –

उत्तर

-1
बजाय हर विधि में प्रवेश कोड जोड़ने के बाद

, मैं एक MessageLoggingHandler कि Global.asax.cs में एक बार पंजीकृत किया जा सकता बनाने के लिए, और यह तो हर अनुरोध और प्रतिक्रिया लॉग करता है।

पहले एक MessageHandler वर्ग कि DelegationHandler से विरासत बनाएँ::

यहाँ कोड है कि मैं का उपयोग करें, आप अपने आवश्यकताओं के अनुसार संशोधित कर सकते हैं है

public abstract class MessageHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var corrId = Guid.NewGuid(); 
     var requestMethod = request.Method.Method.ToString(); 
     var requestUri = request.RequestUri.ToString(); 
     var ipAddress = request.GetOwinContext().Request.RemoteIpAddress; 

     var requestMessage = await request.Content.ReadAsByteArrayAsync(); 
     await LogMessageAsync(corrId, requestUri, ipAddress, "Request", requestMethod, request.Headers.ToString(), requestMessage, string.Empty); 

     var response = await base.SendAsync(request, cancellationToken); 

     var responseMessage = await response.Content.ReadAsByteArrayAsync(); 
     await LogMessageAsync(corrId, requestUri, ipAddress, "Response", requestMethod, response.Headers.ToString(), responseMessage, ((int)response.StatusCode).ToString() + "-" + response.ReasonPhrase); 

     return response; 
    } 

    protected abstract Task LogMessageAsync(Guid CorrelationId, string APIUrl, string ClientIPAddress, string RequestResponse, string HttpMethod, string HttpHeaders, byte[] HttpMessage, string HttpStatusCode); 

} 

public class MessageLoggingHandler : MessageHandler 
{ 
    protected override async Task LogMessageAsync(Guid CorrelationId, string APIUrl, string ClientIPAddress, string RequestResponse, string HttpMethod, string HttpHeaders, byte[] HttpMessage, string HttpStatusCode) 
    { 
     // Create logger here 

     //Do your logging here 
    } 
} 
फिर अपने Global.asax.cs में

,

GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageLoggingHandler()); 

बस इतना याद रखें, यह, हर अनुरोध और प्रतिक्रिया प्रवेश करेंगे होगा पूर्ण संदेश के मुख्य भाग: आपने ऊपर बनाया MessageLoggingHandler रजिस्टर करने के लिए की जरूरत है। यह अंतरिक्ष के एक बहुत बहुत जल्दी ले (अपने एपीआई के उपयोग के आधार पर) कर सकते हैं। तो आपको इसे ट्विक करने की आवश्यकता हो सकती है (उदाहरण के लिए - एक महीने या उससे अधिक के लिए रिकॉर्ड रखें, या 200-ठीक प्रतिक्रियाएं इत्यादि को अनदेखा करें)

+2

आपको बहुत धन्यवाद, दुर्भाग्यवश मुझे प्रत्येक अनुरोध/प्रतिक्रिया (एफवाईआई, ओविन दुनिया में लॉग इन करने की आवश्यकता नहीं है, आप आमतौर पर मिडलवेयर के माध्यम से ऐसा करते हैं)। मुझे लॉगर बनाने की ज़रूरत है क्योंकि मुझे कुछ क्रियाओं में "कुछ डीबग या चेतावनी संदेश" लॉग करने की आवश्यकता है। आपकी प्रतिक्रिया के लिए फिर से धन्यवाद। – Daniel

1

मैं आपके मिडलवेयर लिखने की अनुशंसा करता हूं ताकि आप नियंत्रक के बाहर लॉगिंग को संभाल सकें:

public class LoggingMiddleware : OwinMiddleware 
{ 
    public LoggingMiddleware(OwinMiddleware next) 
     : base(next) 
    { 
    } 

    public override async Task Invoke(IOwinContext context) 
    { 
      //handle request logging 

      await Next.Invoke(context); 

      //handle response logging 
    } 

} 
फिर स्टार्टअप कक्षा में

:

public class Startup 
{ 
    // ReSharper disable once UnusedMember.Global 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 

     config.MapHttpAttributeRoutes(); 
     appBuilder.Use<LoggingMiddleware>(); 
     appBuilder.UseWebApi(config); 
    } 
} 

अनुरोध तो में आते हैं,, LoggingMiddleware में अनुरोध लॉगिंग कोड मारा नियंत्रक कोड मारा और उसके बाद की प्रतिक्रिया पर LoggingMiddleware पर लॉग इन करना होगा वापसी का रास्ता।

हालांकि, अगर तुम सब करने की इच्छुक रहे हैं नियंत्रक से मिडलवेयर से के माध्यम से एक वस्तु भेज है आप नियंत्रक में मिडलवेयर में context.Set("loggingObject", loggingObject); और फिर var loggingObject = Request.GetOwinContext().Get<LoggerClass>("loggingObject"); उपयोग कर सकते हैं।

संपादित करें: तय एक}

+0

धन्यवाद सैम, लेकिन यह केवल मुझे कॉल करने से पहले और नियंत्रक को कॉल के बाद लॉगिन करने देता है ... नियंत्रक के अंदर नहीं। मैं प्रत्येक नियंत्रक/कक्षा के अंदर Log4Net का उपयोग कर समाप्त हुआ .... जैसा कि ट्रेवर द्वारा अनुशंसित किया गया है, मैं लॉगिंग अबास्ट्रक्शन का उपयोग कर सकता हूं, इसलिए मुझे Log4Net पर प्रत्यक्ष निर्भरता बनाने की आवश्यकता नहीं है, लेकिन मैं आंतरिक लॉगिंग अबास्ट्रक्शन का उपयोग करना चाहता था माइक्रोसॉफ्ट ओविन लॉगिंग। धन्यवाद। – Daniel

0

मैं अपने अनुप्रयोगों में Common.Logging पुस्तकालय, NuGet पर उपलब्ध का उपयोग कर की सिफारिश करेंगे। सामान्य। लॉगिंग आपको अपने पसंदीदा लॉगिंग समाधान का उपयोग करने के लिए एक आम इंटरफेस देता है। यह आपके जैसे कई मुद्दों को हल करता है। यहाँ NLog साथ Common.Logging का उपयोग कर एक उदाहरण है:

अपने नियंत्रक में, आप तो जैसे उस तक पहुँच जाएगा:

public class MyController : ApiController 
    { 
    private static readonly ILog Log = LogManager.GetLogger<MyController>(); 

    public async Task<IHttpActionResult> Get([FromUri] int id) 
    { 
     Log.Debug("Called Get with id " + id.ToString()); 
     return Ok(); 
    } 
    } 

(NuGet पर नवीनतम Common.Logging.NLog पैकेज उठाओ इस लेखन के रूप में , यह सामान्य होना चाहिए। लॉगिंग.NLog41)।

https://github.com/net-commons/common-logging

https://cmatskas.com/an-introduction-to-common-logging-api-2/

+0

धन्यवाद ... मैं प्रत्येक नियंत्रक वर्ग में सीधे लॉग 4नेट का उपयोग कर समाप्त हुआ, लेकिन विचार बिल्ड-इन लॉगिंग अबास्ट्रक्शन ("अन्य" पैकेज नहीं) का उपयोग करना था। धन्यवाद! – Daniel

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