Skip to content

jim-lightfoot/MondoCore.Log

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MondoCore.Log

Classes for logging


Dependency Injection

In your dependency injection code create a singleton instance of Log

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        // Register the main Log class as a singleton.
        builder.Services.AddSingleton<ILog>( (p)=> 
        {
            var log = new Log();

            // Use GetService to get the TelemetryConfiguration to share with the host
            log.Register( new ApplicationInsights( p.GetService<TelemetryConfiguration>() ),
                          new Splunk("???"), types: new List<Telemetry.TelemetryType> { Telemetry.TelemetryType.Event } ); // Log only WriteEvent telemetry

            return log;
        );

        // Register IRequestLog as scoped. That same instance will be returned within the scope of a function invocation
        builder.Services.AddScoped<IRequestLog, RequestLog>();
    }
}

Logging with ILog

Inject the ILog interface

using MondoCore.Log;

public class CoolClass
{
    private readonly ILog _log;

    public CoolClass(ILog log)
    {
        _log = log;
    }

    public async Task DoSomething(string name)
    {
        try
        {
            _log.WriteEvent("Something cool", new {Make = "Chevy", Model = "Corvette", Name = name } );

            if(blah)
                await _log.WriteError(new Exception("Data error"), Telemetry.LogSeverity.Warning, new { Class = "CoolClass", Function = "DoSomething" } )
        }
        catch(Exception ex)
        {
            // The anonymous object will be logged as two properties: "Class" and "Function"
            await _log.WriteError(ex, Telemetry.LogSeverity.Critical, new { Class = "CoolClass", Function = "DoSomething" } )
        }
    }
}

Logging with IRequestLog

By creating a scoped RequestLog you can set properties that will exist for every log within that scope. IRequestLog is derived from ILog so you just treat it as an ILog

using MondoCore.Log;

public class CoolClass
{
    private readonly IRequestLog _log;

    public CoolClass(IRequestLog log)
    {
        _log = log;
    }

    public async Task DoSomething(string name)
    {
        // This property will be added to all subsequent log calls during the lifetime of IRequestLog
        _log.SetProperty("Name", name);

        try
        {
            // Do something...
            // ...

            _log.WriteEvent("Something cool", new {Make = "Chevy", Model = "Corvette"} );

            if(blah)
                await _log.WriteError(new Exception("Data error"), Telemetry.LogSeverity.Warning, new { Class = "CoolClass", Function = "DoSomething" } )
        }
        catch(Exception ex)
        {
            // The anonymous object will be logged as two properties: "Class" and "Function"
            await _log.WriteError(ex, new { Class = "CoolClass", Function = "DoSomething" } )
        }
    }

    // Nested IRequestLog
    public async Task DoSomethingElse(string name)
    {
        using(var requestLog = log.NewRequest("CoolClass.DoSomethingElse))
        {
            // These properties will be added to all log calls within this using block (you must use the local log var)
            requestLog.SetProperty("Name", name);
            requestLog.SetProperty("Class", nameof(CoolClass));
            requestLog.SetProperty("Method", nameof(DoSomethingElse));

            try
            {
                // Do something...
                // ...

                requestLog.WriteEvent("Something cool", new {Make = "Chevy", Model = "Corvette"} );

                if(blah)
                    await requestLog.WriteError(new Exception("Data error"), Telemetry.LogSeverity.Warning)
            }
            catch(Exception ex)
            {
                await requestLog.WriteError(ex)
            }
        }
    }
}

License

MIT

About

Modern logging library

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages