BlobLoggerProvider.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Azure.Storage.Blobs;
  2. using Azure.Storage.Blobs.Models;
  3. using Microsoft.Extensions.Logging;
  4. using Microsoft.Extensions.Options;
  5. using System.IO;
  6. using System.Text;
  7. using System;
  8. using TEAMModelOS.SDK.DI;
  9. using Azure;
  10. using Azure.Storage.Blobs.Specialized;
  11. using System.Threading.Tasks;
  12. namespace TEAMModelOS.Filter
  13. {
  14. public class BlobLoggerProvider: ILoggerProvider
  15. {
  16. private readonly AzureStorageFactory _storageFactory;
  17. public BlobLoggerProvider(AzureStorageFactory storageFactory)
  18. {
  19. _storageFactory=storageFactory;
  20. var container = _storageFactory.GetBlobContainerClient("0-service-log");
  21. container.CreateIfNotExists(PublicAccessType.None); //嘗試創建School容器,如存在則不做任何事,保障容器一定存在
  22. }
  23. public ILogger CreateLogger(string categoryName)
  24. {
  25. return new BlobLogger(categoryName, _storageFactory.GetBlobContainerClient("0-service-log"));
  26. }
  27. public void Dispose()
  28. {
  29. // Dispose any resources used by the provider.
  30. }
  31. }
  32. public class BlobLogger : ILogger
  33. {
  34. private readonly string _categoryName;
  35. private readonly BlobContainerClient _containerClient;
  36. public BlobLogger(string categoryName, BlobContainerClient containerClient)
  37. {
  38. _categoryName = categoryName;
  39. _containerClient = containerClient;
  40. }
  41. public IDisposable BeginScope<TState>(TState state)
  42. {
  43. return null;
  44. }
  45. public bool IsEnabled(LogLevel logLevel)
  46. {
  47. return true;
  48. }
  49. public async void Log<TState> ( LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
  50. {
  51. if (formatter == null)
  52. {
  53. throw new ArgumentNullException(nameof(formatter));
  54. }
  55. var message = formatter(state, exception);
  56. var appendBlob = _containerClient.GetAppendBlobClient($"{_categoryName}/{DateTimeOffset.UtcNow:yyyy-MM-dd}.log");
  57. // var blobClient = _containerClient.GetBlobClient($"{_categoryName}/{DateTimeOffset.UtcNow:yyyy-MM-dd}.log");
  58. if (!appendBlob.Exists())
  59. {
  60. await appendBlob.CreateAsync();
  61. using var stream = new MemoryStream(Encoding.UTF8.GetBytes(message));
  62. await appendBlob.AppendBlockAsync(stream);
  63. }
  64. else {
  65. using var stream = new MemoryStream(Encoding.UTF8.GetBytes($"\n,{message}"));
  66. await appendBlob.AppendBlockAsync(stream);
  67. }
  68. }
  69. }
  70. }