Tôi muốn tắt ứng dụng của mình và viết bất kỳ thông điệp tường trình đang chờ xử lý nào. Vì vậy, tôi gọi LogManager.Flush()
trong quá trình tắt máy của tôi. Tuy nhiên, tôi không thấy tất cả các tin nhắn được viết ra. Thay vào đó, nếu tôi đợi một vài giây (sử dụng Thread.Sleep()
), tôi sẽ thấy các tin nhắn.NLog có nên xóa tất cả các thư được xếp hàng đợi trong AsyncTargetWrapper khi Flush() được gọi không?
Sau khi kiểm tra NLog's code on GitHUB, tôi tìm thấy phương pháp AsyncTargetWrapper.FlushAsync()
chỉ lập lịch trình chuỗi ghi chú lười để viết tất cả thư đang chờ xử lý vào đợt tiếp theo. Nó không phải là viết tin nhắn đăng nhập đồng bộ.
Đây có phải là hành vi mong đợi không? Tôi mong đợi LogManager.Flush()
sẽ được đồng bộ, tức là: chặn cho đến khi tất cả các thư đang chờ xử lý được ghi (hoặc quá thời gian chờ bị vượt quá).
Mã tôi sử dụng trên shutdown:
LogManager.Flush(ex => { }, TimeSpan.FromSeconds(15));
Và sau đó mã để khởi nLog (đây là một ứng dụng Silverlight, vì vậy tôi không sử dụng bất kỳ tập tin 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;
}
Kết quả FlushAsync chức năng trở thành đồng bộ ;-) Đây không phải là một sửa chữa. –
Đây là một chút cũ, vì vậy tôi không thể nhớ toàn bộ ngữ cảnh. Nhưng việc gọi 'Thread.Sleep()' khi tắt máy hầu như không phải là một lựa chọn tốt hơn. Có một phương thức 'LogManager.Shutdown()' trong NLog hiện tại, có thể là một lựa chọn tốt hơn (mặc dù tôi chưa thử nghiệm nó). – ligos