読者です 読者をやめる 読者になる 読者になる

ASP.NET - AppDomain がシャットダウンされた理由を取得してみる

アプリケーションがリスタートされるタイミングを調べていたときに ApplicationShutdownReason という enum 値を見つけました。この値から AppDomain がシャットダウンされた理由、たとえば bin フォルダ内のファイルが変更されたからとか、web.config が変更されたからというのがわかるようです。

ApplicationShutdownReason 列挙体 (System.Web)

で、この値は HostingEnvironment.ShutdownReason プロパティから取得できます。

HostingEnvironment.ShutdownReason プロパティ (System.Web.Hosting)

ということで、試しに Global.asax の Application_End でこの値をログ出力してみます。ログ出力には NLog を使用します。

// Global.asax.cs
public class MvcApplication : System.Web.HttpApplication {
    private static readonly Logger _logger = LogManager.GetCurrentClassLogger();

    protected void Application_End() {
        _logger.Info(
            string.Format("Application_End:{0}", HostingEnvironment.ShutdownReason));
    }
}

念のため NLog.config はこんな感じ。

<?xml version="1.0" encoding="utf-8"?>
<nlog
    xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
        <target name="file" xsi:type="File" encoding="utf-8"
            fileName="${basedir}/../Log/${shortdate}.log"
            layout="${message}" />
    </targets>
    <rules>
        <logger name="*" minlevel="Info" writeTo="file" />
    </rules>
</nlog>

といった簡単なプログラムをデプロイして試してみます。

bin フォルダ内のファイルを上書きしてみる
Application_End:BinDirChangeOrDirectoryRename
IIS でアプリケーションプールをリサイクルしてみる
Application_End:HostingEnvironment
アプリケーションルートの web.config を開いて上書き保存してみる
Application_End:ConfigurationChange

確かに取得できてますね。

IIS8(Windows Server 2012 R2)で確認しました。