2012-11-15 24 views
9

Tôi có vấn đề này mà tôi cần phải giải quyết cho một trong các dự án của tôi. Tôi cần tạo một tệp nhật ký cho 3 dịch vụ khác nhau (đừng hỏi tại sao, sếp của tôi yêu cầu nó như thế này). Mỗi dịch vụ có thể có nhiều chủ đề cố gắng để đăng nhập thông tin vào tập tin, vì vậy câu hỏi của tôi là, cách tốt nhất để làm điều này là gì?Chia sẻ một logfile giữa nhiều dịch vụ (mỗi dịch vụ có nhiều luồng), làm thế nào?

Tôi có nên sử dụng mutex chung không? Một cái gì đó như thế này:

procedure LogToFile(fn, str: string); 
var 
    F: TextFile; 
begin 
    logMutex.Acquire; 
    try 
{$I+} 
    try 
     AssignFile(F, fn); 
     if FileExists(fn) then 
     Append(F) 
     else 
     Rewrite(F); 
     Writeln(F, DateTimeToStr(Now) + ': ' + str); 
     CloseFile(F); 
    except 
    end; 
{$I-} 
    finally 
     logMutex.Release; 
    end; 
end; 

initialization 
    logMutex := SyncObjs.TMutex.Create(nil, False,'some_global_mutex'); 

finalization 
    logMutex.Free; 

Bất kỳ ý tưởng nào tốt hơn?

Chỉnh sửa: Tôi có nên xây dựng một dịch vụ khác, dịch vụ nhật ký, chờ tin nhắn cần đăng nhập từ các dịch vụ khác và sau đó chỉ có một dịch vụ phải xử lý các tệp nhật ký? Nếu đây là một giải pháp tốt, cách tốt nhất để giao tiếp giữa các dịch vụ là gì? Tôi có thể sử dụng Indy ...

+3

Hãy thử CodeSite từ http://www.raize.com/DevTools/CodeSite/Default.asp –

+1

Công ty của tôi đã viết dịch vụ ghi nhật ký của riêng chúng tôi. Chúng tôi sử dụng đối tượng COM có chuỗi tự do để cho phép các ứng dụng đẩy thông điệp tường trình vào dịch vụ, sau đó nó xếp hàng và xóa các thông báo tới tệp nhật ký khi cần. Bạn cũng có thể xem xét sử dụng nhật ký Sự kiện Hệ thống Windows thay vì tệp văn bản thuần túy. Sau đó, các ứng dụng của bạn có thể gửi tin nhắn tới nhật ký đó thông qua 'ReportEvent()' và cho phép hệ điều hành xử lý tệp nhật ký thực tế cho bạn. –

+1

Tôi sẽ viết một dịch vụ logger riêng biệt sau đó sử dụng thông báo WM_COPYDATA của Windows để có ba dịch vụ của bạn gửi tin nhắn đến nó. Đặc biệt kể từ khi dịch vụ nhật ký đó có thể giữ cho tệp mở để chắp thêm. Liên tục mở tập tin trở nên chậm. Xin lỗi, tôi không phải là nơi tôi có quyền truy cập vào mã mẫu tại thời điểm này. –

Trả lời

3

Giải pháp của bạn bằng cách sử dụng một mutex được đặt tên sẽ hoạt động và chắc chắn là cách tiếp cận đơn giản nhất.

2

Trong một dự án lớn với khoảng 50-80 ứng dụng đang chạy trên nhiều Máy chủ đầu cuối (điều này làm cho việc đồng bộ hóa trở nên khó khăn), tôi đã thu thập tất cả bản ghi đầu ra thành tệp trung tâm.

Ứng dụng ghi đầu ra nhật ký vào máy chủ ứng dụng qua UDP, sử dụng mã nguồn mở Log4D framework và Internet Direct (Indy). Máy chủ ứng dụng có một ứng dụng máy chủ UDP đang chạy nhận các thông điệp tường trình và ghi chúng vào một tệp duy nhất.

Khi thông điệp tường trình bao gồm thông tin meta (tên nhật ký, vv), máy chủ ghi nhật ký vẫn có thể được định cấu hình để ghi tệp riêng biệt cho mỗi ứng dụng, ngoài tệp chính. Ví dụ, một số thông điệp tường trình được gửi từ máy khách có chứa dữ liệu hiệu suất cơ sở dữ liệu, chúng sẽ được ghi vào một tệp nhật ký riêng để sẵn sàng phân tích mà không cần các bước lọc tiếp theo.

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