【问题标题】:Custom log4net azure blob appender stops logging when a file reaches 5.4MB当文件达到 5.4MB 时,自定义 log4net azure blob appender 停止记录
【发布时间】:2018-10-04 21:45:00
【问题描述】:

我正在使用下面的附加程序通过 Log4Net 将我们的日志消息通过管道传输到 Azure。 一切正常,直到 blob 文件达到 5.4MB 的大小。从此以后,日志文件不再附加任何日志。

这是什么原因造成的?我该如何解决这个问题?

namespace Digicreate.Core.Infrastructure.Logging
{
using System;
using System.Configuration;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

using log4net.Appender;
using log4net.Config;
using log4net.Core;

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

// ReSharper disable once UnusedMember.Global
// justification: used in log4net configuration file
public class AzureBlobTxtFileAppender : BufferingAppenderSkeleton
{
    private CloudStorageAccount _account;
  ...removed unimportant code...

            protected override void SendBuffer(LoggingEvent[] events)
    {
        var appendBlobReference = _cloudBlobContainer.GetAppendBlobReference(Filename(DirectoryName));
        if (!appendBlobReference.Exists())
        {
            appendBlobReference.CreateOrReplace();
        }

        Parallel.ForEach(events, ProcessEvent);
    }

    private static string Filename(string directoryName)
    {
        return $"{directoryName}/{DateTime.Today.ToString("yyyy_MM_dd", DateTimeFormatInfo.InvariantInfo)}.log.txt";
    }

    private void ProcessEvent(LoggingEvent loggingEvent)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8, 1024, true))
            {
                Layout.Format(streamWriter, loggingEvent);
                streamWriter.Flush();
            }

            memoryStream.Position = 0;

            _cloudBlobContainer
                .GetAppendBlobReference(Filename(DirectoryName))
                .AppendBlock(memoryStream);
        }
    }
  }
}

【问题讨论】:

  • 在使用 _cloudBlobContainer.GetAppendBlobReference(Filename(DirectoryName)).Properties.AppendBlobCommittedBlockCount 提交到 Blob 之前检查已提交块的数量,并确保它不超过 50000。我认为您正在达到块数限制 docs.microsoft.com/en-us/rest/api/storageservices/append-block
  • 感谢您的回答。我将尝试实现这一点。请在下面添加您的答案,如果修复有效,我可以奖励您赏金。
  • 解决方案有效,非常感谢!您可以在下面发布答案吗?我会把它标记为正确答案。

标签: c# log4net azure-blob-storage


【解决方案1】:

根据 Append Block documentation,您可能会遇到一个 blob 的 50,000 个块限制。确保在提交到 Blob 之前检查已提交块的数量:

var blockCount = _cloudBlobContainer.GetAppendBlobReference(Filename(DirectoryName))
                                    .Properties
                                    .AppendBlobCommittedBlockCount;

并确保不超过 50000。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2018-06-20
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多