Kütüphaneler: Logging Class for both MQL4 and MQL5

 

Logging Class for both MQL4 and MQL5:

CDebugLogger sınıfı, MQL4/5 ortamlarında kullanılmak üzere tasarlanmış esnek ve kapsamlı bir günlük tutma aracıdır. Geliştiricilerin çeşitli önem düzeylerindeki (INFO, WARNING, ERROR, DEBUG) mesajları, zaman damgalarını, işlev imzalarını, dosya adlarını ve satır numaralarını günlük girdilerine dahil etme seçenekleriyle birlikte günlüğe kaydetmelerine olanak tanır. Sınıf, günlükleri ortak bir klasöre ve CSV biçiminde kaydetme özelliğiyle hem konsola hem de dosyalara günlüğe kaydetmeyi destekler. Ayrıca, hassas bilgilerin günlüğe kaydedilmemesini sağlamak için belirli anahtar kelimelere dayalı günlükleri susturma işlevi sunar. Bu sınıf, çok çeşitli hata ayıklama ve izleme ihtiyaçlarını karşılayan özelleştirilebilir özelliklerle MQL4/5 uygulamalarında sağlam günlük mekanizmaları uygulamak isteyen geliştiriciler için idealdir.

Author: VitalDefender Inc.

 

"En İyi Günlük Sınıfı" isminizi okudum ve dikkatimi çekti. "En iyi" seviyesi oldukça yüksek, bu yüzden bunu kontrol etmeyi merak ettim. Hoşgörülü olmayı gerektiren serbestçe dağıtılan bir kod olduğu için ayrıntılardan bahsetmekten kaçınacağım.

Kullanım ve özellikler :

  • Gizli anahtar kelimeler fikriniz iyi. Uygulama zayıf olsa da (Aşağıya bakınız). Ve çok fazla mesajı susturacaktır, örneğin logging kullanıyorsam. AddSilentKeyword("start") kullanıyorsam, "started" veya "starting" kullanarak bir günlüğü filtreleyecektir, ki bu gerçekten bir "anahtar kelime" filtrelemesinden beklediğim şey değildir.
  • Geri kalanlar çok temel özelliklerdir. Örneğin, MQL'in çekirdeği olay güdümlü olduğu için, OnTick(), OnTimer() veya OnChartEvent() içine yerleştirilen bir Log() ile kolayca gerçekleşebilen, günlüğün tekrarlanan aynı girişle dolmasını önlemek bir günlük sistemi için bir zorunluluktur.

Kodlama açısından bakıldığında :

  • Yapıcınız ve Initialize() kodunuz temel kısımlar için yinelenen kodlardır.
  • IsMessageSilent() fonksiyonunuz m_silent_keywords[]'ün her kelimesi için bir döngü kontrolü kullanıyor ve bu döngü içinde 'anahtar kelimeleri' küçük harfe dönüştürüyorsunuz. Her günlükte! Bu gerçekten verimsiz.
  • Sınıfınız neredeyse hiç özelleştirilemiyor, örneğin günlüğü ""Dosya Adı: " + __FILE__ + "\n" için özelleştirmek istersem, kodunuzu değiştirmem veya bir sınıf türetmem ve Log() yöntemini tamamen yeniden yazmam gerekecek. Örneğin bir BIN dosyası kullanmak gibi herhangi bir özel değişiklik için de aynı sorun vardır.
  • MQL yerleşik makrosunu geçersiz kılacak bir Print() makrosu tanımlarsınız. Kütüphanenizin kullanıcısını günlüğünüzde Print() yapmaya zorlamak çok kötü bir fikirdir.

Sonuç :

Kütüphaneniz doğru bir temel Loglama kütüphanesidir. Bazı yeni başlayanlar veya kendi kütüphanelerini oluşturacak zamanı olmayan kodlayıcılar için kullanışlı olabilir ve onlara kullanımı kolay bazı loglama özellikleri sağlar.

