Ведение журнала 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 !). Кроме того, это должно быть медленно.
Итак, как лучше всего, учитывая мои настройки и мое желание быть простым и быстрым?
Оцените любую помощь заранее.