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