LogManager.GetLogger için log4net bağımsız değişkeni


98

Neden çoğu log4net örneği, bunu yaparak bir sınıf için günlükçüyü alıyor:

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Typeof (MyClass) 'ı geçmek yerine:

private static ILog logger = LogManager.GetLogger(typeof(MyClass));

İlk seçeneğin belirli bir sınıf adı yazmanızı gerektirmemesi dışında, bunu yapmanın başka bir nedeni var mı?

Yanıtlar:


93

Sanırım sebebin var. Bunu bu şekilde yapıyorum, böylece sınıf adı hakkında endişelenmeme gerek kalmıyor ve sadece kazan plakası kodunu kopyalayıp yeni bir sınıfa yapıştırabiliyorum.

Resmi cevap için bkz: Statik bir bloktaki bir sınıfın tam nitelikli adını nasıl elde ederim? En log4net sss


Tamam, bu sorunu çözüyor, bağlantı için teşekkürler, bunu daha önce görmemiştim
Andy White

Bu olabildiğince eski, ancak yine de kazan kodu olarak yapıştırmanız durumunda
cevabıma

Bu kodu kesip yapıştırarak Geliştirme zamanından biraz tasarruf edersiniz. Ancak bir dizge sabiti kullanmak veya 'typeof ()' çağırmak yerine 'GetCurrentMethod ()' çağırmanın bir maliyeti vardır. Sınıf adını yazmanızın ne kadar süreceğine karşı kodun ömrü boyunca bunun kaç kez çağrılacağını toplarsanız, kodunuzu küçük bir fayda sağlamak için yavaşlattığınızı düşünüyorum.
Youngs

1
Düşündüğünüz kadar yavaşlamıyorsunuz, bu statik bir çağrıdır, bu nedenle uygulama alanı başına sınıf başına bir çağrınız vardır, örneğin, 300 sınıfınız varsa, uygulamanızın ömrü boyunca buna en fazla 300 çağrınız var
Paul Hatcher

Tür adını almak için yansımayı kullanmanın bir anlamı yok ve kopya / geçmiş tembelliktir ve performans açısından bir hit olur, öyleyse neden sadece adı almayasınız ?!
MeTitus

8

Ben bir NLog kullanıcısıyım ve bu genellikle şu şekilde özetlenebilir:

var _logger = LogManager.GetCurrentClassLogger();

Log4Net'te yansımadan geçmeniz biraz garip geldi, bu yüzden NLog kaynak koduna bir göz attım ve bakalım, sizin için yaptıkları şey bu:

[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
    string loggerName;
    Type declaringType;
    int framesToSkip = 1;
    do
    {
#if SILVERLIGHT
        StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
        StackFrame frame = new StackFrame(framesToSkip, false);
#endif
        var method = frame.GetMethod();
        declaringType = method.DeclaringType;
        if (declaringType == null)
        {
            loggerName = method.Name;
            break;
        }
        framesToSkip++;
        loggerName = declaringType.FullName;
    } while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
    return globalFactory.GetLogger(loggerName);
}

Kazan kodumun bir parçası olarak yansımayı yapıştırmak yerine Log4Net için bir uzantı veya statik yöntem olarak benzer bir şey yazacağımı tahmin ediyorum :)


7

Dediğiniz gibi - sınıfın adını bilmeden bir yöntemde bir günlük oluşturabileceğiniz için kullanışlıdır (bildiğim önemsiz), ancak çağrıyı yeniden adlandırmak zorunda kalmadan sınıflar arasında yöntemleri kesip yapıştırmanıza izin verir.


3

Sanırım nedeni, .DeclaringType()yöntemi kullanarak çalışma zamanı türünün türünü elde etmenizdir. Logger'ı bir temel sınıfta kullanabilir ve yine de logger çıktısında nesnenizin gerçek türünü görebilirsiniz. Bu, soruşturmaları çok daha uygun hale getirir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.