none
Railsログをどう扱ったらいいでしょ? RRS feed

  • 質問

  • どうも、こんにちは!

    Azure上でRailsアプリを動かしています。
    こんな感じです⇒  http://blogs.msdn.com/b/mcsuksoldev/archive/2010/02/26/9969876.aspx

    ひとつ驚いたのが、Railsログがそのまま、Azure上にファイルとして出力できることでした。
    直接読み取ることができないので、プログラムからファイルを読み取ると下記のような感じになります。
    -----------------------------------------------------------------
    C:/Resources/directory/0de0005a473a48a9983ecc2498ad0419.RR.App/RailsApp/log/development.log
    Processing BlogsController#index (for 124.155.112.191 at 2010-09-22 08:47:23)
    [GET] Blog Load (203.1ms) SELECT * FROM [blogs]  Rendering template w
    -----------------------------------------------------------------

    質問なのですが、

    1. C:/Resources  ディレクトリってなんでしょ?ここにファイルを書き込んだり、プログラムから読み取ったりしてもいいのでしょうか?

    2. このファイルってずっと残りますでしょうか?それともあるタイミングで消えてしまうでしょうか?

    3. このログファイルをうまく扱いたい(ファイルとしてダウンロードなど管理したい)のですが、Driveに直接書き込むことなどできそうでしょうか。

    4.3が出来ない場合、バッチなどで随時ファイルを読み取ってBlobにファイルを生成していくような作りになっちゃうでしょうか?

    5.他にいい方法ありそうでしょうか?

    よろしくお願いします!

    ちなみにUSにも投げました。

    http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/3560d3d4-3ca7-4b77-a8d5-9ca075102bf5

    と同じものを投稿しています。

    2010年9月22日 9:39

回答

  • LocalResource とDirectoryConfiguration を使用して、Blob上にRailsログが出せることを確認しました。

    ※配布元のプロジェクトなどに改変をくわえてあります。(黄色でマーク)

    取り急ぎ感がありますが、解決したので共有します。

     

    < LocalResources >

          < LocalStorage cleanOnRoleRecycle = "false " name = "App " sizeInMB = "200 " />

        </ LocalResources >

     

     

    public override bool OnStart()

            {

                LogInfo("Worker Role OnStart Entered" );

     

                RoleEnvironment .Changing += RoleEnvironmentChanging;

     

                DiagnosticMonitorConfiguration dmc = DiagnosticMonitor .GetDefaultInitialConfiguration();

               

                // Azure I Basic ? O I Z b g A b v

                dmc.Logs.ScheduledTransferPeriod = TimeSpan .FromMinutes(1);

                dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel .Information;

     

                 //Get the local Storage resources ( Y e t @ C ? c c C Y ? Y)

                LocalResource disk = RoleEnvironment .GetLocalResource("App" );

     

                //Copy files across (log files and database are writeable)

                DirectoryInfo localStorageRoot = new DirectoryInfo (disk.RootPath);

     

                //Get the root of this role

                this .roleRoot = System.Environment .GetEnvironmentVariable("RoleRoot" );

                this .roleRoot += "\\approot" ;

     

                string rubyFolderName = RoleEnvironment .GetConfigurationSettingValue("RubyFolder" );

                this .rubyLocation = string .Format("{0}{1}" , localStorageRoot.FullName, rubyFolderName);

                LogInfo("[rubyLocation]{0}" , this .rubyLocation);

                CopyFolder(string .Format("{0}\\{1}" , this .roleRoot, rubyFolderName), this .rubyLocation);

     

                string appFolderName = RoleEnvironment .GetConfigurationSettingValue("AppFolder" );

                this .appLocation = string .Format("{0}{1}" , localStorageRoot.FullName, appFolderName);

                LogInfo("[appLocation]{0}" , this .appLocation);

                CopyFolder(string .Format("{0}\\{1}" , this .roleRoot, appFolderName), this .appLocation);

     

                // File ? O I Z b g A b v

                Exception directory_exception = null ;

                try

                {

                    DirectoryConfiguration directoryConfiguration = new DirectoryConfiguration ();

                    directoryConfiguration.Container = "wad-my-container" ;

                    directoryConfiguration.DirectoryQuotaInMB = 10;

                     directoryConfiguration.Path = string .Format("{0}\\log" , this .appLocation);

     

                    LogInfo("[log file path]{0}" , directoryConfiguration.Path);

     

                    dmc.Directories.ScheduledTransferPeriod = TimeSpan .FromMinutes(0.5);

                     dmc.Directories.DataSources.Add(directoryConfiguration);

     

                   

                }

                catch (Exception e)

                {

                    directory_exception = e;

                }

     

                //DiagnosticMonitor diagnosticMonitor = DiagnosticMonitor.Start(CloudStorageAccount.DevelopmentStorageAccount, dmc);

                DiagnosticMonitor .Start("DiagnosticsConnectionString" , dmc);

     

     

                this .roleId = RoleEnvironment .CurrentRoleInstance.Id;

                string outputContainer = RoleEnvironment .GetConfigurationSettingValue("OutputContainer" );

                CloudStorageAccount storageAccount = CloudStorageAccount .Parse(RoleEnvironment .GetConfigurationSettingValue("StorageAccount" ));

                CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

                this .container = blobClient.GetContainerReference(outputContainer);

                this .container.CreateIfNotExist();

     

                BlobContainerPermissions permissions = this .container.GetPermissions();

                permissions.PublicAccess = BlobContainerPublicAccessType .Container;

                this .container.SetPermissions(permissions);

     

                //Get the local endpoint

     

                this .endPoint  = RoleEnvironment .CurrentRoleInstance.InstanceEndpoints["Server" ].IPEndpoint;

     

                // Start the server

     

                StartProcess();

     

                LogInfo("Worker Role OnStart Exited" );

     

                if (directory_exception != null )

                {

                    LogInfo("--------- directory_exception ---------" );

                     LogInfo("[message]{0}" , directory_exception.Message);

                }

     

               

                return base .OnStart();

            }



    2010年10月5日 10:29

