c# - 是否可以通过代码自定义 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 帐户并取消勾选我不想要的内容。
解决方案
是的,您可以使用代码控制要显示或不显示的列。
例如,假设您只想在 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>
推荐阅读
- windows - 如何编写程序自动连接wifi?
- html - Postman 如何从不是 JSON 或 XML 的响应中获取数据?
- r - x 轴上的日期是随机排序的,即使我使用的数据集中的时间顺序是正确的
- javascript - Webpack + babel,ReferenceError:未定义类
- github - 有没有办法在 git desktop 中克隆特定的分支?
- hibernate - 我应该使用 Kotlin 数据类作为 JPA 实体吗?
- sql - 在 sql oracle 中获取父级的 silbilng
- r - 使用函数创建列表,然后拆分为两个列表
- python - Python csv 包 - DictReader 模块的问题
- javascript - 如何更改按钮的大小并为其添加背景颜色?