2011-04-10 77 views
2

我开发一个asp.net网站,我登录使用log4net的使用格式错误信息:log4net的 - 添加时间记录日期时间

"%-5p %d - %m%n" 

它记录由目前该机的日期时间日期时间。 例如:

FATAL 2011-04-10 01:08:11,759 - message 

但我想时间值转换到另一个区域或增加额外的时间与它。例如,我想用前面的示例添加3小时,并希望输出为:

FATAL 2011-04-10 **04**:08:11,759 - message 

有关如何实现此目的的任何想法?

回答

4

这可能不会回答你的问题,因为我不确定你想要达到的目标。也许如果你可以提供更多关于你为什么要这样做的细节,你可能会得到更好的答案。

如果你正试图关联已在不同地区生成多个日志文件(或其他来源),它可以帮助...

描述here你可以尝试的log4net的utctime的PatternLayout。

这将使您的日志时间在世界时,这可能会更容易关联。如果你可以控制时间戳的来源(比如你的asp.net网站),那么通过将它们标准化为世界时,它们应该比较容易。

如果您确实想要将时间更改为不同的区域,或者在记录时从时间戳添加/减去任意时间范围,则可能需要编写自己的自定义PatternLayout或PatternLayoutConverter。这可能有点棘手,因为我认为log4net DatePatternConverter和UtcDatePatternConverter都不可用于定制(即它们被声明为internal,因此您无法继承它们并添加您的行为)。

你可以用log4net的code repository从头开始编写自己的程序,但这对我来说似乎很麻烦。

还有一点需要注意,也许使用以下其中一个Custom Date format specifiersz, zz, zzz,K再次在单独的列中记录时间会很有用。

更新: 查看this answer的另一个想法可能有所帮助。该问题要求采用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的对象。像这样的属性:

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项目。属性(我认为你可以)或不,但你可以试试看。

你总是可以使用硬编码格式或格式属性添加到这样的对象:

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

你可以看看this article对于如何将UTC时间转换为任意的时区。

+0

基本上,我的服务器在另一个时区。如果我的网站工作不正常,那么我必须检查它为什么不起作用? 要检查它, 1.我打我的网站 2.写命中时 3. DL日志文件(log4net的生成) 4.检查错误的macthing时间和类/函数 所以,我每次转换服务器记录时间到当地时间。这就是为什么我想使用我的时区记录数据。 – ByronBD 2011-04-12 07:40:14

+0

@Byron - 我更新了我的答案。也许它会有所帮助,或者不会。祝你好运! – wageoghe 2011-04-13 13:56:09

0

如果你只需要“转移”的日期到你的时区,您可以编写自己的ForwardingAppender,这将改变记录事件的日期时间:

namespace Olekstra 
{ 
    using System; 

    using log4net.Appender; 
    using log4net.Core; 

    public class TimeShiftForwardingAppender : ForwardingAppender 
    { 
     private TimeSpan shift; 

     private TimeSpan targetOffset; 

     public TimeShiftForwardingAppender() 
     { 
      TargetOffset = TimeZoneInfo.Local.BaseUtcOffset; 
     } 

     public TimeSpan TargetOffset 
     { 
      get 
      { 
       return targetOffset; 
      } 

      set 
      { 
       targetOffset = value; 
       shift = targetOffset.Subtract(TimeZoneInfo.Local.BaseUtcOffset); 
      } 
     } 

     protected override void Append(LoggingEvent loggingEvent) 
     { 
      var eventData = loggingEvent.GetLoggingEventData(); 
      eventData.TimeStamp = eventData.TimeStamp.Add(shift); 
      base.Append(new LoggingEvent(eventData)); 
     } 

     protected override void Append(LoggingEvent[] loggingEvents) 
     { 
      for (var i = 0; i < loggingEvents.Length; i++) 
      { 
       var eventData = loggingEvents[i].GetLoggingEventData(); 
       eventData.TimeStamp = eventData.TimeStamp.Add(shift); 
       loggingEvents[i] = new LoggingEvent(eventData); 
      } 
      base.Append(loggingEvents); 
     } 
    } 
} 

而在的.config

<log4net> 
    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> 
     <!-- Your real appender here --> 
    </appender> 
    <appender name="TimeShiftAppender" type="Olekstra.TimeShiftForwardingAppender"> 
    <targetOffset>06:00:00</targetOffset> <!-- your desired (local) UTC offset value --> 
    <appender-ref ref="FileAppender" /> <!-- real appender(s) --> 
    </appender> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="TimeShiftAppender" /> 
    </root> 
</log4net>