2.4 Các vấn đề tiếp cận
2.4.1 Đọc dữ liệu log mới sinh ra
Phương pháp 1: Lập lịch cho hệ thống quản lý log eLMS thực hiện truy vấn các files log cứ x phút một lần cho dữ liệu mới. Phương pháp đơn giản nhất là đọc file log và lặp qua tất cả các dòng từ thời điểm khai báo, cố gắng tìm kiếm những dòng log mới sinh ra trong x phút đó. Chúng ta phải thực hiện xác định các mốc điểm thời gian bắt đầu và nó sẽ chỉ ra những dòng log mới thêm trong x phút.
Có 2 cách xác định điểm thời gian:
Cách 1: Xác định điểm thời gian bắt đầu ghi log Start và kết thúc
ở thời điểm Start + x phút: Start = Điểm bắt đầu, End = Start + x*60
Cách 2: Xác định thời điểm kết thúc ghi log End (now) và bắt
đầu ở thời điểm End – x phút: End = Thời điểm kết thúc, Start = End –
x*60
Với 2 cách như trên, về mặt xử lý chung là giống nhau tuy nhiên sẽ khác nhau về cách xác định mốc là tham số và cũng khác nhau về mặt ý nghĩa. Với cách thứ nhất xác định thời điểm bắt đầu thực hiện đọc và xác định thời điểm kết thúc (có thể không phải là thời gian hiện tại) để lấy được dữ liệu sinh ra trong khoảng x phút. Còn với cách thứ hai, có nghĩa rằng đã có dữ liệu ghi vào trong x phút cuối cùng. Hệ thống sẽ thực hiện đọc và lấy dữ liệu đó mà không cần phải quan tâm tới thời điểm bắt đầu ghi log.
Để hình dung vấn đề này trong lập trình cơ bản sẽ tương tự như 2 đoạn mã sau:
@log= File.open( path ) @starting_at = (constant)
@log= File.open( path )
@ending_at = Time.parse( starting_at ) @starting_at = (@ending_at – x*60)
Phương pháp 2: Sử dụng lưu trữ tập tin trạng thái [1][14]
Như đã đề cập tới, để giảm tải gánh nặng cho hệ thống sinh ra log theo thời gian, thông thường sẽ có một vài công cụ quản lý trực tiếp ở mức độ từng máy riêng lẻ điển hình là Logrotate. Hàng ngày sau khi Logrote hoàn thành nhiệm vụ của mình, các file log trở lên có kích cỡ nhỏ hơn rất nhiều và việc tìm kiếm là rất nhanh và không tốn nhiều bộ nhớ. Sau mỗi lần đọc file, số dòng hoặc số bytes cuối cùng sẽ được ghi lại vào một tập tin trạng thái lưu trữ. Lần đọc file tiếp theo sẽ bắt đầu từ số dòng hay số bytes đã đánh dấu trở đi thay vì phải thực hiện đọc toàn bộ file log từ đầu đến cuối. Giải pháp này vượt trội về hiệu năng, ngay cả khi việc hệ thống quản lý giám sát log eLMS dừng và khởi động lại, thì cũng sẽ nhận ra trạng thái hiện tại và bắt đầu từ số dòng đánh dấu để tiếp tục công việc mà không mất bất cứ dữ liệu log nào mới được thêm. Tuy nhiên có một nhược điểm là khi file tập tin trạng thái bị mất hoặc thay đổi đường dẫn tập tin này thì toàn bộ trạng thái và vị trí hiện tại lưu trữ đã bị mất và phải đọc lại từ đầu. Việc trùng lặp dữ liệu log trong tình huống như vậy cũng được coi là chấp nhận được.
Có một phương pháp nữa là đọc ngược file và sử dụng cơ chế tương tự “tail – F”, tuy nhiên chúng ta cũng cần phải xác định khoảng thời gian tần suất lấy log, về cơ bản cũng giống như phương pháp đầu tiên nhưng sẽ hiệu quả hơn rất nhiều, bởi cách thức đọc bắt đầu từ cuối file.
Đối với việc giám sát các dữ liệu log mới sinh ra, trong hệ thống eLMS sử dụng đọc ngược file và do thời gian đọc cách nhau khoảng thời gian là x, trong x phút đó khối lượng dữ liệu sinh ra không phải là quá lớn, vì vậy việc đọc file và lấy dữ liệu log mới sinh ra rất là nhanh chóng và nhẹ nhàng. Nếu sử dụng phương pháp line by line ở đây được thì sẽ thấy được ngay rằng kết quả với hiệu suất thấp, tốn thời gian, vì phải đọc từ đầu file. Nếu sử dụng phương pháp nạp tất cả vào trong bộ nhớ, có những trường hợp dữ liệu sinh ra không lớn nhưng dung lượng của cả file lưu trữ là
rất lớn. Chúng ta gặp ngay lỗi “OutOfMemory” và không thể "đọc file. Và để hiệu quả cho việc lấy dữ liệu mới sinh ra này, eLMS sẽ sử dụng một khối bộ nhớ đệm để thực hiện đọc ngược file theo kích cỡ được cấu hình sẵn.