すべての返信

  • Custom Diagnosticsを試してみることにしました。

    結果が出ましたら共有します。

    http://nmackenzie.spaces.live.com/blog/cns!B863FF075995D18A!537.entry?wa=wsignin1.0&sa=492662683

     

     

    2010年9月23日 4:20
  • LocalResource とDirectoryConfiguration を使用して、Blob上にRailsログが出せることを確認しました。

    ※配布元のプロジェクトなどに改変をくわえてあります。(黄色でマーク)

    取り急ぎ感がありますが、解決したので共有します。

     

    < LocalResources >

          < LocalStorage cleanOnRoleRecycle = "false " name = "App " sizeInMB = "200 " />

        </ LocalResources >

     

     

    public override bool OnStart()

            {

                LogInfo("Worker Role OnStart Entered" );

     

                RoleEnvironment .Changing += RoleEnvironmentChanging;

     

                DiagnosticMonitorConfiguration dmc = DiagnosticMonitor .GetDefaultInitialConfiguration();

               

                // Azure I Basic ? O I Z b g A b v

                dmc.Logs.ScheduledTransferPeriod = TimeSpan .FromMinutes(1);

                dmc.Logs.ScheduledTransferLogLevelFilter = LogLevel .Information;

     

                 //Get the local Storage resources ( Y e t @ C ? c c C Y ? Y)

                LocalResource disk = RoleEnvironment .GetLocalResource("App" );

     

                //Copy files across (log files and database are writeable)

                DirectoryInfo localStorageRoot = new DirectoryInfo (disk.RootPath);

     

                //Get the root of this role

                this .roleRoot = System.Environment .GetEnvironmentVariable("RoleRoot" );

                this .roleRoot += "\\approot" ;

     

                string rubyFolderName = RoleEnvironment .GetConfigurationSettingValue("RubyFolder" );

                this .rubyLocation = string .Format("{0}{1}" , localStorageRoot.FullName, rubyFolderName);

                LogInfo("[rubyLocation]{0}" , this .rubyLocation);

                CopyFolder(string .Format("{0}\\{1}" , this .roleRoot, rubyFolderName), this .rubyLocation);

     

                string appFolderName = RoleEnvironment .GetConfigurationSettingValue("AppFolder" );

                this .appLocation = string .Format("{0}{1}" , localStorageRoot.FullName, appFolderName);

                LogInfo("[appLocation]{0}" , this .appLocation);

                CopyFolder(string .Format("{0}\\{1}" , this .roleRoot, appFolderName), this .appLocation);

     

                // File ? O I Z b g A b v

                Exception directory_exception = null ;

                try

                {

                    DirectoryConfiguration directoryConfiguration = new DirectoryConfiguration ();

                    directoryConfiguration.Container = "wad-my-container" ;

                    directoryConfiguration.DirectoryQuotaInMB = 10;

                     directoryConfiguration.Path = string .Format("{0}\\log" , this .appLocation);

     

                    LogInfo("[log file path]{0}" , directoryConfiguration.Path);

     

                    dmc.Directories.ScheduledTransferPeriod = TimeSpan .FromMinutes(0.5);

                     dmc.Directories.DataSources.Add(directoryConfiguration);

     

                   

                }

                catch (Exception e)

                {

                    directory_exception = e;

                }

     

                //DiagnosticMonitor diagnosticMonitor = DiagnosticMonitor.Start(CloudStorageAccount.DevelopmentStorageAccount, dmc);

                DiagnosticMonitor .Start("DiagnosticsConnectionString" , dmc);

     

     

                this .roleId = RoleEnvironment .CurrentRoleInstance.Id;

                string outputContainer = RoleEnvironment .GetConfigurationSettingValue("OutputContainer" );

                CloudStorageAccount storageAccount = CloudStorageAccount .Parse(RoleEnvironment .GetConfigurationSettingValue("StorageAccount" ));

                CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

                this .container = blobClient.GetContainerReference(outputContainer);

                this .container.CreateIfNotExist();

     

                BlobContainerPermissions permissions = this .container.GetPermissions();

                permissions.PublicAccess = BlobContainerPublicAccessType .Container;

                this .container.SetPermissions(permissions);

     

                //Get the local endpoint

     

                this .endPoint  = RoleEnvironment .CurrentRoleInstance.InstanceEndpoints["Server" ].IPEndpoint;

     

                // Start the server

     

                StartProcess();

     

                LogInfo("Worker Role OnStart Exited" );

     

                if (directory_exception != null )

                {

                    LogInfo("--------- directory_exception ---------" );

                     LogInfo("[message]{0}" , directory_exception.Message);

                }

     

               

                return base .OnStart();

            }



    2010年10月5日 10:29
  • こんばんは、statemachineです。ちょっと目を離していた隙に、こんな質問が投げられていて、自己解決されてしまったみたいなんで、いまさら蛇足かつ釈迦に説法かもしれませんが。

    ログには、Tableに出力するログと、Blobに出力するログの二種類があります。Blobに出力するログには、IISのログなどがあって、これは特定のフォルダに出力されたファイルをBlobに転送する単純な仕組みです。

    したがって、特定のフォルダをソースにして、Blobへ転送する設定をしておけば、独自のログをBlobに出力することができます。

    以下、設定サンプル。ログは、LocalStorage1.RootPathにファイルとして書き込んでおけば、Blobに転送される仕組みです。

    var dmc = DiagnosticMonitor.GetDefaultInitialConfiguration();
    // 30秒単位で転送(実際はもっと長くする)
    dmc.Directories.ScheduledTransferPeriod = TimeSpan.FromSeconds(30);
    
    // カスタムログのコンテナをQuotaを設定
    var dconfig = new DirectoryConfiguration()
               {
                 Container = "user-logs",
                 DirectoryQuotaInMB = 100,
               };
    
    // LocalStorageのRootPathをログの基点フォルダとして設定
    var res = RoleEnvironment.GetLocalResource("LocalStorage1");
    dconfig.Path = res.RootPath;
    
    // データソースに追加
    dmc.Directories.DataSources.Add(dconfig);
    DiagnosticMonitor.Start("DiagnosticsConnectionString", dmc);
    
     
    
    近いうちに、Azureの小ネタ  でも取り上げようかと思います。
    2010年10月5日 13:12