Hiçbir şekilde, "En iyi" nitelemesini kullanmak haklı değildir. Özellikler doğru ancak temeldir ve uygulama amatörce düzeydedir.

 
Alain Verleyen __FILE__ + "\n" için özelleştirmek istersem, kodunuzu değiştirmem veya bir sınıf türetmem ve Log() yöntemini tamamen yeniden yazmam gerekecek. Örneğin bir BIN dosyası kullanmak gibi herhangi bir özel değişiklik için de aynı sorun vardır.
  • MQL yerleşik makrosunu geçersiz kılacak bir Print() makrosu tanımlarsınız. Kütüphanenizin kullanıcısını günlüğünüzde Print() yapmaya zorlamak çok kötü bir fikirdir.
  • Sonuç :

    Kütüphaneniz doğru bir temel Loglama kütüphanesidir. Bazı yeni başlayanlar veya kendi kütüphanelerini oluşturacak zamanı olmayan kodlayıcılar için kullanışlı olabilir ve onlara kullanımı kolay bazı loglama özellikleri sağlar.

    Hiçbir şekilde, "En iyi" niteleyicisini kullanmak haklı değildir. Özellikler doğru ancak temeldir ve uygulama amatörce düzeydedir.

    Yorumunuz için teşekkür ederim.
    Beklentilerinize kıyasla "en iyi" ifadesinin abartılı olabileceğinin farkındayım. Amacım herkes tarafından kolayca değiştirilebilecek ve anlaşılabilecek bir kod paylaşmaktı. Bununla birlikte, topluluğa küçük bir katkıda bulunduğumu ve sınıfın herkesin kullanımına açık olduğunu umuyorum. Yakında kodu önerdiğiniz şekilde optimize etmeye devam edeceğim.
    Geri bildiriminiz için tekrar teşekkürler.
     
    Rica ederim.
     
    2024.09.01 14:51:25.011 Logging (EURUSD,M30)    File Name: Logging.mqh Function: string CDebugLogger::FormatLogEntry(LogLevel,string) 2024.09.01 14:51 Line: 276 [INFO] Script started successfully.
    

    Günlük çağrısının gerçekleştiği dosya adını, işlev imzasını ve satır numarasını yayabilmek için sınıf yöntemi yerine MACROS kullanmanız gerektiğini düşünüyorum.

     
    amrali __FILE__ + "\n" için özelleştirmek istersem, kodunuzu değiştirmem veya bir sınıf türetmem ve Log() yöntemini tamamen yeniden yazmam gerekecek. Örneğin bir BIN dosyası kullanmak gibi herhangi bir özel değişiklik için de aynı sorun vardır.
  • MQL yerleşik makrosunu geçersiz kılacak bir Print() makrosu tanımlarsınız. Kütüphanenizin kullanıcısını günlüğünüzde Print() yapmaya zorlamak çok kötü bir fikirdir.
  • Sonuç :

    Kütüphaneniz doğru bir temel Loglama kütüphanesidir. Bazı yeni başlayanlar veya kendi kütüphanelerini oluşturacak zamanı olmayan kodlayıcılar için kullanışlı olabilir ve onlara kullanımı kolay bazı loglama özellikleri sağlayabilir.

    Hiçbir şekilde, "En iyi" niteleyicisini kullanmak haklı değildir. Özellikler doğru ancak temeldir ve uygulama amatörce düzeydedir.

    Tek tek kelimeleri susturma becerisine gelince, etkili bir yolun, bir boşluk veya başka bir karakter de dahil olmak üzere basitçe 'start' yazmak olduğuna inanıyorum. Nihayetinde, diğer dillerde olduğu gibi, günlükleri yapılandırmak Init'te yapılırsa mantıklıdır. Belirtildiği gibi, herkes tarafından kolayca benimsenebilmesi için basit olması gerekir. Eklenmesi gereken başka bir şey olduğunu düşünüyorsanız, yazmaktan çekinmeyin, zamanım olduğunda kodu eklemeye çalışacağım. 'Yazdır' işlevi ile ilgili olarak, herkes isterse yorum yapmakta özgürdür.

    Her türlü değişiklik için hazırım!

     
    Alain Verleyen #:
    Geri kalanlar çok temel özelliklerdir. Örneğin, MQL'in çekirdeği olay güdümlü olduğundan, OnTick(), OnTimer() veya OnChartEvent() içine yerleştirilen bir Log() ile kolayca gerçekleşebilen, günlüğün tekrarlanan aynı girişle dolmasını önlemek için bir günlük sistemi şarttır.

    Bu sorun nasıl çözülür?

     
    hini #:

    Bu sorun nasıl çözülür?

    Aslında basittir, ancak muhtemelen kolay değildir.

    Çıktı günlüğünüzü bir liste ya da dizi olarak düşünün. Her bir öğe kodunuzdaki belirli bir konumu temsil eder. Yani her "günlüğe yazdır" çağrısı için ayrı bir öğeniz var.

    Her öğenin kendi giriş listesi vardır ve tekrar ettikleri sürece (mesaj bir öncekine eşittir), bir sayaç ve zaman damgası kaydedilir. Eşit olmadıklarında, ilk ve son zaman damgası ve sayaç dahil olmak üzere son mesajı yazdırırsınız.


    Bu size terminal uzman günlüğüne spam göndermekten kaçınmak için bir tür filtre vermelidir.

    Program sona erdiğinde, henüz yazdırılmamış tüm mesajları dışarı atarsınız.
     
    Dominik Egert #:
    Aslında basit ama muhtemelen kolay değil.

    Çıktı günlüğünüzü bir liste veya dizi olarak düşünün. Her bir öğe kodunuzdaki belirli bir konumu temsil eder. Yani her "günlüğe yazdır" çağrısı için ayrı bir öğeniz var.

    Her elemanın kendi giriş listesi vardır ve tekrar ettikleri sürece (mesaj bir öncekine eşittir), bir sayaç ve zaman damgası kaydedilir. Eşit olmadıklarında, ilk ve son zaman damgası ve sayaç dahil olmak üzere son mesajı yazdırırsınız.


    Bu size terminal uzman günlüğüne spam gönderilmesini önlemek için bir tür filtre vermelidir.

    Program sona erdiğinde, henüz yazdırılmamış tüm mesajları dışarı atarsınız.

    Cevabınız için teşekkür ederim. Şu anda günlükleri yazdırmak için MQL Plus Enhanced Debugging Support kütüphanenizi kullanıyorum. Ancak, bazen çok sayıda tekrarlayan günlük yazdırıyor ve şu anda bu sorunu çözmek için bir yöntemim yok. Önerdiğiniz çözüm bir yaklaşım ve zamanım olduğunda deneyeceğim. Günlük tutma sisteminin dikkatli bir şekilde tasarlanmasını gerektiriyor.

     
    Dominik Egert #:
    Aslında basit ama muhtemelen kolay değil.

    Çıktı günlüğünüzü bir liste veya dizi olarak düşünün. Her bir öğe kodunuzdaki belirli bir konumu temsil eder. Yani her "günlüğe yazdır" çağrısı için ayrı bir öğeniz var.

    Her elemanın kendi giriş listesi vardır ve tekrar ettikleri sürece (mesaj bir öncekine eşittir), bir sayaç ve zaman damgası kaydedilir. Eşit olmadıklarında, ilk ve son zaman damgası ve sayaç dahil olmak üzere son mesajı yazdırırsınız.


    Bu size terminal uzman günlüğüne spam gönderilmesini önlemek için bir tür filtre vermelidir.

    Program sona erdiğinde, henüz yazdırılmamış tüm mesajları dışarı atarsınız.
    Basit ve kolay.
     
    hini #:

    Cevabınız için teşekkür ederim. Şu anda günlükleri yazdırmak için MQL Plus Enhanced Debugging Support kütüphanenizi kullanıyorum. Ancak, bazen çok sayıda tekrarlayan günlük yazdırıyor ve şu anda bu sorunu çözmek için bir yöntemim yok. Önerdiğiniz çözüm bir yaklaşım ve zamanım olduğunda deneyeceğim. Kayıt sisteminin dikkatli bir şekilde tasarlanmasını gerektirir.


    Lib debug ile entegre edilebilir.

    Ancak Lib Debug bir günlük tutma aracı değil, kodunuzun tam bir izini veren bir hata ayıklama günlüğü olarak tasarlanmıştır.