Log4Net - 使用日志记录日期时间添加时间

Byr*_*nBD 3 log4net datetime log4net-configuration

我开发了一个asp.net网站,我使用log4net以格式记录错误信息:

"%-5p %d - %m%n"
Run Code Online (Sandbox Code Playgroud)

它按当前机器的日期时间记录日期时间.例如:

FATAL 2011-04-10 01:08:11,759 - message
Run Code Online (Sandbox Code Playgroud)

但是我想将datetime转换为另一个区域或者用它来增加额外的时间.例如,我想在上一个示例中添加3个小时,并希望输出为:

FATAL 2011-04-10 **04**:08:11,759 - message
Run Code Online (Sandbox Code Playgroud)

有关如何实现这一点的任何想法?

wag*_*ghe 5

这可能无法解答您的问题,因为我不确定您要实现的目标.也许如果你能提供更多关于你想要这样做的详细信息,你可能会得到更好的答案.

如果您尝试关联在不同区域生成的多个日志文件(或其他来源),则可能会有所帮助......

你可以尝试的log4net的utctime描述的PatternLayout 这里.

这将使您的日志时间达到通用时间,这可能更容易您进行关联.如果您可以控制时间戳的来源(例如您的asp.net网站),那么通过将它们标准化为通用时间,它们应该更容易比较.

如果您确实希望将时间更改为其他区域,或者在记录时从时间戳添加/减去任意时间范围,则可能必须编写自己的自定义PatternLayout或PatternLayoutConverter.这可能有点棘手,因为我认为log4net DatePatternConverter和UtcDatePatternConverter都不可用于自定义(即它们被声明,internal所以你不能将它们子类化并添加你的行为).

您可以使用log4net 代码库中的log4net实现从头开始编写自己的代码,但这对我来说似乎很麻烦.

还要说明一点,也许它会在使用这些中的一个单独的列再次登录时是有用的自定义日期格式说明:Z,ZZ,ZZZ,ķ.

更新: 请参阅此答案,了解可能有所帮助的另一个想法.该问题要求使用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 "";   
  } 
}
Run Code Online (Sandbox Code Playgroud)

您可以将对象存储在MDC/GlobalDiagnosticContext.Properties中,如下所示:

MDC.Set("user", new HttpContextUserNameProvider()); 
Run Code Online (Sandbox Code Playgroud)

你可能会写一些类似的东西来回归不同的时间.您可以使用此时间而不是log4net提供的时间,或者您可以将此"自定义"时间作为附加列.您的"自定义时间"对象可能如下所示:

public class MyLocalTimeProvider 
{   
  public override string ToString()   
  {     
    DateTime myLocalTime = GetUtcTimeInMyTimeZone(DateTime.UtcNow);
    return myLocalTime;
  } 
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样引用它:

MDC.Set("myLocalTime", new MyLocalTimeProvider()); 
Run Code Online (Sandbox Code Playgroud)

我不确定你是否可以将格式应用于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);
  } 
}
Run Code Online (Sandbox Code Playgroud)

您可以查看本文,了解如何将UTC时间转换为任意时区.