using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.IO; using System.Text; using System; using TEAMModelOS.SDK.DI; using Azure; using Azure.Storage.Blobs.Specialized; using System.Threading.Tasks; namespace TEAMModelOS.Filter { public class BlobLoggerProvider: ILoggerProvider { private readonly AzureStorageFactory _storageFactory; public BlobLoggerProvider(AzureStorageFactory storageFactory) { _storageFactory=storageFactory; var container = _storageFactory.GetBlobContainerClient("0-service-log"); container.CreateIfNotExists(PublicAccessType.None); //嘗試創建School容器,如存在則不做任何事,保障容器一定存在 } public ILogger CreateLogger(string categoryName) { return new BlobLogger(categoryName, _storageFactory.GetBlobContainerClient("0-service-log")); } public void Dispose() { // Dispose any resources used by the provider. } } public class BlobLogger : ILogger { private readonly string _categoryName; private readonly BlobContainerClient _containerClient; public BlobLogger(string categoryName, BlobContainerClient containerClient) { _categoryName = categoryName; _containerClient = containerClient; } public IDisposable BeginScope(TState state) { return null; } public bool IsEnabled(LogLevel logLevel) { return true; } public async void Log ( LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) { if (formatter == null) { throw new ArgumentNullException(nameof(formatter)); } var message = formatter(state, exception); var appendBlob = _containerClient.GetAppendBlobClient($"{_categoryName}/{DateTimeOffset.UtcNow:yyyy-MM-dd}.log"); // var blobClient = _containerClient.GetBlobClient($"{_categoryName}/{DateTimeOffset.UtcNow:yyyy-MM-dd}.log"); if (!appendBlob.Exists()) { await appendBlob.CreateAsync(); using var stream = new MemoryStream(Encoding.UTF8.GetBytes(message)); await appendBlob.AppendBlockAsync(stream); } else { using var stream = new MemoryStream(Encoding.UTF8.GetBytes($"\n,{message}")); await appendBlob.AppendBlockAsync(stream); } } } }