লগ ম্যানেজার.গেটলোগারে লগ 4 নেট আর্গুমেন্ট


98

বেশিরভাগ লগ 4 নেট উদাহরণগুলি কেন এটি করে কোনও শ্রেণীর জন্য লগার পান:

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

কেবল টাইফফ (মাই ক্লাস) পাস করার চেয়ে:

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

এটি করার জন্য অন্য কোনও কারণ আছে কি না, প্রথম বিকল্পের জন্য আপনার নির্দিষ্ট শ্রেণির নাম টাইপ করা প্রয়োজন হয় না?

উত্তর:


93

আমি মনে করি আপনি কারণ পেয়েছেন। আমি সেভাবে এটি করি যাতে ক্লাসের নাম সম্পর্কে আমাকে চিন্তা করতে হবে না এবং কেবল নতুন ক্লাসে বয়লার প্লেট কোডটি অনুলিপি এবং পেস্ট করতে পারি।

অফিসিয়াল উত্তরের জন্য দেখুন: স্ট্যাটিক ব্লকে আমি কীভাবে ক্লাসের পুরো-যোগ্যতাসম্পন্ন নাম পেতে পারি? লগ 4 নেট প্রশ্নে


ঠিক আছে যে এটি পরিষ্কার করে দেয়, এই লিঙ্কটির জন্য ধন্যবাদ, আমি এর আগে দেখিনি
অ্যান্ডি হোয়াইট

এটি যতটা পুরনো তা ততই পুরানো, তবে আপনি যদি এখনও বয়লার কোড হিসাবে পেস্ট করে থাকেন তবে আমার উত্তরটি একবার দেখুন:
নোটিস

আপনি এই কোডটি কাটাতে এবং আটকানোর জন্য খুব অল্প পরিমাণে দেব সময় সাশ্রয় করেন। তবে স্ট্রিং ধ্রুবক ব্যবহার করা বা 'টাইপফ ()' কল করার বিপরীতে 'গেটকন্টারমথোড ()' কল করার জন্য একটি মূল্য রয়েছে। শ্রেণীর নাম লিখতে আপনাকে কতক্ষণ সময় লাগবে তার বিপরীতে কোডটির আজীবন আপনাকে এই ডাকা হবে কতবার যুক্ত করলে, আমি মনে করি আপনি সামান্য সুবিধার জন্য আপনার কোডটি ধীরে ধীরে নিচে করছেন।
যুবকরা

4
আপনি যতটা ভাবেন তত কমিয়ে দিচ্ছেন না, এটি একটি স্ট্যাটিক কল তাই প্রতি অ্যাপ্লিকেশন ডোমেন অনুসারে আপনার প্রতি ক্লাসে একটি অনুরোধ রয়েছে, যেমন আপনার অ্যাপ্লিকালটির জন্য যদি আপনার 300 টি ক্লাস থাকে তবে আপনার অ্যাপ্লিকেশনটির আজীবনের জন্য এটিতে 300 কল রয়েছে
পল হ্যাচার

প্রকারের নামটি পাওয়ার জন্য প্রতিবিম্বটি ব্যবহার করার কোনও মানে নেই, এবং অনুলিপি / অতীতটি অলসতা এবং আপনি একটি পারফরম্যান্স হিট হন, তবে কেন কেবল নামটি পাবেন না ?!
মেটিটাস

8

আমি একজন এনএলএগ ব্যবহারকারী এবং সাধারণত এটি এটিকে ফুটিয়ে তোলে:

var _logger = LogManager.GetCurrentClassLogger();

এটি কিছুটা অদ্ভুত বলে মনে হয়েছিল যে আপনি লগ 4 নেটতে প্রতিফলনের মধ্য দিয়ে যেতে হবে, তাই এনএলওগ উত্স কোডটিতে আমার নজর ছিল এবং দেখুন এবং দেখুন যে তারা আপনার জন্য এটি করে:

[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);
}

আমার ধারণা আমি লগ 4 নেট এর জন্য আমার বয়লার কোডের অংশ হিসাবে প্রতিচ্ছবিটি পেস্ট করার পরিবর্তে একটি এক্সটেনশন বা স্থির পদ্ধতি হিসাবে অনুরূপ কিছু লিখব :)


7

আপনি যেমনটি বলেছেন - এটি সুবিধাজনক হিসাবে আপনি ক্লাসের নাম না জেনে কোনও পদ্ধতিতে লগার তৈরি করতে পারবেন (তুচ্ছ আমি জানি) তবে আপনি কলটির নাম পরিবর্তন না করে ক্লাসের মধ্যে পদ্ধতিগুলি কাটা এবং পেস্ট করতে পারবেন।


3

আমি মনে করি কারণটি হল, আপনি .DeclaringType()পদ্ধতিটি ব্যবহার করে রানটাইম টাইপের ধরণটি পান । আপনি বেস শ্রেণিতে লগারটি ব্যবহার করতে পারেন এবং এখনও লগার আউটপুটে আপনার অবজেক্টের প্রকৃত ধরণটি দেখতে পারেন। যা তদন্তকে আরও অনেক দৃin়প্রতিজ্ঞ করে তোলে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.