首页 > 解决方案 > 是否可以通过代码自定义 Azure 表存储?(Log4net.Azure)

问题描述

所以我正在使用 C# 编写 WebApi,我在 web.config 中配置了 log4net(使用 log4net.azure),我的配置如下:

<appender name="AzureTableAppender" type="log4net.Appender.AzureTableAppender, log4net.Appender.Azure">
  <param name="TableName" value="myLogs" />
  <param name="ConnectionStringName" value="AzureTable" />
  <param name="PropAsColumn" value="true" />
  <bufferSize value="1" />
  <param name="PartitionKeyType" value="LoggerName" />
</appender>

我的问题是我得到了很多我不需要的额外列,现在我得到以下内容:

在此处输入图像描述

我正在寻找一种方法来选择要显示的列,并且可以通过代码添加更多列,而无需转到我的 azure 帐户并取消勾选我不想要的内容。

标签: c#azureasp.net-web-apilog4netazure-table-storage

解决方案


是的,您可以使用代码控制要显示或不显示的列。

例如,假设您只想在 azure 表存储中拥有 4 列:Message / Level / RoleInstance / DeploymentId,您可以按照以下步骤操作:

步骤 1.创建一个包含上述 4 列的表:

public class AzureLog : TableEntity
    {
        public AzureLog()
        {
            var now = DateTime.UtcNow;
            PartitionKey = string.Format("{0:yyyy-MM}", now);
            RowKey = string.Format("{0:dd HH:mm:ss.fff}-{1}", now, Guid.NewGuid());
        }

        public string RoleInstance { get; set; }
        public string DeploymentId { get; set; }    
        public string Message { get; set; }
        public string Level { get; set; }

    }

步骤 2.创建一个类,仅用于创建存储日志的表。这里我们将它命名为 Logger:

public class Logger
    {
        //Storage credentials.
        public StorageCredentials credentials = null;

        //Storage account.
        public CloudStorageAccount account = null;

        //Table client
        public CloudTableClient tableClient = null;

        //Table.
        public CloudTable table = null;

        // Constructor.
        public Logger(string tableName, string accountName, string accountKey)
        {
            //Create storage credentials object.
            credentials = new StorageCredentials(accountName,
            accountKey);

            //Create storage account object.
            account = new CloudStorageAccount(credentials, false);

            //Create table client object.
            tableClient = account.CreateCloudTableClient();

            //Get the table reference.
            table = tableClient.GetTableReference(tableName);

            //Check whether table exist or not.
            if (!table.Exists())
            {
                //Create the table if not exist.
                table.Create();
            }
        }

        // Insert into table.
        public void Insert(AzureLog objAzureLog)
        {
            // Create the new insert table operation.
            TableOperation insertOperation = TableOperation.Insert(objAzureLog);

            // Execute the insert statement.
            table.Execute(insertOperation);
        }
    }

步骤 3.定义您的自定义附加程序:

public class AzureLogAppender : AppenderSkeleton
    {
        //Logger object.
        private Logger objLogger = null;

        //Azure table name.
        public string tableName { get; set; }

        //Azure account name.
        public string accountName { get; set; }

        //Azure account key.
        public string accountKey { get; set; }

        public override void ActivateOptions()
        {
            base.ActivateOptions();

            //Logger object.
            if (objLogger == null)
            {
                //Intilize logger object.
                this.objLogger = new Logger(tableName, accountName, accountKey);
            }
        }

        protected override void Append(LoggingEvent loggingEvent)
        {
            try
            {
                //Intilize AzureLog object.
                AzureLog objAzureLog = new AzureLog
                                    {
                                        RoleInstance = "1",
                                        DeploymentId = "100", 
                                        Message = loggingEvent.RenderedMessage,
                                        Level = loggingEvent.Level.Name,
                                    };

                //Insert the log.
                objLogger.Insert(objAzureLog);
            }
            catch (Exception ex)
            {
                //Handle exception here.
            }
        }
    }

步骤 4.Test 代码:

class Program
    {
        //Get the logger object.
        private static readonly ILog logger = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            try
            {
                logger.Debug("Debug information.");
                logger.Info("Info information.");
                logger.Warn("Warn information.");
                logger.Error("Error information.");
                logger.Fatal("Fatal information.");
                Console.WriteLine("ok");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
        }
    }

步骤 5.My app.config 如下:

<configuration>    
  <configSections>
    <section name="log4net"
       type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>    
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>    
  <log4net>
    <appender name="AzureLogAppender" type="Log4NetAzureTables.AzureLogAppender, Log4NetAzureTables" >
      <param name="tableName" value="your table name" />
      <param name="accountName" value="your account" />
      <param name="accountKey" value="your account key" />
    </appender>    
    <root>
      <level value="ALL" />
      <appender-ref ref="AzureLogAppender" />
    </root>    
  </log4net>      
</configuration>

Step 6.Nav to table,只添加指定的列: 在此处输入图像描述


推荐阅读