src/Microsoft.Azure.WebJobs.Host/Bindings/ILogger/ILoggerBinding.cs (62 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.Globalization; using System.Reflection; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.WebJobs.Host.Protocols; using Microsoft.Azure.WebJobs.Logging; using Microsoft.Extensions.Logging; namespace Microsoft.Azure.WebJobs.Host.Bindings { internal class ILoggerBinding : IBinding { private readonly ParameterInfo _parameter; private readonly ILoggerFactory _loggerFactory; public ILoggerBinding(ParameterInfo parameter, ILoggerFactory loggerFactory) { _parameter = parameter; _loggerFactory = loggerFactory; } public bool FromAttribute => false; public Task<IValueProvider> BindAsync(object value, ValueBindingContext context) { if (value == null || !_parameter.ParameterType.IsAssignableFrom(value.GetType())) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Unable to convert value to {0}.", _parameter.ParameterType)); } IValueProvider valueProvider = new ValueBinder(value, _parameter.ParameterType); return Task.FromResult<IValueProvider>(valueProvider); } public Task<IValueProvider> BindAsync(BindingContext context) { if (context == null) { throw new ArgumentNullException("context"); } ILogger logger = _loggerFactory.CreateLogger(LogCategories.CreateFunctionUserCategory(context.ValueContext.FunctionContext.MethodName)); return BindAsync(logger, context.ValueContext); } public ParameterDescriptor ToParameterDescriptor() { return new ParameterDescriptor { Name = _parameter.Name }; } private sealed class ValueBinder : IValueBinder { private readonly object _tracer; private readonly Type _type; public ValueBinder(object tracer, Type type) { _tracer = tracer; _type = type; } public Type Type => _type; public Task<object> GetValueAsync() => Task.FromResult(_tracer); public string ToInvokeString() => null; public Task SetValueAsync(object value, CancellationToken cancellationToken) => Task.CompletedTask; } } }