Это может не ответить на ваш вопрос, потому что я не уверен, чего именно вы пытаетесь достичь.Возможно, если бы вы могли предоставить более подробную информацию о том, почему именно вы хотите это сделать, вы могли бы получить лучший ответ.
Если вы пытаетесь сопоставить несколько файлов журналов (или других источников), которые были созданы в разных регионах, это может помочь ...
Вы можете попробовать utctime
PatternLayout в log4net, как описано здесь .
Это даст вам время регистрации в универсальном времени, которое может бытьВам легче соотнести.Если у вас есть контроль над источниками временных меток (например, веб-сайтом asp.net), то путем их нормализации к универсальному времени их будет проще сравнивать.
Если вы действительно хотите изменить время наВ другой регион или добавьте / вычтите произвольный промежуток времени из отметки времени, когда она регистрируется, вам, возможно, придется написать свой собственный PatternLayout или PatternLayoutConverter.Это может быть немного сложно, так как я думаю, что ни log4net DatePatternConverter, ни UtcDatePatternConverter не доступны для настройки (т. Е. Они объявлены internal
, поэтому вы не можете их подклассить и добавить свое поведение).
Вымог бы написать свой собственный с нуля, используя реализацию log4net из репозитория кода log4net , но мне это кажется большой проблемой.
Еще одно замечание, возможно, было бы полезно войти в системуснова в отдельном столбце, используя один из этих пользовательских форматов даты : z, zz, zzz , K .
ОБНОВЛЕНИЕ: См. этот ответ для другой идеи, которая может помочь.Вопрос спрашивает, как записать имя пользователя с помощью log4net.В конечном счете, лучшим решением для него было написать очень маленький класс, который будет возвращать необходимую ему информацию (имя пользователя).Экземпляр класса может быть сохранен в MDC (или GlobalDiagnosticContext) и указан в конфигурации.Когда log4net получает значение из MDC (т.е. объекта), он вызывает ToString и записывает результат.Этот подход намного проще, хотя и несколько менее гибок, чем написание совершенно нового PatternLayoutConverter.
В нижней части ответа приведен пример кода, подобного следующему:
public class HttpContextUserNameProvider
{
public override string ToString()
{
HttpContext context = HttpContext.Current;
if (context != null &&
context.User != null &&
context.User.Identity.IsAuthenticated)
{
return context.Identity.Name;
}
return "";
}
}
Вы бы сохранилиобъект в MDC / GlobalDiagnosticContext.Properties, подобный этому:
MDC.Set("user", new HttpContextUserNameProvider());
Вы, вероятно, могли бы написать что-то подобное, чтобы вернуть другое время.Вы можете использовать это время вместо времени, предоставленного log4net, или вы можете сделать это «пользовательское» время дополнительным столбцом.Ваш объект «пользовательского времени» может выглядеть так:
public class MyLocalTimeProvider
{
public override string ToString()
{
DateTime myLocalTime = GetUtcTimeInMyTimeZone(DateTime.UtcNow);
return myLocalTime;
}
}
Тогда вы можете ссылаться на него так:
MDC.Set("myLocalTime", new MyLocalTimeProvider());
Я не уверен, что вы можете применять форматы к элементам изMDC / GlobalDiagnosticContext.Properties (я думаю, что вы можете) или нет, но вы можете попробовать и посмотреть.
Вы всегда можете использовать жестко заданный формат или добавить свойство формата к объекту, например так:
public class MyLocalTimeProvider
{
public MyLocalTimeProvider(string format)
{
Format = format;
}
public MyLocalTimeProvider()
: this ("G")
{
}
public string Format { get; set; }
public override string ToString()
{
DateTime myLocalTime = GetUtcTimeInMyTimeZone(DateTime.UtcNow);
return myLocalTime.ToString(Format);
}
}
Вы можете взглянуть на эту статью , чтобы узнать, какпреобразовать время UTC в произвольный часовой пояс.