Вам необходимо присоединиться к пути,
app.use('/assets', express.static(path.join(__dirname, 'public')))
Для получения дополнительной информации, пожалуйста, обращайтесь: https://expressjs.com/en/starter/static-files.html Вы пытаетесь создать виртуальный путь.
Я в основном использую
public class MyClass
{
private static readonly ILog log = Log.Get<MyClass>();
}
, где Log.Get - это класс, который в основном делает это внутренне
return LogManager.GetLogger(typeof(T));
Стоимость запуска даже меньше, чем способ отражения, а также более чистый imo.
Обновление: , учитывая мой опыт более поздних лет с внедрением зависимостей, модульным тестированием и подделками, я больше не могу сказать, что одобряю подход, описанный выше. Проблема с подходом (как моим, так и OP) заключается в том, что код имеет явное знание о , как создается экземпляр журнала.
С одной стороны, эта повышенная связь затрудняет тестирование: нет простого способа заменить экземпляр ILog
поддельным. С другой стороны, изменения, внесенные в мой класс Log
, вызовут колебания во всех классах, которые его используют.
Поэтому я иду по пути внедрения экземпляра ILog
, обычно через внедрение конструктора, и передаю на аутсорсинг , как построить регистратор , в мой Выбранная структура DI :
public class MyClass
{
readonly ILog _log;
public class MyClass(ILog log)
{
_log = log;
}
}
Это обеспечивает правильную развязку. Коду больше не нужно знать, как устроены регистраторы. Большинство фреймворков внедрения зависимостей имеют средства просмотра вводимого типа и последующего использования его для создания экземпляра журнала. Вот подход для log4net и Autofac .
Большинство фреймворков внедрения зависимостей имеют средства просмотра вводимого типа и последующего использования его для создания экземпляра журнала. Вот подход для log4net и Autofac . Большинство фреймворков внедрения зависимостей имеют средства просмотра вводимого типа и последующего использования его для создания экземпляра журнала. Вот подход для log4net и Autofac .Стоимость выполнения его, Вашим исходным путем является экземпляр реализации ILog и время, которое требуется для выполнения "Системы. Отражение. MethodBase. GetCurrentMethod ().DeclaringType" при запуске.
Я не забываю изучать его несколько лет назад, и наша стоимость запуска была на порядке 1 секунды в 10 000 классов и меньше чем мегабайте в 10k классы.
Учитывая такую низкую стоимость, я никогда не оглядывался назад, учитывая incredibe гибкость log4net, обеспечивает.
Примечание: Я не могу прокомментировать другое решение здесь, поскольку я являюсь новым.. но эта строка:
метод = новая Система. Диагностика. StackTrace ().GetFrame (1).GetMethod ();
Является дорогим, особенно, если требуется каждое сообщение журнала.
В последнее время я создал что-то вроде этого:
public static class Logger
{
private static bool isLoaded = false;
public static ILog Log
{
get
{
System.Reflection.MethodBase method;
method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
StringBuilder loggerName = new StringBuilder();
loggerName.AppendFormat("{0}.{1}(", method.ReflectedType.FullName, method.Name);
ParameterInfo[] parameters = method.GetParameters();
string[] parametersStr = new string[parameters.Length];
if (parameters.Length > 0)
{
for (int i = 0; i < parameters.Length; i++)
{
parametersStr[i] = parameters[i].ToString();
}
loggerName.Append(String.Join(", ", parametersStr));
}
loggerName.Append(")");
return GetLogger(loggerName.ToString());
}
}
private static ILog GetLogger(string loggerName)
{
if (!isLoaded)
{
log4net.Config.XmlConfigurator.Configure();
}
return LogManager.GetLogger(loggerName);
}
}
это позволяет мне использовать log4net, не создавая его экземпляр в каждом классе, я должен использовать его, и я все еще получаю имя класса и метод, где я зарегистрировал действие.
Демонстрационное использование:
Logger.Log.DebugFormat("Response [{0}]", xmlResponse);
Инструмент, который вы можете использовать для ведения журнала, - это PostSharp ( http://www.postsharp.org/ ). Есть платная и бесплатная (Экспресс) версия. Я использовал его только для регистрации границ методов, но я знаю, что вы также можете использовать его для обработки ошибок. Между тем, это позволит удовлетворить большинство ваших потребностей в журналировании без написания кода для каждого класса.