2011-01-19 23 views
6

Tôi có một ứng dụng đang chạy trên PC bảng điều khiển độc lập trong một kiosk (C#/WPF). Nó thực hiện một số thao tác ghi nhật ký điển hình cho một tệp văn bản. PC có một số dung lượng đĩa giới hạn để lưu trữ các nhật ký này khi chúng phát triển.Giữ các tệp nhật ký theo một kích thước nhất định

Điều tôi cần làm là có thể chỉ định kích thước tối đa mà tệp nhật ký được phép. Nếu, khi cố ghi vào nhật ký, kích thước tối đa bị vượt quá, dữ liệu mới sẽ được ghi vào cuối nhật ký và dữ liệu cũ nhất sẽ bị xóa ngay từ đầu.

Bắt kích thước tệp là không có vấn đề, nhưng có bất kỳ kỹ thuật thao tác tệp điển hình nào để giữ tệp dưới một kích thước nhất định không?

Trả lời

14

Một kỹ thuật để xử lý việc này là có hai tệp nhật ký có kích thước tối đa là một tệp nhật ký. Bạn chỉ cần xoay giữa hai khi bạn đạt đến kích thước tối đa của mỗi tệp. Quay sang một tập tin khiến nó bị ghi đè bằng một tập tin mới.

Khung đăng nhập như log4net có chức năng này được tích hợp sẵn.

4

Không có cách nào dễ dàng để tách dữ liệu khỏi đầu tệp. Vì vậy, bạn có một số tùy chọn:

  1. Hãy ghi nhật ký một số tệp nhật ký nhỏ hơn và xóa các khối "cũ nhất" nếu tổng kích thước của tất cả các tệp nhật ký vượt quá giới hạn của bạn. Điều này tương tự như những gì bạn muốn làm, nhưng ở cấp độ khác nhau
  2. Đổi tên tệp nhật ký thành "log.date" và bắt đầu nhật ký mới. Tương tự như (1) nhưng không phải là một tùy chọn nếu bạn có không gian đĩa hạn chế. Nếu bạn có đủ RAM và kích thước nhật ký của bạn tương đối nhỏ để phù hợp với bộ nhớ, bạn có thể làm như sau: ánh xạ toàn bộ tệp vào bộ nhớ bằng tệp Ánh xạ bộ nhớ, sau đó thực hiện thao tác di chuyển bằng cách lấy dữ liệu từ giữa các tập tin và di chuyển chúng đến đầu. Sau đó cắt bớt tập tin. Đây là cách duy nhất để dễ dàng tách dữ liệu khỏi đầu tệp nhật ký mà không cần tạo bản sao của nó.
+0

Tóm tắt các tùy chọn khả thi. – cc0

0

tôi sẽ không sử dụng này cho một tập tin có nghĩa là phải qua nói 1 Meg và nó không phải là terribly hiệu quả, nhưng nó hoạt động tốt nếu bạn cần giải quyết vấn đề rắc rối khi bạn cần một tệp nhật ký mà bạn không thể duy trì một cách thuận tiện. Đảm bảo tệp nhật ký tồn tại trước khi bạn sử dụng tệp này mặc dù ... hoặc bạn có thể thêm mã cho nó cũng như kiểm tra vị trí tồn tại, v.v.

// This is how to call it 
private void buttonLog_Click(object sender, EventArgs e) 
{ 
    c_Log.writeToFile(textBoxMessages.Text, "../../log.log", 1); 
} 


public static class c_Log 
{ 
    static int iMaxLogLength = 15000; // Probably should be bigger, say 200,000 
    static int iTrimmedLogLength = -1000; // minimum of how much of the old log to leave 

    static public void writeToFile(string strNewLogMessage, string strFile, int iLogLevel) 
    { 
     try 
     { 
      FileInfo fi = new FileInfo(strFile); 

      Byte[] bytesSavedFromEndOfOldLog = null; 

      if (fi.Length > iMaxLogLength) // if the log file length is already too long 
      { 
       using (BinaryReader br = new BinaryReader(File.Open(strFile, FileMode.Open))) 
       { 
        // Seek to our required position of what you want saved. 
        br.BaseStream.Seek(iTrimmedLogLength, SeekOrigin.End); 

        // Read what you want to save and hang onto it. 
        bytesSavedFromEndOfOldLog = br.ReadBytes((-1 * iTrimmedLogLength)); 
       } 
      } 

      byte[] newLine = System.Text.ASCIIEncoding.ASCII.GetBytes(Environment.NewLine); 

      FileStream fs = null; 
      // If the log file is less than the max length, just open it at the end to write there 
      if (fi.Length < iMaxLogLength) 
       fs = new FileStream(strFile, FileMode.Append, FileAccess.Write, FileShare.Read); 
      else // If the log file is more than the max length, just open it empty 
       fs = new FileStream(strFile, FileMode.Create, FileAccess.Write, FileShare.Read); 

      using (fs) 
      { 
       // If you are trimming the file length, write what you saved. 
       if (bytesSavedFromEndOfOldLog != null) 
       { 
        Byte[] lineBreak = Encoding.ASCII.GetBytes("### " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " *** *** *** Old Log Start Position *** *** *** *** ###"); 
        fs.Write(newLine, 0, newLine.Length); 
        fs.Write(newLine, 0, newLine.Length); 
        fs.Write(lineBreak, 0, lineBreak.Length); 
        fs.Write(newLine, 0, newLine.Length); 
        fs.Write(bytesSavedFromEndOfOldLog, 0, bytesSavedFromEndOfOldLog.Length); 
        fs.Write(newLine, 0, newLine.Length); 
       } 
       Byte[] sendBytes = Encoding.ASCII.GetBytes(strNewLogMessage); 
       // Append your last log message. 
       fs.Write(sendBytes, 0, sendBytes.Length); 
       fs.Write(newLine, 0, newLine.Length); 
      } 
     } 
     catch (Exception ex) 
     { 
      ; // Nothing to do... 
       //writeEvent("writeToFile() Failed to write to logfile : " + ex.Message + "...", 5); 
     } 
    } 
} 
Các vấn đề liên quan