Пользовательский log4net Azure BLOB-приложение перестает регистрировать, когда файл достигает 5,4 МБ - PullRequest
0 голосов
/ 27 сентября 2018

Я использую приведенный ниже appender для передачи наших сообщений журнала в Azure с Log4Net.Все работает нормально, пока размер файла блоба не достигнет 5,4 МБ.С этого момента журналы больше не добавляются в файл журнала.

Что вызывает это?И как я могу решить это?

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);
        }
    }
  }
}

1 Ответ

0 голосов
/ 04 октября 2018

В соответствии с документацией о добавлении блока вы можете получить ограничение в 50 000 блоков для большого двоичного объекта.Обязательно проверьте количество переданных блоков перед передачей в BLOB, используя:

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

и убедитесь, что оно не превышает 50000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...