मैं अपना आवेदन बंद करना चाहता हूं और लंबित लॉग संदेश लिखना चाहता हूं। तो मैं अपनी शट डाउन प्रक्रिया के दौरान LogManager.Flush()
पर कॉल करता हूं। हालांकि, मुझे लिखे गए सभी संदेश नहीं दिखते हैं। इसके बजाय, अगर मैं कुछ सेकंड प्रतीक्षा करता हूं (Thread.Sleep()
का उपयोग करके) मैं संदेश देखता हूं।फ्लश() कहलाते समय एनएलओजी AsyncTargetWrapper में सभी कतारबद्ध संदेशों को फ्लश करना चाहिए?
NLog's code on GitHUB की जांच करने के बाद, मुझे लगता है कि AsyncTargetWrapper.FlushAsync()
विधि केवल आलसी लेखक थ्रेड को अगले बैच पर सभी लंबित संदेशों को लिखने के लिए शेड्यूल कर रही है। यह लॉग संदेशों को समकालिक रूप से लिख नहीं रहा है।
इस अपेक्षित व्यवहार है? मुझे LogManager.Flush()
समकालिक होने की उम्मीद है, यानी: सभी लंबित संदेशों को लिखे जाने तक ब्लॉक करने के लिए (या टाइमआउट पार हो गया है)।
कोड मैं शटडाउन होने पर का उपयोग करें:
LogManager.Flush(ex => { }, TimeSpan.FromSeconds(15));
और फिर कोड Nlog आरंभ करने के लिए (यह एक Silverlight अनुप्रयोग है, तो मैं किसी भी config फ़ाइलों का उपयोग नहीं कर रहा हूँ)।
public static void InitialiseNLog(LogLevel forLevel)
{
var config = new LoggingConfiguration();
// Add targets.
// We need an async target wrapping a custom web service call back to the server.
var serverTarget = new RemoteServiceTarget();
var asyncWrapper = new AsyncTargetWrapper(serverTarget, 10000, AsyncTargetWrapperOverflowAction.Discard);
asyncWrapper.TimeToSleepBetweenBatches = (int)TimeSpan.FromSeconds(2).TotalMilliseconds;
asyncWrapper.BatchSize = 200;
// Add rules.
var rule = new LoggingRule("Company.Application.SilverlightApp.*", forLevel, asyncWrapper);
config.LoggingRules.Add(rule);
// Activate the configuration.
LogManager.Configuration = config;
LogManager.GlobalThreshold = forLevel;
}
परिणाम FlushAsync समारोह सिंक हो जाते हैं ;-) यह एक ठीक नहीं है। –
यह अब थोड़ा पुराना है, इसलिए मैं पूरे संदर्भ को याद नहीं कर सकता। लेकिन शट डाउन पर 'थ्रेड स्लीप()' को कॉल करना शायद ही बेहतर विकल्प है। वर्तमान एनएलओजी में 'LogManager.Shutdown()' विधि है, जो एक बेहतर विकल्प हो सकता है (हालांकि मैंने इसका परीक्षण नहीं किया है)। – ligos