Пользовательский приложение Log4Net не создает таблицу или правильно хранит записи

В настоящее время я нахожусь в процессе создания прототипа специального приложения Log4Net, которое будет хранить информацию обо всех исключениях, возникающих в рамках проекта, в таблице Azure. Таблица должна быть создана на основе модели, определенной в классе 'LogEntry'. Поскольку это прототип веб-приложения, на данный момент я создал кнопку, которая выдает исключение для запуска регистратора, и я следовал этому в качестве руководства:

http://www.kongsli.net/nblog/2011/08/15/log4net-writing-log-entries-to-azure-table-storage/

Однако, когда выдается исключение и создается журнал, таблица создается неправильно. Вместо создания таблицы, основанной на моем классе LogEntry, она генерирует (то, что я предполагаю, что это значения по умолчанию TableServiceContext) 'PartitionKey', 'RowKey' и 'TimeStamp'. В результате происходит сбой регистратора, и в таблице не создаются записи.

Ниже приведены некоторые выдержки из моего проекта:

LogEntry.cs

public class LogEntry : TableServiceEntity
{
    public LogEntry()
    {
        var now = DateTime.UtcNow;

        // PartitionKey is the current year and month whild RowKey is a combination of the date, time and a GUID.
        // This is so that we are able to query our log entries more efficiently.
        PartitionKey    = string.Format("{0:yyyy-MM}", now);
        RowKey          = string.Format("{0:dd HH:mm:ss.fff}-{1}", now, Guid.NewGuid());
    }

    // This region of the class class represents each entry in our log table.
    #region Table Columns
    ...all columns defined here...
    #endregion
}

LogServiceContext.cs

internal class LogServiceContext : TableServiceContext
{
    public LogServiceContext(string baseAddress, StorageCredentials credentials)
        : base(baseAddress, credentials)
    {
    }

    internal void Log(LogEntry logEntry)
    {
        AddObject("LogEntries", logEntry);
        SaveChanges();
    }

    public IQueryable<LogEntry> LogEntries
    {
        get
        {
            return CreateQuery<LogEntry>("LogEntries");
        }
    }
}

И выписка из самого класса appender:

// Create a new LogEntry and store all necessary details.
// All writing to log is done asynchronically to prevent the write slowing down request handling.
Action doWriteToLog = () => {
    try
    {
        _ctx.Log(new LogEntry
        {
            CreatedDateTime         = DateTime.Now,
            UserName                = loggingEvent.UserName,
            IPAddress               = userIPAddress,
            Culture                 = userCulture,
            OperatingSystem         = userOperatingSystem,
            BrowserVersion          = userCulture,
            ExceptionLevel          = loggingEvent.Level,
            ExceptionDateTime       = loggingEvent.TimeStamp,
            ExceptionMessage        = loggingEvent.RenderedMessage,
            ExceptionStacktrace     = Environment.StackTrace,
            AdditionalInformation   = loggingEvent.RenderedMessage
        });
    }
    catch (DataServiceRequestException e)
    {
        ErrorHandler.Error(string.Format("{0}: Could not wring log entry to {1}: {2}",
            GetType().AssemblyQualifiedName, _tableEndpoint, e.Message));
    }
};
doWriteToLog.BeginInvoke(null, null);

Я рад предоставить любую дополнительную информацию и могу упаковать решение, если кто-то захочет увидеть занятия в их полной форме. Любая помощь будет принята с благодарностью!

1 ответ

После написания сообщения в блоге, на которое вы ссылаетесь, я внес небольшие изменения в код. Вы можете увидеть это изменение в моем репозитории github: https://github.com/vidarkongsli/azuretablestorageappender

По сути, я сделал замену SaveChanges() на BeginSaveChanges(SaveChangesOptions.Batch, null, null) и удаление оператора BeginInvoke из AzureTableStorageAppender.Append(LoggingEvent)

Я думаю, что это может помочь ситуации.

Другие вопросы по тегам