Monitorování a diagnostika služeb v místním nastavení vývoje počítačů s Linuxem

Monitorování, zjišťování, diagnostika a řešení potíží umožňují službám pokračovat s minimálním přerušením uživatelského prostředí. Monitorování a diagnostika jsou důležité ve skutečném nasazeném produkčním prostředí. Přijetí podobného modelu během vývoje služeb zajišťuje, že diagnostický kanál funguje při přechodu do produkčního prostředí. Service Fabric usnadňuje vývojářům služeb implementaci diagnostiky, která bezproblémově funguje jak v místních nastaveních místního vývoje na jednom počítači, tak i v reálných nastaveních produkčního clusteru.

Ladění aplikací Service Fabric v Javě

Pro aplikace v Javě je k dispozici více architektur protokolování. Vzhledem k tomu java.util.logging , že je výchozí možností jRE, používá se také pro příklady kódu na GitHubu. Následující diskuze vysvětluje, jak nakonfigurovat architekturu java.util.logging .

Pomocí java.util.logging můžete protokoly aplikace přesměrovat do paměti, výstupních datových proudů, souborů konzoly nebo soketů. Pro každou z těchto možností existují výchozí obslužné rutiny, které už jsou v rozhraní k dispozici. Můžete vytvořit soubor, který nakonfiguruje obslužnou app.properties rutinu souboru pro vaši aplikaci tak, aby přesměrovává všechny protokoly do místního souboru.

Následující fragment kódu obsahuje ukázkovou konfiguraci:

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

Složka odkazovaná souborem app.properties musí existovat. app.properties Po vytvoření souboru musíte také upravit skript vstupního bodu ve <applicationfolder>/<servicePkg>/Code/ složce, entrypoint.sh aby se vlastnost java.util.logging.config.file nastavil na app.properties soubor. Položka by měla vypadat jako následující fragment kódu:

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

Výsledkem této konfigurace je shromažďování protokolů rotujícím způsobem na /tmp/servicefabric/logs/adrese . Soubor protokolu v tomto případě má název mysfapp%u.%g.log kde:

  • %u je jedinečné číslo pro řešení konfliktů mezi souběžným procesem Javy.
  • %g je číslo generování pro rozlišení mezi rotujícími protokoly.

Pokud není explicitně nakonfigurovaná žádná obslužná rutina, je obslužná rutina konzoly zaregistrovaná. Protokoly můžete zobrazit v syslogu v části /var/log/syslog.

Další informace najdete v příkladech kódu na GitHubu.

Ladění aplikací Service Fabric v jazyce C#

Pro trasování aplikací CoreCLR v Linuxu je k dispozici několik architektur. Další informace naleznete v tématu Rozšíření .NET pro protokolování. Vzhledem k tomu, že je EventSource známý vývojářům v C#, tento článek používá EventSource k trasování v ukázkách CoreCLR v Linuxu.

Prvním krokem je zahrnout System.Diagnostics.Tracing, abyste mohli zapisovat protokoly do paměti, výstupních datových proudů nebo souborů konzoly. Pro protokolování pomocí EventSource přidejte do svého project.json následující projekt:

    "System.Diagnostics.StackTrace": "4.0.1"

Vlastní eventListener můžete použít k naslouchání události služby a pak je odpovídajícím způsobem přesměrovat na trasovací soubory. Následující fragment kódu ukazuje ukázkovou implementaci protokolování pomocí EventSource a vlastního EventListeneru:


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) : "");
                        }
                }
        }
}

Předchozí fragment kódu vypíše protokoly do souboru v /tmp/MyServiceLog.txt. Tento název souboru musí být odpovídajícím způsobem aktualizován. V případě, že chcete protokoly přesměrovat do konzoly, použijte ve své přizpůsobené třídě EventListener následující fragment kódu:

public static TextWriter Out = Console.Out;

Ukázky v ukázkách jazyka C# používají EventSource a vlastní eventListener k protokolování událostí do souboru.

Další kroky

Stejný kód trasování přidaný do vaší aplikace funguje také s diagnostikou vaší aplikace v clusteru Azure. Podívejte se na tyto články, které popisují různé možnosti nástrojů a popisují, jak je nastavit.