2010-08-18 37 views
23

Tôi đang viết một tiện ích chuyển đổi tệp nhỏ. Các tệp được chuyển đổi tự động khi chúng được đưa vào một thư mục.Thêm/xóa tệp nhật ký trong khi chạy trong NLog

Tôi đang sử dụng NLog để đăng nhập. Bên cạnh tệp nhật ký trung tâm được cấu hình bằng cách sử dụng NLog.conf (và nhận tất cả thư được tạo), tôi muốn tạo một tệp nhật ký bổ sung cho mỗi tệp đầu vào, có tên tương tự và chứa tất cả các thông điệp tường trình được viết trong Quá trình chuyển đổi.

Rất tiếc, dường như tôi không thể tìm hiểu cách thêm đúng mục tiêu tệp mới cùng với quy tắc thích hợp trong thời gian chạy. Tôi muốn tất cả các đối tượng Logger ghi vào tệp nhật ký mới trong quá trình chuyển đổi.

tôi đã cố gắng một cái gì đó giống như

var logfile = new NLog.Targets.FileTarget(); 
logfile.FileName = fileName + ".log"; 
logfile.KeepFileOpen = true; 
logfile.Initialize(); 
var rule = new NLog.Config.LoggingRule("*", logfile); 
NLog.LogManager.Configuration.LoggingRules.Add(rule); 
NLog.LogManager.ReconfigExistingLoggers(); 
// 
// Proceed with converting file 
// 
logfile.Flush(); 
NLog.LogManager.Configuration.LoggingRules.Remove(rule); 
NLog.LogManager.ReconfigExistingLoggers(); 

Nhưng không có tập tin log được tạo ra.

Tôi đã làm gì sai? Bất kỳ ý tưởng?

Trả lời

47

Các bài thứ hai về chủ đề này dẫn tôi đến giải pháp: http://nlog-project.org/forum.html#nabble-td1685349

Bạn có để có được cấu hình NLog hiện nay, thực hiện thay đổi đối tượng LoggingConfiguration này, sau đó gán nó trở lại LogManager.Configuration.

Đây là mã tôi đã sử dụng:

LoggingConfiguration config = LogManager.Configuration; 

var logFile = new FileTarget(); 
config.AddTarget("file", logFile); 

logFile.FileName = fileName + ".log"; 
logFile.Layout = "${date} | ${message}"; 

var rule = new LoggingRule("*", LogLevel.Info, logFile); 
config.LoggingRules.Add(rule); 

LogManager.Configuration = config; 

logger.Info("File converted!"); 
+9

Các phù hợp với phân công lại là rất quan trọng: LogManager.Configuration = cấu hình; – habakuk

+2

Để làm rõ ** Dòng có gán lại là rất quan trọng: LogManager.Configuration = config; ** Điều này đúng vì cách NLog viết getters và setters cho thuộc tính Configuration. Nó không đẹp, nhưng nó phải được đặt lại với một đối tượng đã thay đổi; bạn không thể thay đổi trực tiếp tài sản. – zshift

+0

Tôi phải gán lại biến logger ở cuối để làm việc này: logger = LogManager.GetCurrentClassLogger(); – Henry

Các vấn đề liên quan