• Azure Cloud中的Log4Net设置


    这里的Cloud包含Worker Role和Web Role,Role是运行在云主机中的,这里的主机和VM有所不同,Windows Azure Role Architecture。我们并没有和本地服务器一样的权限;且在Role中,除了我们的应用,其他任何数据都是非持久化的。所以在Azure中使用Log4Net需要解决两个问题,分别是写的权限和日志持久化。

    第一个问题我采用的是Role的本地存储,即在Role运行的VM中,开辟一块空间,供Log4Net使用,这里没有任何权限问题。

    首先在Azure项目配置文件(csdef)中配置本地存储的名称和容量:

    <LocalResources>
      <LocalStorage name="Log4Net" cleanOnRoleRecycle="false" sizeInMB="2048" />
      <LocalStorage name="CrashLogs" cleanOnRoleRecycle="false" sizeInMB="2048" />
    </LocalResources>

    其次在Log4Net文件中修改Appender,这里我们需要对Log4Net进行一些扩展,创建一个名为AzureAppender的自定义Appender。

    <!-- "debug" log file appender -->
    <appender name="DebugFileAppender" type="Utility.Extension.AzureAppender, IDFSoft.Utility">
      <encoding value="utf-8" />
      <param name="File" value="C:PAlogs"/>
      <param name="StaticLogFileName" value="false" />
      <param name="DatePattern" value="yyyy-MM-dd_'Game_Debug.log'" />
      <param name="RollingStyle" value="Date" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="1" />
      <param name="MaximumFileSize" value="250MB" />
      <param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="DEBUG" />
      </filter>
    </appender>

    AzureAppender只需要覆盖父类的File字段即可,在当前应用运行在Azure环境中时,修改日志文件路径为本地存储,so easy。

    public class AzureAppender : RollingFileAppender
    {
        public override string File
        {
            set
            {
                try
                {
                    if (RoleEnvironment.IsAvailable || RoleEnvironment.IsEmulated)
                    {
                        base.File = RoleEnvironment.GetLocalResource("Log4Net").RootPath + @"" + new FileInfo(value).Name;
                    }
                    else
                    {
                        base.File = value;
                    }
                }
                catch
                {
                    base.File = Path.Combine("Log4Net", new FileInfo(value).Name);
                }
            }
        }
    }

    再来看看第二个问题,就更简单了,Role启动时,设置需要同步的本地存储和同步的目标即可。

    public class WebRole : RoleEntryPoint
    {
        public override bool OnStart()
        {
            var diagnosticsConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();
            diagnosticsConfig.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
            diagnosticsConfig.Directories.DataSources.Add(
                    new DirectoryConfiguration
                    {
                        Path = RoleEnvironment.GetLocalResource("Log4Net").RootPath,
                        Container = "log4net",
                        DirectoryQuotaInMB = 1024
                    }
            );
            string crashLogPath = RoleEnvironment.GetLocalResource("CrashLogs").RootPath;
            CrashDumps.EnableCollectionToDirectory(crashLogPath, true);
            DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", diagnosticsConfig);
            return base.OnStart();
        }
    }

    至此,终于在Azure Storage中看到了久违的日志。

    image001

  • 相关阅读:
    iOS开发UI篇—UITabBarController简单介绍
    iOS开发UI篇—ios应用数据存储方式(归档)
    iOS开发UI篇—ios应用数据存储方式(偏好设置)
    iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
    iOS开发UI篇—控制器的View的创建
    WordPress显示备案号
    jQuery插件之Wookmark瀑布流
    Nodejs电影建站开发实例(下)
    Nodejs电影建站开发实例(上)
  • 原文地址:https://www.cnblogs.com/fengxiang/p/3427304.html
Copyright © 2020-2023  润新知