Aracılığıyla paylaş


Yerel Linux makine geliştirme kurulumunda hizmetleri izleme ve tanılama

İzleme, algılama, tanılama ve sorun giderme, hizmetlerin kullanıcı deneyiminde en az kesintiyle devam etmelerine olanak tanır. gerçek bir dağıtılmış üretim ortamında izleme ve tanılama kritik öneme sahiptir. Hizmetlerin geliştirilmesi sırasında benzer bir modeli benimsemek, bir üretim ortamına geçtiğiniz zaman tanılama işlem hattının çalışmasını sağlar. Service Fabric, hizmet geliştiricilerinin hem tek makineli yerel geliştirme kurulumlarında hem de gerçek dünya üretim kümesi kurulumlarında sorunsuz bir şekilde çalışabilen tanılamalar uygulamasını kolaylaştırır.

Service Fabric Java uygulamalarında hata ayıklama

Java uygulamaları için birden çok günlük çerçevesi kullanılabilir. java.util.logging JRE ile varsayılan seçenek olduğundan, GitHub'daki kod örnekleri için de kullanılır. Aşağıdaki tartışmada çerçevenin nasıl yapılandırılır java.util.logging açıklanmaktadır.

java.util.logging kullanarak uygulama günlüklerinizi belleğe, çıkış akışlarına, konsol dosyalarına veya yuvalara yönlendirebilirsiniz. Bu seçeneklerin her biri için, çerçevede önceden sağlanan varsayılan işleyiciler vardır. Tüm günlükleri yerel bir app.properties dosyaya yeniden yönlendirmek üzere uygulamanızın dosya işleyicisini yapılandırmak üzere bir dosya oluşturabilirsiniz.

Aşağıdaki kod parçacığı örnek bir yapılandırma içerir:

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

Dosyanın işaret ettiği app.properties klasör mevcut olmalıdır. app.properties Dosya oluşturulduktan sonra, özelliğini java.util.logging.config.file app.properties dosya olarak ayarlamak için klasöründeki <applicationfolder>/<servicePkg>/Code/ giriş noktası betiğinizi entrypoint.sh de değiştirmeniz gerekir. Girdi aşağıdaki kod parçacığı gibi görünmelidir:

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

Bu yapılandırma, günlüklerin konumunda /tmp/servicefabric/logs/dönen bir şekilde toplanmasına neden olur. Bu örnekteki günlük dosyasının adı mysfapp%u.%g.log:

  • %u , eşzamanlı Java işlemleri arasındaki çakışmaları çözmek için kullanılan benzersiz bir sayıdır.
  • %g , dönen günlükleri ayırt etmek için gereken nesil numarasıdır.

Varsayılan olarak hiçbir işleyici açıkça yapılandırılmamışsa konsol işleyicisi kaydedilir. Günlükleri syslog'da /var/log/syslog altında görüntüleyebilirsiniz.

Daha fazla bilgi için GitHub'daki kod örneklerine bakın.

Service Fabric C# uygulamalarında hata ayıklama

Linux'ta CoreCLR uygulamalarını izlemek için birden çok çerçeve kullanılabilir. Daha fazla bilgi için bkz . Günlüğe Kaydetme için .NET Uzantıları. EventSource, C# geliştiricilerine aşina olduğundan, bu makalede Linux üzerinde CoreCLR örneklerinde izleme için EventSource kullanılır.

İlk adım, günlüklerinizi belleğe, çıkış akışlarına veya konsol dosyalarına yazabilmeniz için System.Diagnostics.Tracing'i eklemektir. EventSource kullanarak günlüğe kaydetmek için aşağıdaki projeyi project.json ekleyin:

    "System.Diagnostics.StackTrace": "4.0.1"

Özel bir EventListener kullanarak hizmet olayını dinleyebilir ve bunları uygun şekilde izleme dosyalarına yönlendirebilirsiniz. Aşağıdaki kod parçacığı, EventSource ve özel bir EventListener kullanarak günlüğe kaydetme işleminin örnek bir uygulamasını gösterir:


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

Yukarıdaki kod parçacığı, günlüklerin içindeki /tmp/MyServiceLog.txtbir dosyaya çıkışını oluşturur. Bu dosya adının uygun şekilde güncelleştirilmesi gerekir. Günlükleri konsola yeniden yönlendirmek istiyorsanız, özelleştirilmiş EventListener sınıfınızda aşağıdaki kod parçacığını kullanın:

public static TextWriter Out = Console.Out;

C# Örnekleri'ndeki örnekler, olayları bir dosyaya günlüğe kaydetmek için EventSource ve özel bir EventListener kullanır.

Sonraki adımlar

Uygulamanıza eklenen izleme kodu, azure kümesindeki uygulamanızın tanılamalarıyla da çalışır. Araçlar için farklı seçeneklerin açıklandığı ve bunların nasıl ayarlandığını açıklayan bu makalelere göz atın.