監視和診斷本機 Linux 機器開發設定中的服務

監視、偵測、診斷和疑難排解可讓服務繼續順利執行,盡可能減少服務中斷的使用者經驗。 在實際部署的生產環境中,監視和診斷非常重要。 若在開發服務期間採用類似的模型,當您移到生產環境時,將可確保診斷管線能夠運作。 Service Fabric 可讓服務開發人員輕鬆實作診斷,可以在單一電腦本機開發設定和實際生產叢集設定上順暢地工作。

針對 Service Fabric Java 應用程式進行偵錯

對於 Java 應用程式,有 多個記錄架構 可用。 由於 java.util.logging 是 JRE 的預設選項,它也會用於 GitHub 中的程式碼範例。 下列討論說明如何設定 java.util.logging 架構。

您可以使用 java.util.logging 將應用程式記錄重新導向至記憶體、輸出串流、主控台檔案或通訊端。 對於其中每個選項,架構中已經提供預設處理常式。 您可以建立 app.properties 檔案來設定應用程式的檔案處理常式,將所有記錄重新導向至本機檔案。

下列程式碼片段包含範例組態︰

handlers = java.util.logging.FileHandler

java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.limit = 1024000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.pattern = /tmp/servicefabric/logs/mysfapp%u.%g.log

app.properties 檔案所指向的資料夾必須存在。 建立 app.properties 檔案之後,您還必須修改 <applicationfolder>/<servicePkg>/Code/ 資料夾中的進入點指令碼 entrypoint.sh,以將屬性 java.util.logging.config.file 設定為 app.properties 檔案。 輸入如下列片段所示:

java -Djava.library.path=$LD_LIBRARY_PATH -Djava.util.logging.config.file=<path to app.properties> -jar <service name>.jar

此設定會導致在 /tmp/servicefabric/logs/中以輪替方式收集記錄。 在此情況下,記錄檔的名稱為 mysfapp%u.%g.log,其中︰

  • %u 是解決同時 Java 處理序之間衝突的唯一號碼。
  • %g 是區分輪替記錄的產生號碼。

依預設,如果未明確設定任何處理常式,則會註冊主控台處理常式。 使用者可以在 /var/log/syslog 下檢視 syslog 中的記錄。

如需詳細資訊,請參閱 GitHub 中的程式碼範例

針對 Service Fabric C# 應用程式進行偵錯

有多個架構適用於追蹤 Linux 上的 CoreCLR 應用程式。 如需詳細資訊,請參閱用於記錄的 .Net 擴充功能。 因為 C# 開發人員熟悉 EventSource,本文使用 EventSource 來追蹤 Linux 上的 CoreCLR 範例。

第一個步驟是加入 System.Diagnostics.Tracing,使您可以將您的記錄寫入記憶體中、輸出串流或主控台檔案。 針對使用 EventSource 進行記錄,請將下列專案加入您的 project.json︰

    "System.Diagnostics.StackTrace": "4.0.1"

您可以使用自訂 EventListener 接聽服務事件,然後適當地將其重新導向至追蹤檔案。 下列程式碼片段顯示使用 EventSource 和自訂 EventListener 來進行記錄的範例實作︰


public class ServiceEventSource : EventSource
{
        public static ServiceEventSource Current = new ServiceEventSource();

        [NonEvent]
        public void Message(string message, params object[] args)
        {
            if (this.IsEnabled())
            {
                var finalMessage = string.Format(message, args);
                this.Message(finalMessage);
            }
        }

        // TBD: Need to add method for sample event.

}

internal class ServiceEventListener : EventListener
{

        protected override void OnEventSourceCreated(EventSource eventSource)
        {
            EnableEvents(eventSource, EventLevel.LogAlways, EventKeywords.All);
        }
        protected override void OnEventWritten(EventWrittenEventArgs eventData)
        {
                using (StreamWriter Out = new StreamWriter( new FileStream("/tmp/MyServiceLog.txt", FileMode.Append)))
                {
                        // report all event information
                        Out.Write(" {0} ", Write(eventData.Task.ToString(), eventData.EventName, eventData.EventId.ToString(), eventData.Level,""));
                        if (eventData.Message != null)
                                Out.WriteLine(eventData.Message, eventData.Payload.ToArray());
                        else
                        {
                                string[] sargs = eventData.Payload != null ? eventData.Payload.Select(o => o.ToString()).ToArray() : null; 
                                Out.WriteLine("({0}).", sargs != null ? string.Join(", ", sargs) : "");
                        }
                }
        }
}

上述程式碼片段會將記錄輸出到 /tmp/MyServiceLog.txt 中的檔案。 此檔案名稱必須適當地更新。 如果您想要將記錄重新導向至主控台,在您的自訂 EventListener 類別中使用下列程式碼片︰

public static TextWriter Out = Console.Out;

C# Samples 中的範例使用 EventSource 和自訂 EventListener 事件將事件記錄到檔案中。

下一步

新增至應用程式的相同追蹤程式碼,也可以用來配合診斷 Azure 叢集上的應用程式。 請參閱下列文章,其中討論各種適用於工具的選項,並說明如何設定它們。