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 ...
Hãy thử CodeSite từ http://www.raize.com/DevTools/CodeSite/Default.asp –
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. –
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. –