Ведение журнала ClassName и MethodName с использованием log4net для проекта .NET

Я искал способ регистрировать имена классов и имена методов как часть моей инфраструктуры регистрации. Очевидно, я хотел бы сделать его простым в использовании и быстрым во время выполнения. Я много читал об именах классов и методах ведения журнала, но я столкнулся с двумя темами.

  1. Этот log4net использует внутреннее исключение, генерирующее исключение для генерации фрейма стека, и это становится дорогостоящим, если вы обычно используете его для все ведение журнала.
  2. Путаница. Есть много литературы. Я перепробовал их, но ничего полезного не получил.

Если вы шутите меня на секунду, я бы хотел выполнить сброс.

Я создал такой класс в моем проекте

public static class Log {
    private static Dictionary<Type, ILog> _loggers = new Dictionary<Type, ILog>();
    private static bool _logInitialized = false;
    private static object _lock = new object();

    public static string SerializeException(Exception e) {
        return SerializeException(e, string.Empty);
    }

    private static string SerializeException(Exception e, string exceptionMessage) {
        if (e == null) return string.Empty;

        exceptionMessage = string.Format(
            "{0}{1}{2}\n{3}",
            exceptionMessage,
            (exceptionMessage == string.Empty) ? string.Empty : "\n\n",
            e.Message,
            e.StackTrace);

        if (e.InnerException != null)
            exceptionMessage = SerializeException(e.InnerException, exceptionMessage);

        return exceptionMessage;
    }

    private static ILog getLogger(Type source) {
        lock (_lock) {
            if (_loggers.ContainsKey(source)) {
                return _loggers[source];
            }

            ILog logger = log4net.LogManager.GetLogger(source);
            _loggers.Add(source, logger);
            return logger;
        }
    }

    public static void Debug(object source, object message) {
        Debug(source.GetType(), message);
    }

    public static void Debug(Type source, object message) {
        getLogger(source).Debug(message);
    }

    public static void Info(object source, object message) {
        Info(source.GetType(), message);
    }

    public static void Info(Type source, object message) {
        getLogger(source).Info(message);
    }

...

    private static void initialize() {
        XmlConfigurator.Configure(); 
    }

    public static void EnsureInitialized() {
        if (!_logInitialized) {
            initialize();
            _logInitialized = true;
        }
    }
}

(Если этот код кажется вам знакомым, это потому, что он заимствован из примеров!)

В любом случае, на протяжении всего проекта я использую такие строки для логирования:

        Log.Info(typeof(Program).Name, "System Start");

Ну, это работает. Самое главное, я получаю имя класса, но не имя метода. Менее важно то, что я загрязняю свой код мусором типа "typeof". Если я скопирую и вставлю фрагмент кода между файлами и т. Д., Фреймворк регистрации будет лгать!

Я попытался поиграть с PatternLayout (% C {1}. {M}), но это не сработало (все сделал было записать "Log.Info" в журнал - потому что все маршрутизируется через журнал. X статические методы!). Кроме того, это должно быть медленно.

Итак, что лучше всего, учитывая мою настройку и мое желание быть простым и быстрым?

Заранее благодарю за любую помощь.

9
задан Steinbekker 22 September 2010 в 15:30
поделиться