2016-10-26 84 views
-4

我有下面的代碼寫入到一個日誌文件,並在我的控制檯應用程序正常工作:服務將不寫入文件

try 
{ 
    string log = "some message"; 
    string mFileName = "some directory to the log file"; 
    Console.WriteLine(log); 
    using (StreamWriter w = File.AppendText(mFileName)) 
    { 
     w.WriteLine(log); 
     w.Dispose(); 
    } 
} 
catch (Exception e) 
{ 
    Console.WriteLine("Error Log: " + e.Message); 
} 

但是當我運行的代碼,我的電腦上的服務,它完全停止記錄。我已經檢查過,服務和我有相同的權利。

請注意:該服務不會崩潰,它只是運行而不記錄。

+4

首先開始刪除'w.Dispose()'這已經在'using'的末尾處理了。請參閱[CA2202:不要多次處理對象](https://msdn.microsoft.com/en-us/library/ms182334.aspx)。 – Enfyve

+0

'mFileName'包含完整路徑嗎?您也可以考慮:[如何使用Visual C#寫入事件日誌](https://support.microsoft.com/en-us/kb/307024) –

+0

'mFileName'是包含文件名和類型的完整文件路徑 –

回答

0

這很可能與用戶權限有關。 我的猜測是啓動服務的系統用戶沒有寫入文件位置的權限。

一種解決方案是用自己的帳戶的用戶憑據啓動服務(因爲你有權利。)

另一種解決方案是給用戶(本地系統,服務用戶或IIS用戶的基於web服務)寫入對目錄的訪問權限,或者將用戶具有寫權限的文件路徑更改爲目錄。

如果您想確保,請在使用時添加一個try catch塊,並將該異常寫入控制檯,調試或消息框。然後你會知道哪裏出了問題。

see possible exceptions for File.AppendText on MSDN

我的猜測是,它拋出一個UnauthorizedAccessException

+1

「並寫入例外」?什麼?日誌方法不起作用?這是一項服務,因此無法通過正常方式與用戶進行交互。 – spender

+0

系統事件日誌? [鏈接] http://stackoverflow.com/questions/25725151/write-to-windows-application-event-log-without-registering-an-event-source –

0

爲什麼不乾脆直接創建StreamWriter,在一個try-catch包起來,如果有一個例外,系統記錄它。 Diagnostics.EventLog?

try 
{ 
    using (Streamwriter sw = new StreamWriter(path, true) 
    { 
     sw.WriteLine(log); 
    } 
} 
catch (Exception ex) 
{ 
    // Log exception using System.Diagnostics.EventLog 
} 
+0

這是如何回答這個問題? – spender

+0

因爲更明確的打字會更容易理解,加上OP所說的,他有一個try-catch已經圍繞它,但是沒有真正看到代碼,他可能會捕獲錯誤並且不記錄到EventLog,不會導致服務崩潰,也不會給出任何反饋。 – Enfyve