Monitorowanie i diagnozowanie usług w lokalnej konfiguracji tworzenia maszyn z systemem Linux

Monitorowanie, wykrywanie, diagnozowanie i rozwiązywanie problemów pozwalają na kontynuację usług z minimalnymi zakłóceniami w doświadczeniu użytkownika. Monitorowanie i diagnostyka mają krytyczne znaczenie w rzeczywistym wdrożonym środowisku produkcyjnym. Wdrożenie podobnego modelu podczas opracowywania usług gwarantuje, że potok diagnostyczny działa po przejściu do środowiska produkcyjnego. Usługa Service Fabric ułatwia deweloperom usług implementowanie diagnostyki, która może bezproblemowo działać zarówno w ramach konfiguracji programowania lokalnego pojedynczego komputera, jak i rzeczywistych konfiguracji klastra produkcyjnego.

Debugowanie aplikacji Java usługi Service Fabric

W przypadku aplikacji Java dostępnych jest wiele platform rejestrowania . Ponieważ java.util.logging jest to opcja domyślna środowiska JRE, jest również używana dla przykładów kodu w usłudze GitHub. W poniższej dyskusji wyjaśniono, jak skonfigurować platformę java.util.logging .

Za pomocą pliku java.util.logging można przekierowywać dzienniki aplikacji do pamięci, strumieni wyjściowych, plików konsoli lub gniazd. Dla każdej z tych opcji istnieją już domyślne programy obsługi dostępne w strukturze. Możesz utworzyć app.properties plik w celu skonfigurowania programu obsługi plików dla aplikacji w celu przekierowania wszystkich dzienników do pliku lokalnego.

Poniższy fragment kodu zawiera przykładową konfigurację:

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

Folder wskazywany przez app.properties plik musi istnieć. Po utworzeniu pliku app.properties należy również zmodyfikować skrypt punktu wejścia entrypoint.sh w folderze <applicationfolder>/<servicePkg>/Code/, aby ustawić właściwość java.util.logging.config.file na plik app.properties. Wpis powinien wyglądać podobnie do następującego fragmentu kodu:

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

Ta konfiguracja powoduje zbieranie dzienników w sposób rotacyjny w lokalizacji /tmp/servicefabric/logs/. Plik dziennika w tym przypadku nosi nazwę mysfapp%u.%g.log gdzie:

  • %u jest unikatową liczbą do rozwiązywania konfliktów między równoczesnym procesami Języka Java.
  • %g jest numerem generacji do rozróżnienia między rotacyjnymi dziennikami.

Domyślnie, jeśli program obsługi nie jest jawnie skonfigurowany, program obsługi konsoli jest zarejestrowany. Dzienniki można wyświetlić w syslogu pod adresem /var/log/syslog.

Aby uzyskać więcej informacji, zobacz przykłady kodu w usłudze GitHub.

Debugowanie aplikacji w języku C# usługi Service Fabric

Wiele platform jest dostępnych do śledzenia aplikacji CoreCLR w systemie Linux. Aby uzyskać więcej informacji, zobacz Rozszerzenia .NET do logowania. Ponieważ usługa EventSource jest znana deweloperom języka C#, w tym artykule użyto usługi EventSource do śledzenia w przykładach CoreCLR w systemie Linux.

Pierwszym krokiem jest dołączenie elementu System.Diagnostics.Tracing, dzięki czemu można zapisywać dzienniki w pamięci, strumieniach wyjściowych lub plikach konsoli. W przypadku rejestrowania przy użyciu EventSource dodaj następujący projekt do swojego project.json:

    "System.Diagnostics.StackTrace": "4.0.1"

Możesz użyć niestandardowego nasłuchiwacza zdarzeń, aby nasłuchiwać zdarzenia usługi, a następnie odpowiednio przekierować je do plików śledzenia. Poniższy fragment kodu przedstawia przykładową implementację rejestrowania przy użyciu usługi EventSource i niestandardowego elementu 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) : "");
                        }
                }
        }
}

Powyższy fragment kodu zapisuje dzienniki do pliku w /tmp/MyServiceLog.txt. Ta nazwa pliku musi zostać odpowiednio zaktualizowana. Jeśli chcesz przekierować dzienniki do konsoli, użyj następującego fragmentu kodu w dostosowanej klasie EventListener:

public static TextWriter Out = Console.Out;

Przykłady w C# Samples używają EventSource i niestandardowego EventListener do rejestrowania zdarzeń w pliku.

Następne kroki

Ten sam kod śledzenia dodany do aplikacji działa również z diagnostyką aplikacji w klastrze platformy Azure. Zapoznaj się z tymi artykułami, które omawiają różne opcje narzędzi i opisują sposób ich konfigurowania.