2011-02-08 161 views
2

我已經分配了一個項目,其中包含許多基於SharePoint的編寫不佳的代碼。用NLog集中記錄日誌的最佳方法是什麼?

它由大約15個子項目組成,其中一些是Windows服務,一些Web服務,一些在SharePoint內部運行的Web應用程序,一些是Web部件,甚至是控制檯應用程序。他們都運行在同一臺服務器上並互相通話。

生產中已經有很多問題,但它們很難找到。
最初的開發者一定是塞林格或神奇寶貝系列的粉絲,他以不懈努力捕捉所有異常情況爲判斷依據。不幸的是,他們中沒有一個會被報告或記錄。

我目前的任務是在整個項目中引入日誌記錄,以便我可以找到現在看不見的異常,遵循糾結的循環調用並至少有一些堆棧跟蹤。我決定去NLog,看到它的活躍和酷,而不是log4net這是完美的,但有點不像我的口味花哨。

由於組件緊密耦合,我想將日誌記錄集中到一個文件中,因此相關錯誤不會分散在硬盤中。因此,我期望有兩個或三個不同的日誌文件,其中有五個或更多的項目或多或少地同時寫入每個日誌文件。

配置NLog集中記錄日誌的最佳方法是什麼?我應該爲每個項目配置一個配置文件,還是應該有相關的項目共享它們?我應該在哪裏將配置文件從SharePoint Web部件登錄?我會面對任何許可問題嗎?

我使用SharePoint 2007

+0

SharePoint 2007或SharePoint 2010? – 2011-02-09 06:30:27

+0

2007.編輯該問題。 – 2011-02-09 15:08:37

回答

5

集中化最簡單的方法可能是簡單地登錄到數據庫,一個好處是多個應用程序和寫入數據庫比對同一個日誌文件更容易。對於每個應用程序,將NLog配置爲登錄到數據庫目標,對每個應用程序使用相同的數據庫目標配置參數。你NLog.config文件可能是這個樣子:

<?xml version="1.0" encoding="utf-8" ?> 
<!-- 
    This file needs to be put in the application directory. Make sure to set 
    'Copy to Output Directory' option in Visual Studio. 
    --> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     autoReload="true" 
     internalLogLevel="Debug" 
     internalLogFile="nlog_log.log"> 


    <targets async="true"> 
    <target name="sqlexpress" xsi:type="Database"> 
     <connectionString> 
     Data Source=.\SQLEXPRESS;Initial Catalog=LoggingDB;Integrated Security=True; 
     </connectionString> 
     <commandText> 
     insert into LogTable(DateTime,Logger,LogLevel,Message,ProcessId,ManagedThreadId) values (@DateTime,@Logger,@LogLevel,@Message,@ProcessId,@ManagedThreadId); 
     </commandText> 
     <parameter name="@DateTime" layout="${date:format=yyyy\-MM\-dd HH\:mm\:ss.fff}"/> 
     <parameter name="@Logger" layout="${logger}"/> 
     <parameter name="@LogLevel" layout="${level}"/> 
     <parameter name="@Message" layout="${message}"/> 
    </target> 

    </target> 
    </targets> 
    <rules> 
    <logger name="*" minlevel="Trace" writeTo="sqlexpress" /> 
    </rules> 
</nlog> 

你當然可以登錄到除(或代替)記錄到數據庫文件。

我不熟悉從SharePoint這樣做,所以我不能評論任何可能會遇到的配置或權限問題。

這裏是一個鏈接,我發現那裏有越來越NLOG在SharePoint環境中工作的討論:

http://nlog-forum.1685105.n2.nabble.com/Is-anyone-using-NLog-with-SharePoint-td2171451.html

這種聯繫似乎讓你在NLOG論壇的頂部,而不是具體的帖子。在論壇中搜索此文本「是否有人使用NLog與SharePoint」,您應該找到正確的帖子。

祝你好運!

3

你也可以只利用SharePoint中的現有記錄的基礎設施和寫入ULS日誌。這樣可以使用ULS log viewer在完整的上下文中查看您的日誌信息。對於SharePoint 2007年看到這個博客怎麼寫ULS日誌: SharePoint Trace Logs and the Unified Logging Service (ULS)

與SharePoint 2010它已成爲更容易與改善的SPDiagnosticsService類,你可以使用新的WriteTrace方法。

+0

感謝您的建議。但是,有些組件會耗盡SharePoint上下文,無論如何,SharePoint日誌非常臃腫,與我的應用程序無關。這就是爲什麼我想要一個單獨的日誌。 – 2011-02-09 15:11:02

1

我個人將異常記錄到事件記錄器。我使用NLog記錄詳細信息,調試信息或跟蹤。

由於NLOG可以很容易地打開和關閉,我只激活它,當我調試或當我需要檢查生產異常。我從來不是.NET中默認跟蹤功能的忠實粉絲。

我更喜歡簡單的純文本日誌文件。儘管如果你的代碼中沒有太多的「日誌行」,登錄數據庫的效果很好。

0

我覺得我們正在研究同一個項目!由Web項目,核心dll項目,控制檯應用程序,服務等組成的多個項目。不幸的是,我不像你一樣在SharePoint中工作,但我可以描述我如何集中我們的日誌記錄。

我們有1個核心Net框架project.This是我放在日誌我們的包裝類。該項目還包含nlog dlls和nlog配置文件。在這個核心項目文件中,你可以添加這個,當你用這個核心項目的依賴來構建項目時,它會自動移動配置。

<None Include="Logging\NLog.config"> 
    <link>NLog.config</link> 
    <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
</None> 

我們發現,一些不編一個dll web項目不會自動拉在配置文件中,所以我們會離開,高達構建過程。這有助於集中化我們的日誌記錄,因此您只需要在它們之間管理一個配置。

此外還記得當你創建每類記錄,日誌名稱應該有命名空間,所以你可以,如果你想爲特定的項目不同的設置,過濾掉基於命名空間的具體目標。

至於集中在日誌中結束了,我們選擇使用一個文件對象,並指定完整路徑。這是因爲在我們的服務器上應用程序運行C:\,但我們有更大的D:\可以存儲日誌。在我們的生產服務器中,我們也有多個服務器,所以我們使用splunk來聚合我們所有的日誌。

如果Splunk的是出了問題,你是一個分佈式系統,數據庫聽起來是個好主意,因爲上述建議。如果你不想站起來一個sql實例,那麼也有mongo db的目標包裝器。

希望有幫助,我很好奇,如果任何人有我如何做,以及建議或意見!

相關問題