2009-11-24 27 views
9

Tôi đã kiểm tra điều này question, nhưng đó không phải là những gì tôi đang tìm kiếm.Triển khai tệp nhật ký kích thước cố định hoặc bộ đệm tròn trên đĩa

Tôi đang cố gắng để tìm ra cách để hạn kích thước file log của (nói, 10MB), và ngay sau khi nó được nhấn, một trong hai:

  • bắt đầu viết vào đầu, chứ không phải là phụ thêm, hoặc
  • giữ phụ thêm, nhưng xoá bỏ các nội dung từ đầu như tôi làm như vậy

Đừng thực sự quan tâm về ngôn ngữ - miễn là nó có thể :)


Lưu ý: Tôi biết về cách tiếp cận tệp nhật ký lăn (nhấn kích thước mục tiêu, đổi tên và tiếp tục ghi nhật ký). Tôi đang tìm cách tránh một cuộn.

+0

http://stackoverflow.com/a/9075604 – chocolateboy

Trả lời

3

Nếu bạn đang thực hiện cả hai tác giả và người đọc, sau đó bạn có thể làm một cái gì đó như thế này:

struct logentry { 
    timestamp ts; 
    char  msg [4000]; 
}; 

class logger { 
private: 
    int write_recordnum; // next record number to write 
    int max_recordnum; // controls maximum size of file 
    FILE *logfile; 

public: 
    logger (const char *filename, int max_records) 
    { 
     max_recordnum = max_records; 
     logfile = fopen (filename, "a+"); 
    } 

    void write_next_entry (const char *msg, ...) 
    { 
     struct logentry ent; 
     // format message into entry 
     va_list ap; 
     va_start (ap, msg); 
     vsnprintf (ent.msg, sizeof(ent.msg), msg, ap); 
     va_end (ap); 
     ent.ts = gettimestamp(); 

     // position logfile 
     if (write_recordnum > max_recordnum) 
      write_recordnum = 0; 

     fseek (logfile, write_recordnum * sizeof (ent), 0); 
     fwrite (&ent, 1, sizeof(ent), logfile); 
    } 

    bool read_entry (int recnum, char *msg) 
    { 
     struct logentry ent; 
     if (recnum >= max_recordnum) 
      return false; 
     fseek (logfile, recnum * sizeof (ent), 0); 
     fread (&ent, 1, sizeof(ent), logfile); 
     strcpy (msg, ent.msg); 
     return true; 
    } 
}; 

Ý tưởng là để quản lý một bộ đệm tròn bằng con số kỷ lục kích thước cố định rõ ràng. Cần thiết là logic để quản lý liệu bản ghi N tồn tại, và để kiểm tra lỗi.

+1

đề xuất nhận được ngoài băng là sử dụng bản ghi kích thước cố định và lưu trữ một lượng siêu dữ liệu ngắn ở phía trước tệp , cho biết bản ghi nào bắt đầu từ – warren

2

Tại sao không ghi logfiles? Nó có phải là chính xác 10MB? Nếu 10MB là hạn ngạch của bạn, một thực tế phổ biến là viết thư cho blah.log và khi nó truy cập, hãy nói 1MB, đổi tên tệp thành blah.log.1 và bắt đầu viết thư cho blah.log. Đơn giản hơn nhiều, và một thực tế rất phổ biến. Trong thực tế, trong Linux, nếu bạn sử dụng syslog, nó hoàn toàn miễn phí.

+2

có, tôi biết về việc ghi logfiles (và logrotate, v.v.) - Tôi đang tìm kiếm nhiều hơn nếu tôi có kích thước tuyệt đối không vượt quá, và tôi không muốn theo dõi Tôi đang ở trong, có một logfile tự lăn sẽ được tốt đẹp – warren

1

Nếu bạn đang sử dụng Log4 [j/net] có các tùy chọn cho nhật ký lăn. Xem RollingFileAppender. Ngoài ra, có một tùy chọn khi chỉ định các thuộc tính của tệp nhật ký để đặt kích thước tệp tối đa cho nhật ký. (Tham số: MaxFileSize)

+1

này xuất hiện để tự động lăn logfiles, nếu tôi đọc nó một cách chính xác - không lăn * bên trong * một logfile – warren

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