EventSourceProxy (ESP) is the easiest way to add scalable Event Tracing for Windows (ETW) logging to your .NET program.
Now in NuGet!
There are now two versions of ESP:
Get EventSourceProxy (ESP) from NuGet
Here is ESP implementing a logging interface for you automatically:
public interface ILog
{
void SomethingIsStarting(string message);
void SomethingIsFinishing(string message);
}
// yeah, this is it
var log = EventSourceImplementer.GetEventSourceAs<ILog>();
log.SomethingIsStarting("hello");
log.SomethingIsFinishing("goodbye");
Here is ESP doing the hard work of implementing an EventSource if you really want to do that:
public abstract MyEventSource : EventSource
{
public abstract void SomethingIsStarting(string message);
public abstract void SomethingIsFinishing(string message);
}
// ESP does the rest
var log = EventSourceImplementer.GetEventSourceAs<MyEventSource>();
Here is ESP wrapping an existing interface for tracing:
public interface ICalculator
{
void Clear();
int Add(int x, int y);
int Multiple(int x, int y);
}
public class Calculator : ICalculator
{
// blah blah
}
Calculator calculator = new Calculator();
// again, that's it
ICalculator proxy = TracingProxy.CreateWithActivityScope<ICalculator>(calculator);
// all calls are automatically logged when the ETW source is enabled
int total = proxy.Add(1, 2);
And let's say that your interface doesn't look at all like what you want logged. You can add rules to clean all that up:
Say you have the following interface:
interface IEmailer
{
void Send(Email email, DateTime when);
void Receive(Email email);
void Cancel(string from, string to, DateTime earliest, DateTime latest);
}
class Email
{
public string From;
public string To;
public string Subject;
public string Body;
public IEnumerable<byte[]> Attachments;
}
Set up rules on how ESP should trace the data to ETW:
TraceParameterProvider.Default
.For<IEmailer>()
.With<Email>()
.Trace(e => e.From).As("Sender")
.Trace(e => e.To).As("Recipient")
.Trace(e => e.Subject).As("s")
.And(e => e.Body).As("b")
.TogetherAs("message")
.Trace(e => String.Join("/", e.Attachments.Select(Convert.ToBase64String).ToArray()))
.As("attachments")
.For<IEmailer>(m => m.Send(Any<Email>.Value, Any<DateTime>.Value)
.Ignore("when");
.ForAnything()
.AddContext("user", () => SomeMethodThatChecksIdentity());
And now the Send method will log:
* Sender : From
* Recipient : To
* Message : { "s":subject, "b":body }
* Attachments : [ base64, base64 ]
* User : current user
So, this is great for adding logging to any interface in your application.
Full documentation is available on the wiki!