2013-06-17 33 views
6

Có thể thay đổi tên của tệp nhật ký cho trình đăng ký trong khi ứng dụng đang chạy không? Nó sẽ được thực hiện một vài lần/ngày.Thay đổi tên của tệp nhật ký một vài lần trong khi chạy

Tôi sẽ cố gắng xây dựng thêm một chút nữa: ứng dụng của tôi viết chương trình cơ sở trên thiết bị. Tất cả các thiết bị mà người dùng đã làm việc trên đều nằm trong một mạng lưới. Người dùng có thể bắt đầu trình hướng dẫn viết mới hoặc có thể tiếp tục hoặc khởi động lại tác vụ trên thiết bị đã bắt đầu. Điều tôi muốn làm là lưu nhật ký tất cả các bước do người dùng thực hiện cho một thiết bị nhất định.

Ví dụ: khi người dùng hoạt động trên thiết bị AB0124, tôi muốn ghi vào tệp nhật ký có tên AB0124.log. Khi anh ấy kết thúc làm việc trên thiết bị đó và khởi động trên thiết bị XY5618 Tôi muốn ghi lại những hành động đó trong XY5618.log

Tôi đã đọc rằng có thể sử dụng ngữ cảnh (herehere và nhiều bài đăng khác) , nhưng bạn phải thiết lập thuộc tính trước khi tạo logger. Vì vậy, thay vì tạo một trình ghi nhật ký trong lớp, tôi tạo một trình ghi trong phương thức của tôi sau khi thiết lập thuộc tính. Nhưng cho đến nay, không có gì được ghi lại.

Khi tôi đặt tên tệp được mã hóa cứng trong cấu hình, nó hoạt động. Tôi có thiếu một số thứ ở đây không?

Log4Net.config:

<appender name="StepsLogAppender" type="log4net.Appender.FileAppender"> 
    <filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="INFO"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file type="log4net.Util.PatternString" value="%property{LogPathModifier}" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{dd/MM/yyyy - HH:mm:ss} - %message%newline" /> 
    </layout> 
</appender> 

<root> 
    <level value="ALL" /> 
    <appender-ref ref="StepsLogAppender" /> 
</root> 

C#:

public void WriteStepInfo(string device, int step) 
{ 
    log4net.ThreadContext.Properties["LogPathModifier"] = string.Format("D:\\StepsDevice_{0}.txt", device); 
    var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
    log.Info(string.Format("Device {0} - step {1}.", device, step)); 
} 

Và trong AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

Trả lời

7

Câu trả lời của Peter đưa tôi đi đúng hướng, nhưng tôi đã thực hiện nó bằng mã thay vì chỉnh sửa và lưu tệp cấu hình.

public void WriteStepInfo(string device, int step) 
{ 
    var h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository(); 
    foreach (IAppender a in h.Root.Appenders) 
    { 
     if (a.Name == "StepsLogAppender") 
     { 
      FileAppender fa = (FileAppender)a; 
      var logFileLocation = string.Format(".\\Logs\\Device_{0}.log", device); 

      fa.File = logFileLocation; 
      fa.ActivateOptions(); 
      break; 
     } 
    } 

    Log.Info(string.Format("Device {0} - step {1}. Different file for each device", device, step)); 
} 
+0

Cảm ơn ví dụ. Chính xác những gì tôi cần! – AngieM

+0

Đây là triển khai tốt nhất mà tôi đã tìm thấy ... Cảm ơn bạn ... – Emerson

1

Yo u có thể mở tập tin log4net.config từ ứng dụng của bạn và thay đổi tên. Sau đó lưu tệp (log4net.config) và tệp nhật ký sẽ được thay đổi.

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