Monitorare e diagnosticare servizi in una configurazione di sviluppo con computer localeMonitor and diagnose services in a local machine development setup

Le operazioni di monitoraggio, rilevamento, diagnosi e risoluzione dei problemi consentono ai servizi di continuare a funzionare con un'interruzione minima dell'esperienza utente.Monitoring, detecting, diagnosing, and troubleshooting allow for services to continue with minimal disruption to the user experience. Il monitoraggio e la diagnostica sono essenziali in un ambiente di produzione distribuito reale.Monitoring and diagnostics are critical in an actual deployed production environment. L'adozione di un modello simile durante lo sviluppo dei servizi garantisce il funzionamento della pipeline di diagnostica anche in un ambiente di produzione.Adopting a similar model during development of services ensures that the diagnostic pipeline works when you move to a production environment. Service Fabric consente agli sviluppatori di servizi di implementare facilmente un sistema di diagnostica in grado di operare senza problemi sia in ambienti di sviluppo costituiti da un unico computer locale sia in configurazioni con cluster di produzione veri e propri.Service Fabric makes it easy for service developers to implement diagnostics that can seamlessly work across both single-machine local development setups and real-world production cluster setups.

Debug delle applicazioni Java di Service FabricDebugging Service Fabric Java applications

Per le applicazioni Java sono disponibili più framework di registrazione .For Java applications, multiple logging frameworks are available. Dato che java.util.logging è l'opzione predefinita con JRE, viene usato anche per gli esempi di codice in GitHub.Since java.util.logging is the default option with the JRE, it is also used for the code examples in github. Di seguito viene illustrato come configurare il framework java.util.logging .The following discussion explains how to configure the java.util.logging framework.

Usando java.util.logging è possibile reindirizzare i log dell'applicazione a memoria, flussi di output, file di console o socket.Using java.util.logging you can redirect your application logs to memory, output streams, console files, or sockets. Nel framework sono disponibili gestori predefiniti per ognuna di queste opzioni.For each of these options, there are default handlers already provided in the framework. È possibile creare un file app.properties per configurare il gestore di file per l'applicazione in modo da reindirizzare tutti i log a un file locale.You can create a app.properties file to configure the file handler for your application to redirect all logs to a local file.

Il frammento di codice seguente contiene una configurazione di esempio:The following code snippet contains an example configuration:

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             

La cartella a cui fa riferimento il file app.properties deve essere presente.The folder pointed to by the app.properties file must exist. Dopo la creazione del file app.properties, è anche necessario modificare lo script del punto di ingressoentrypoint.sh, nella cartella <applicationfolder>/<servicePkg>/Code/ in modo da impostare la proprietà java.util.logging.config.file sul file app.propertes.After the app.properties file is created, you need to also modify your entry point script, entrypoint.sh in the <applicationfolder>/<servicePkg>/Code/ folder to set the property java.util.logging.config.file to app.propertes file. La voce dovrebbe essere simile al frammento seguente:The entry should look like the following snippet:

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

Con questa configurazione, i log verranno raccolti a rotazione in /tmp/servicefabric/logs/.This configuration results in logs being collected in a rotating fashion at /tmp/servicefabric/logs/. Il questo caso il file di log è denominato mysfapp%u.%g.log, dove:The log file in this case is named mysfapp%u.%g.log where:

  • %u è un numero univoco per risolvere i conflitti tra processi simultanei di Java.%u is a unique number to resolve conflicts between simultaneous Java processes.
  • %g è il numero di generazione per distinguere tra i log di rotazione.%g is the generation number to distinguish between rotating logs.

Se non viene configurato in modo esplicito alcun gestore, per impostazione predefinita viene registrato il gestore della console.By default if no handler is explicitly configured, the console handler is registered. È possibile visualizzare i log in syslog, in /var/log/syslog.One can view the logs in syslog under /var/log/syslog.

Per altre informazioni, vedere gli GitHub.For more information, see the code examples in github.

Debug di applicazioni C# di Service FabricDebugging Service Fabric C# applications

Sono disponibili vari framework per il tracciamento delle applicazioni CoreCLR in Linux.Multiple frameworks are available for tracing CoreCLR applications on Linux. Per altre informazioni, vedere GitHub: logging (Accesso a GitHub).For more information, see GitHub: logging. In questo articolo viene usato EventSource, già noto agli sviluppatori C#, per la traccia negli esempi CoreCLR in Linux.Since EventSource is familiar to C# developers,`this article uses EventSource for tracing in CoreCLR samples on Linux.

Il primo passaggio consiste nell'includere System.Diagnostics.Tracing in modo da poter scrivere i log in m in memoria, flussi di output o file di console.The first step is to include System.Diagnostics.Tracing so that you can write your logs to memory, output streams, or console files. Per la registrazione tramite EventSource, aggiungere il seguente progetto a project.json:For logging using EventSource, add the following project to your project.json:

    "System.Diagnostics.StackTrace": "4.0.1"

È possibile usare un EventListener personalizzato per l'ascolto dell'evento di servizio e quindi eseguire il reindirizzamento appropriato ai file di traccia.You can use a custom EventListener to listen for the service event and then appropriately redirect them to trace files. Il frammento di codice seguente mostra un esempio di implementazione della registrazione tramite EventSource e un EventListener personalizzato:The following code snippet shows a sample implementation of logging using EventSource and a custom 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) : "");             
        }
           }
        }
    }

Il frammento di codice precedente restituisce i log a un file in /tmp/MyServiceLog.txt.The preceding snippet outputs the logs to a file in /tmp/MyServiceLog.txt. Il nome del file deve essere aggiornato in modo appropriato.This file name needs to be appropriately updated. Se si desidera reindirizzare i log alla console, usare il frammento di codice seguente nella classe EventListener personalizzata:In case you want to redirect the logs to console, use the following snippet in your customized EventListener class:

public static TextWriter Out = Console.Out;

Gli esempi in C# Samples (Esempio C#) usano EventSource e un EventListener personalizzato per registrare eventi in un file.The samples at C# Samples use EventSource and a custom EventListener to log events to a file.

Passaggi successiviNext steps

Lo stesso codice di traccia aggiunto all'applicazione potrà essere usato per la diagnostica dell'applicazione in un cluster di Azure.The same tracing code added to your application also works with the diagnostics of your application on an Azure cluster. Consultare questi articoli che illustrano le diverse opzioni per gli strumenti e descrivono come configurarli.Check out these articles that discuss the different options for the tools and describe how to set them up.