Do you want to control how the time is displayed in the log file or 
fundamentally alter how log4net tracks time?

If you want to use a custom DateTime.Now to record when the event created you 
could start up by defining your own IDateTime:

// untested
public interface IDateTime
{
    DateTime Now { get; }
}

then make it easy to get an instance of IDateTime:

// untested
public class DateTimeProvider : IDateTime
{
    public static readonly DateTimeProvider DateTimeNow = new 
DateTimeProvider(() => DateTime.Now);
    public static readonly DateTimeProvider DateTimeUtcNow = new 
DateTimeProvider(() => DateTime.UtcNow);

    private Func<DateTime> _dateTimeGetter;

    public DateTimeProvider(Func<DateTime> dateTimeGetter)
    {
        _dateTimeGetter = dateTimeGetter;
    }

    public DateTime Now
    {
        get { return _dateTimeGetter(); }
    }

    public void SetDateTimeFunc(Func<DateTime> dateTimeGetter)
    {
        _dateTimeGetter = dateTimeGetter;
    }
}

then you could tweak how the LoggingEventData object is created:

// untested
class DateTimeProviderLogger : LogImpl
{
    private readonly static Type declaringType = typeof(DateTimeProviderLogger);
    
    private readonly IDateTime dateTimeProvider;

    public DateTimeProviderLogger(ILogger logger, IDateTime dateTimeProvider) : 
base(logger)
    {
        this.dateTimeProvider = dateTimeProvider;
    }

    public override void Debug(object message)
    {
        Logger.Log(createLoggingEvnet(Level.Debug, message));
    }

    private LoggingEvent createLoggingEvnet(Level level, object message)
    {
        return new LoggingEvent(
            declaringType, 
            Logger.Repository,
            createLoggingEventData(level, message));
    }

    private LoggingEventData createLoggingEventData(Level level, object message)
    {
        return new LoggingEventData
                   {
                       Level = level,
                       LoggerName = Logger.Name,
                       Message = message.ToString(),
                       TimeStamp = dateTimeProvider.Now
                   };
    }
}

The calling code might look something like this:

// untested
public static class LogManager2
{
    public static ILog GetLogger<T>()
    {
        return new 
DateTimeProviderLogger(LogManager.GetLogger(typeof(T)).Logger, 
DateTimeProvider.DateTimeNow);
    }
}

// untested
class Program
{
    public static readonly ILog log = LogManager2.GetLogger<Program>();
}




________________________________
From: Ayrat Khalimov <airat.hali...@gmail.com>
To: log4net-user@logging.apache.org
Sent: Thu, November 12, 2009 7:49:13 AM
Subject: precise time stamp


Hi, there

I need to log events with precise time stamps (more precise than 15 ms 
System.DateTime). 

But it seems to be impossible to do it with log4net. 
It is impossible to change default timer neither to implement special appender 
that will set precise value to TimeStamp.
The only solution I see is to write precise time to the event message body.

Any ideas, colleagues?

-- 
Sincerely, 
Ayrat Khalimov.

Reply via email to