.Net Azure Function 项目 - 如何获取对 ILogger 的引用,写入控制台?
.Net Azure Function project - How to get reference to the ILogger, writing to the console?
我在 Visual Studio 中有一个 Azure Function 类型的项目。
这是我的创业公司:
public override void Configure(IFunctionsHostBuilder builder)
{
IConfiguration configuration = builder.GetContext().Configuration;
string connectionString = configuration.GetConnectionString("default");
builder.Services.AddLogging();
builder.Services.AddTransient<TestClass>();
}
这是我的职能:
readonly TestClass testClass;
public TestFunc(TestClass testClass)
{
this.testClass = testClass;
}
[FunctionName("TestFunc")]
public async System.Threading.Tasks.Task Run([TimerTrigger("0 */99 * * * *"
#if DEBUG
, RunOnStartup = true
#endif
)]TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function started.");
testClass.TestLog();
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
这里日志信息是写到控制台的,但是在我的“TestLog”方法中(忽略它看起来是静态的,不是我只是跳过了一些代码):
public class TestClass
{
readonly ILogger logger;
public TestClass(ILogger logger)
{
this.logger = logger;
logger.LogError("asd");
}
internal void TestLog()
{
logger.LogInformation("test");
}
}
但这不会在控制台上产生任何结果。
我尝试将“ILogger”切换为“ILoggerFactory”,如下所示:
public TestClass(ILoggerFactory loggerFactory)
{
logger = loggerFactory.CreateLogger<TaskSynchronisation>();
logger.LogError("asd");
}
但是没有用。
如何在调试函数时获取正在记录到控制台的记录器?
我是不是在某些地方误解了...?虽然我不知道原因,但我想我可以分享我的测试结果:
我的测试class:
using Microsoft.Extensions.Logging;
namespace FunctionApp1
{
public interface ICommonUtil
{
public string easyTest(string param);
}
public class CommonUtil : ICommonUtil
{
private readonly ILogger _logger;
public CommonUtil(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger("CommonUtil");
}
public string easyTest(string param)
{
_logger.LogWarning("this is easy test");
return param + "asdf";
}
}
}
Startup.cs:
using FunctionApp1;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(Startup))]
namespace FunctionApp1
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddLogging();
builder.Services.AddSingleton<ICommonUtil, CommonUtil>();
}
}
}
function.cs:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
namespace FunctionApp1
{
public class Function1
{
private ICommonUtil _util;
public Function1(ICommonUtil util)
{
this._util = util;
}
[FunctionName("Function1")]
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
name = _util.easyTest(name);
return new OkObjectResult(name);
}
}
}
和host.json
我参考的资料:
我在 Visual Studio 中有一个 Azure Function 类型的项目。
这是我的创业公司:
public override void Configure(IFunctionsHostBuilder builder)
{
IConfiguration configuration = builder.GetContext().Configuration;
string connectionString = configuration.GetConnectionString("default");
builder.Services.AddLogging();
builder.Services.AddTransient<TestClass>();
}
这是我的职能:
readonly TestClass testClass;
public TestFunc(TestClass testClass)
{
this.testClass = testClass;
}
[FunctionName("TestFunc")]
public async System.Threading.Tasks.Task Run([TimerTrigger("0 */99 * * * *"
#if DEBUG
, RunOnStartup = true
#endif
)]TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function started.");
testClass.TestLog();
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
这里日志信息是写到控制台的,但是在我的“TestLog”方法中(忽略它看起来是静态的,不是我只是跳过了一些代码):
public class TestClass
{
readonly ILogger logger;
public TestClass(ILogger logger)
{
this.logger = logger;
logger.LogError("asd");
}
internal void TestLog()
{
logger.LogInformation("test");
}
}
但这不会在控制台上产生任何结果。
我尝试将“ILogger”切换为“ILoggerFactory”,如下所示:
public TestClass(ILoggerFactory loggerFactory)
{
logger = loggerFactory.CreateLogger<TaskSynchronisation>();
logger.LogError("asd");
}
但是没有用。
如何在调试函数时获取正在记录到控制台的记录器?
我是不是在某些地方误解了...?虽然我不知道原因,但我想我可以分享我的测试结果:
我的测试class:
using Microsoft.Extensions.Logging;
namespace FunctionApp1
{
public interface ICommonUtil
{
public string easyTest(string param);
}
public class CommonUtil : ICommonUtil
{
private readonly ILogger _logger;
public CommonUtil(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger("CommonUtil");
}
public string easyTest(string param)
{
_logger.LogWarning("this is easy test");
return param + "asdf";
}
}
}
Startup.cs:
using FunctionApp1;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(Startup))]
namespace FunctionApp1
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddLogging();
builder.Services.AddSingleton<ICommonUtil, CommonUtil>();
}
}
}
function.cs:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
namespace FunctionApp1
{
public class Function1
{
private ICommonUtil _util;
public Function1(ICommonUtil util)
{
this._util = util;
}
[FunctionName("Function1")]
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
name = _util.easyTest(name);
return new OkObjectResult(name);
}
}
}
和host.json
我参考的资料: