/// <summary> /// Emit the provided log event to the sink. /// </summary> /// <param name="logEvent">The log event to write.</param> public void Emit(LogEvent logEvent) { var table = _cloudTableProvider.GetCloudTable(_storageAccount, _storageTableName, _bypassTableCreationValidation); var op = TableOperation.Insert(AzureTableStorageEntityFactory.CreateEntityWithProperties(logEvent, _formatProvider, _additionalRowKeyPostfix, _keyGenerator, _propertyColumns)); table.ExecuteAsync(op).SyncContextSafeWait(_waitTimeoutMilliseconds); }
/// <summary> /// Emit the provided log event to the sink. /// </summary> /// <param name="logEvent">The log event to write.</param> public void Emit(LogEvent logEvent) { var op = TableOperation.Insert( AzureTableStorageEntityFactory.CreateEntityWithProperties(logEvent, _formatProvider, _additionalRowKeyPostfix)); _table.ExecuteAsync(op).SyncContextSafeWait(_waitTimeoutMilliseconds); }
protected override async Task EmitBatchAsync(IEnumerable <LogEvent> events) { var table = _cloudTableProvider.GetCloudTable(_storageAccount, _storageTableName, _bypassTableCreationValidation); string lastPartitionKey = null; TableBatchOperation operation = null; var insertsPerOperation = 0; foreach (var logEvent in events) { var tableEntity = AzureTableStorageEntityFactory.CreateEntityWithProperties(logEvent, _formatProvider, _additionalRowKeyPostfix, _keyGenerator, _propertyColumns); // If partition changed, store the new and force an execution if (lastPartitionKey != tableEntity.PartitionKey) { lastPartitionKey = tableEntity.PartitionKey; // Force a new execution insertsPerOperation = _maxAzureOperationsPerBatch; } // If reached max operations per batch, we need a new batch operation if (insertsPerOperation == _maxAzureOperationsPerBatch) { // If there is an operation currently in use, execute it if (operation != null) { await table.ExecuteBatchAsync(operation).ConfigureAwait(false); } // Create a new batch operation and zero count operation = new TableBatchOperation(); insertsPerOperation = 0; } // Add current entry to the batch operation.Add(TableOperation.InsertOrMerge(tableEntity)); insertsPerOperation++; } // Execute last batch await table.ExecuteBatchAsync(operation).ConfigureAwait(false); }
/// <summary> /// Construct a sink that saves logs to the specified storage account. /// </summary> /// <param name="storageAccount">The Cloud Storage Account to use to insert the log entries to.</param> /// <param name="formatProvider">Supplies culture-specific formatting information, or null.</param> /// <param name="storageTableName">Table name that log entries will be written to. Note: Optional, setting this may impact performance</param> /// <param name="additionalRowKeyPostfix">Additional postfix string that will be appended to row keys</param> public AzureTableStorageWithPropertiesSink(CloudStorageAccount storageAccount, IFormatProvider formatProvider, string storageTableName = null, string additionalRowKeyPostfix = null) { var tableClient = storageAccount.CreateCloudTableClient(); if (string.IsNullOrEmpty(storageTableName)) { storageTableName = "LogEventEntity"; } _table = tableClient.GetTableReference(storageTableName); _table.CreateIfNotExists(); _formatProvider = formatProvider; if (additionalRowKeyPostfix != null) { _additionalRowKeyPostfix = AzureTableStorageEntityFactory.GetValidStringForTableKey(additionalRowKeyPostfix); } }
protected override async Task EmitBatchAsync(IEnumerable <LogEvent> events) { string lastPartitionKey = null; TableBatchOperation operation = null; int insertsPerOperation = 0; foreach (var logEvent in events) { var tableEntity = AzureTableStorageEntityFactory.CreateEntityWithProperties(logEvent, _formatProvider, _additionalRowKeyPostfix); // If partition changed, store the new and force an execution if (lastPartitionKey != tableEntity.PartitionKey) { lastPartitionKey = tableEntity.PartitionKey; // Force a new execution insertsPerOperation = _maxAzureOperationsPerBatch; } // If reached max operations per batch, we need a new batch operation if (insertsPerOperation == _maxAzureOperationsPerBatch) { // If there is an operation currently in use, execute it if (operation != null) { await _table.ExecuteBatchAsync(operation); } // Create a new batch operation and zero count operation = new TableBatchOperation(); insertsPerOperation = 0; } // Add current entry to the batch operation.Add(TableOperation.Insert(tableEntity)); insertsPerOperation++; } // Execute last batch await _table.ExecuteBatchAsync(operation); }
/// <summary> /// Construct a sink that saves logs to the specified storage account. /// </summary> /// <param name="storageAccount">The Cloud Storage Account to use to insert the log entries to.</param> /// <param name="formatProvider">Supplies culture-specific formatting information, or null.</param> /// <param name="batchSizeLimit"></param> /// <param name="period"></param> /// <param name="storageTableName">Table name that log entries will be written to. Note: Optional, setting this may impact performance</param> /// <param name="additionalRowKeyPostfix">Additional postfix string that will be appended to row keys</param> public AzureBatchingTableStorageWithPropertiesSink(CloudStorageAccount storageAccount, IFormatProvider formatProvider, int batchSizeLimit, TimeSpan period, string storageTableName = null, string additionalRowKeyPostfix = null) : base(batchSizeLimit, period) { var tableClient = storageAccount.CreateCloudTableClient(); if (string.IsNullOrEmpty(storageTableName)) { storageTableName = "LogEventEntity"; } _table = tableClient.GetTableReference(storageTableName); _table.CreateIfNotExistsAsync().SyncContextSafeWait(_waitTimeoutMilliseconds); _formatProvider = formatProvider; if (additionalRowKeyPostfix != null) { _additionalRowKeyPostfix = AzureTableStorageEntityFactory.GetValidStringForTableKey(additionalRowKeyPostfix); } }
/// <summary> /// Emit the provided log event to the sink. /// </summary> /// <param name="logEvent">The log event to write.</param> public void Emit(LogEvent logEvent) { _table.Execute(TableOperation.Insert(AzureTableStorageEntityFactory.CreateEntityWithProperties(logEvent, _formatProvider, _additionalRowKeyPostfix))); }