2011-11-16 21 views
34

Tôi đã tạo chương trình dịch vụ Windows và tôi muốn lỗi của mình được ghi hoàn toàn vào bản ghi sự kiện Windows. Vì vậy, tôi làm theo các bước từ bài viết dự án mã:Ghi nhật ký sự kiện trong Chương trình dịch vụ Windows

http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

Nhưng tôi không thấy bất kỳ thông báo log tùy chỉnh tôi đã viết trong các bản ghi sự kiện được tạo ra trong cửa sổ xem sự kiện khi tôi bắt đầu hoặc dừng dịch vụ . Ngoài ra, làm cách nào để xác định xem thư có phải do lỗi hay chỉ là thông tin?

Trả lời

57

Đầu tiên, MSDN là bạn của bạn. Hãy chắc chắn rằng bạn kiểm tra các liên kết, như có một số gotchas tiềm năng đáng biết.

Về cơ bản, bạn tạo một đối tượng EventLog:

this.ServiceName = "MyService"; 
this.EventLog = new System.Diagnostics.EventLog(); 
this.EventLog.Source = this.ServiceName; 
this.EventLog.Log = "Application"; 

Bạn cũng cần phải tạo ra một nguồn, nếu nguồn trên không tồn tại:

((ISupportInitialize)(this.EventLog)).BeginInit(); 
if (!EventLog.SourceExists(this.EventLog.Source)) 
{ 
    EventLog.CreateEventSource(this.EventLog.Source, this.EventLog.Log); 
} 
((ISupportInitialize)(this.EventLog)).EndInit(); 

và sau đó chỉ cần sử dụng nó:

this.EventLog.WriteEntry("My Eventlog message.", EventLogEntryType.Information); 

nó thực sự khá đơn giản.

+10

Lưu ý rằng bạn sẽ cần phải có quyền đúng để thực sự tạo nhật ký. Nếu không, bạn sẽ nhận được một ngoại lệ (ít nhất là Windows Server 2003) –

+1

Chắc chắn, và điều đó được ghi rõ trong tài liệu MSDN. – alphadogg

+8

@alphadogg thuộc tính của EventLog của ServiceBase là chỉ đọc. Mã sai. Theo mặc định, Dịch vụ Windows dựa trên .NET sẽ ghi nhật ký sự kiện là "Ứng dụng", vì vậy bạn không cần phải xác định nó theo cách thủ công. –

21

Cuối cùng tôi đã làm việc này bằng cách kết hợp các câu trả lời StackOverflow khác nhau và từ MSDN.

đầu tiên bao gồm các không gian tên sau

using System.ComponentModel; 
using System.Diagnostics; 

Sau đó thiết lập đăng nhập vào constructor của bạn

public UserService1() 
    { 
     //Setup Service 
     this.ServiceName = "MyService2"; 
     this.CanStop = true; 
     this.CanPauseAndContinue = true; 

     //Setup logging 
     this.AutoLog = false; 

     ((ISupportInitialize) this.EventLog).BeginInit(); 
     if (!EventLog.SourceExists(this.ServiceName)) 
     { 
      EventLog.CreateEventSource(this.ServiceName, "Application"); 
     } 
     ((ISupportInitialize) this.EventLog).EndInit(); 

     this.EventLog.Source = this.ServiceName; 
     this.EventLog.Log = "Application"; 
    } 

Sử dụng như sau:

protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 

     this.EventLog.WriteEntry("In OnStart"); 
    } 
Các vấn đề liên quan