logging-log4net-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From <stephanie.giovann...@wellsfargoadvisors.com>
Subject Logger in ASP.NET stops after a few hours, won't restart until app is cycled
Date Wed, 11 Jan 2012 16:38:18 GMT
I have a logger attached to an ASP.NET project. In test environments, the logger always works.
In production (much higher user load), the logger stops after a few hours and won't restart
until the app is cycled. I made modifications to make the logger thread-safe, but that didn't
fix the problem. I'm at a loss for how to troubleshoot since it only stops under high user
load.

In production, there are around 30 web servers and one database. I don't know if that makes
a difference. It's not a problem when I run other stored procedures.

I have years of experience with log4net, but before I've always used it in a server application,
not on a web server.

I don't have any idea of where to start debugging this, so I'm attaching most of the relevant
code, with some names changed:

Web.config:

<log4net>
    <appender name="XDbAppender" type="X.CustomAdoNetAppender">
      <bufferSize value="1"/>
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="data source=[server]; initial catalog=[dbname]"/>
      <commandText value="exec dbo.spSetLogMessage @date, @level, @msg, @exc"/>
      <parameter>
        <parameterName value="@date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@level" />
        <dbType value="String" />
        <size value="10" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@msg" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exc" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="XDbAppender"/>
    </root>
  </log4net>

Global.asax:

<%@ Application Language="C#" Inherits="Microsoft.Practices.CompositeWeb.WebClientApplication"
%>
<%@ Import Namespace="Y" %>
<script Language="C#" RunAt="server">

    private static readonly log4net.ILog Logger = log4net.LogManager.GetLogger("AppName");
    private static readonly object Locker = new object();

    protected override void Application_Start(object sender, EventArgs e)
    {
        lock (Locker)
        {
            log4net.Config.XmlConfigurator.Configure();
            Logger.Info("Started");
        }
        base.Application_Start(sender, e);
    }

    protected void Application_Error(object sender, EventArgs e)
    {
        lock (Locker)
        {
            var ex = Server.GetLastError();

            // exception has already been handled
            if (ex == null) return;

            string pageName = string.Empty;

            try
            {
                pageName = Request.CurrentExecutionFilePath;
            }
            catch (HttpException exc)
            {
                Logger.Warn(exc.Message);
            }

            var innermostEx = ex;
            while (innermostEx.InnerException != null) innermostEx = innermostEx.InnerException;

            string exceptionMessage = innermostEx.GetType().Name + ": " + innermostEx.Message;

            UserLogin ul = null;
            try
            {
                ul = (UserLogin) Session["LoggedInUser"];
            }
            catch (HttpException exc)
            {
                if (exc.Message != "Session state is not available in this context.")
                {
                    Logger.Warn(exc.Message);
                }
            }

            string message = string.Empty;
            if (ul != null)
            {
                message += "User:" + ul.Anumber;
            }
            if (pageName != string.Empty)
            {
                message += " Page:" + pageName;
            }
            if (exceptionMessage != string.Empty)
            {
                message += " Msg:" + exceptionMessage;
            }

            Logger.Error(message, ex);
        }
    }

    </script>

Custom DB appender (gets the correct connection string for the environment):

using Commons;
using log4net.Appender;

namespace X
{
    public class CustomAdoNetAppender : AdoNetAppender
    {
        public new string ConnectionString
        {
            get
            {
                return base.ConnectionString;
            }
            set
            {
                base.ConnectionString = (Common.GetConnectionString());
            }
        }
    }
}

Can anyone suggest where log4net is failing under high load, and why it stops entirely?


Stephanie Giovannini




Mime
View raw message