Исключение в приложении ASP.Net MVC с Log4net на общем хостинге

У меня есть веб-сайт, который был разработан с использованием ASP.Net MVC и использует Log4net для регистрации исключений. Сайт работал нормально до 4 часов назад. За последние 2 недели мы не вносили никаких изменений на сайт. Веб-сайт работает бесперебойно с тех пор, как мы запустили его около 1 месяца назад. Веб-сайт размещен у нашего интернет-провайдера на учетной записи общего хостинга.

Это исключение, которое мы получаем:

[FormatException: String was not recognized as a valid Boolean.]
   log4net.Core.LoggerManager.RegisterAppDomainEvents() +0
   log4net.Core.LoggerManager..cctor() +33

[TypeInitializationException: The type initializer for 'log4net.Core.LoggerManager' threw an exception.]
   log4net.Core.LoggerManager.GetLogger(Assembly repositoryAssembly, String name) +0
   log4net.LogManager.GetLogger(Assembly repositoryAssembly, String name) +8
   log4net.LogManager.GetLogger(String name) +20
   i3t.LcaWeb.View.MvcApplication..cctor() in Global.asax.cs:17

[TypeInitializationException: The type initializer for 'i3t.LcaWeb.View.MvcApplication' threw an exception.]
   i3t.LcaWeb.View.MvcApplication..ctor() +0
   ASP.global_asax..ctor() in App_global.asax.fqjmwqjv.0.cs:0

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86
   System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +67
   System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +1051
   System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes) +111
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +215
   System.Web.HttpApplicationFactory.FireApplicationOnStart(HttpContext context) +8878568
   System.Web.HttpApplicationFactory.EnsureAppStartCalled(HttpContext context) +136
   System.Web.HttpApplicationFactory.GetApplicationInstance(HttpContext context) +92
   System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +289

Исключение создается в Global.asax, где создается экземпляр log4net.ILog:

public class MvcApplication : System.Web.HttpApplication
{
    private static log4net.ILog log = log4net.LogManager.GetLogger("global.asax");

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Home.aspx",
            "",
            new { action = "Index", controller = "Home" }
        );

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

Я считаю, что что-то могло измениться на стороне провайдера, что что-то сломало.

Любые подсказки о том, как решить эту проблему?


person Saajid Ismail    schedule 14.09.2010    source источник


Ответы (2)


У меня была аналогичная проблема. В моей ситуации оказалось, что я случайно заполнил логическое поле в Web.config как нечто, не являющееся логическим.

Например, у меня было это в моем Web.config:

<appender name="XYLogger" type="log4net.Appender.RollingFileAppender">
    <file value="App_Data\logging\xymaps.log" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <appendToFile value="some-file-name"/>
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="2" />
    <maximumFileSize value="2MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-tp %c %m%n" />
    </layout>
</appender>

Я ошибочно принял <appendToFile> за тег для указания имени файла, к которому должен добавляться регистратор. Вместо этого он должен был читать <appendToFile value="true" />. Поэтому, если кто-то еще столкнется с этой проблемой, я бы посоветовал им дважды проверить свой Web.config на наличие логических полей с неверными значениями.

person Michael Keane Galloway    schedule 06.06.2014

LogManager.GetLogger() ожидает имя класса, в котором он будет использоваться для ведения журнала, а не Global.asax, который является именем файла. Пожалуйста, используйте только "Global" в качестве параметра для LogManager.GetLogger().

person Sunil Chowgale    schedule 22.02.2011
comment
GetLogger() принимает имя регистратора. Обычно используется передача имени класса, но это вовсе не обязательно. Кроме того, если это так, почему вы предлагаете передать «Глобальный», когда класс называется MvcApplication? - person Serge Wautier; 22.02.2011