src/Microsoft.Azure.WebJobs.Host/Bindings/TraceWriter/LoggerTraceWriter.cs (51 lines of code) (raw):
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace Microsoft.Azure.WebJobs.Logging
{
/// <summary>
/// A <see cref="TraceWriter"/> wrapper around an <see cref="ILogger"/>.
/// </summary>
internal class LoggerTraceWriter : TraceWriter
{
private ILogger _logger;
private const string _originalFormat = "{OriginalFormat}";
/// <summary>
/// Creates an instance.
/// </summary>
/// <param name="level">The <see cref="TraceLevel"/> to use when filtering logs.</param>
public LoggerTraceWriter(ILogger logger)
: base(TraceLevel.Verbose)
{
_logger = logger;
}
/// <inheritdoc />
public override void Trace(TraceEvent traceEvent)
{
if (traceEvent == null)
{
throw new ArgumentNullException(nameof(traceEvent));
}
LogLevel level = GetLogLevel(traceEvent.Level);
var state = new ReadOnlyDictionary<string, object>(new Dictionary<string, object>(traceEvent.Properties)
{
// Maintain parity with ILogger
[_originalFormat] = traceEvent.Message
});
_logger?.Log(level, 0, state, traceEvent.Exception, (s, e) => traceEvent.Message);
}
internal static LogLevel GetLogLevel(TraceLevel traceLevel)
{
switch (traceLevel)
{
case TraceLevel.Off:
return LogLevel.None;
case TraceLevel.Error:
return LogLevel.Error;
case TraceLevel.Warning:
return LogLevel.Warning;
case TraceLevel.Info:
return LogLevel.Information;
case TraceLevel.Verbose:
return LogLevel.Debug;
default:
throw new InvalidOperationException($"'{traceLevel}' is not a valid level.");
}
}
}
}