đối số log4net thành LogManager.GetLogger


98

Tại sao hầu hết các ví dụ log4net lấy trình ghi nhật ký cho một lớp bằng cách thực hiện điều này:

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

Thay vì chỉ truyền typeof (MyClass):

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

Có lý do nào khác để làm điều này, ngoài thực tế là tùy chọn đầu tiên không yêu cầu bạn nhập một tên lớp cụ thể?

Câu trả lời:


93

Tôi nghĩ bạn có lý do. Tôi làm theo cách đó để không phải lo lắng về tên lớp và chỉ cần sao chép và dán mã tấm lò hơi trong một lớp mới.

Để biết câu trả lời chính thức, hãy xem: Làm cách nào để lấy tên đủ điều kiện của một lớp trong khối tĩnh? tại câu hỏi thường gặp về log4net


Ok mà xóa nó lên, nhờ liên kết đó, tôi đã không nhìn thấy rằng trước
Andy White

Đây là như cũ như nó được, nhưng có một cái nhìn vào câu trả lời của tôi trong trường hợp bạn vẫn dán như mã nồi hơi :)
Noctis

Bạn tiết kiệm được một chút thời gian Dev cắt và dán mã này. Tuy nhiên, có một chi phí để gọi 'GetCurrentMethod ()' thay vì sử dụng hằng chuỗi hoặc gọi 'typeof ()'. Nếu bạn cộng bao nhiêu lần điều này sẽ được gọi trong suốt thời gian tồn tại của mã với khoảng thời gian bạn nhập tên lớp vào, tôi nghĩ bạn chỉ làm chậm mã của mình vì lợi ích nhỏ.
Youngs

1
Bạn không bị chậm lại nhiều như bạn nghĩ, đây là một cuộc gọi tĩnh nên bạn có một lệnh gọi cho mỗi lớp trên mỗi miền ứng dụng, ví dụ: nếu bạn có 300 lớp, bạn có nhiều nhất 300 lệnh gọi này trong suốt thời gian ứng dụng của mình
Paul Hatcher

Không có ích gì khi sử dụng phản chiếu để lấy tên loại, và bản sao / quá khứ là sự lười biếng và bạn nhận được thành tích hiệu suất, vậy tại sao không chỉ lấy tên ?!
MeTitus

8

Tôi là một người dùng NLog và điều này thường tổng hợp thành:

var _logger = LogManager.GetCurrentClassLogger();

Có vẻ hơi lạ khi bạn cần xem qua phần phản ánh trong Log4Net, vì vậy tôi đã xem qua mã nguồn NLog, và hãy lo và đây là những gì họ làm cho bạn:

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

Tôi đoán tôi sẽ viết một cái gì đó tương tự cho Log4Net dưới dạng tiện ích mở rộng hoặc phương thức tĩnh thay vì dán phản chiếu như một phần của mã nồi hơi của tôi :)


7

Như bạn nói - thật tiện lợi vì bạn có thể tạo một trình ghi nhật ký trong một phương thức mà không cần biết tên của lớp (tôi biết thì tầm thường) nhưng cho phép bạn cắt và dán các phương thức giữa các lớp mà không cần phải đổi tên cuộc gọi.


3

Tôi nghĩ lý do là, bạn nhận được loại kiểu thời gian chạy bằng .DeclaringType()phương pháp này. Bạn có thể sử dụng trình ghi nhật ký trong một lớp cơ sở và vẫn thấy loại đối tượng thực tế của bạn trong đầu ra của trình ghi nhật ký. Điều đó làm cho các cuộc điều tra trở nên thuận lợi hơn nhiều.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.