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

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

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

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

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

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

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

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

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

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

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

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

Оцените любую помощь заранее.

Ответы на вопрос(4)

Ваш ответ на вопрос