如何在 .net 核心工作者服务中保存登录文件?
How to save log in file in .net core worker service?
现在,我正在开发 .Net 核心工作者服务,我想将我项目的错误保存在一个文件(文本文件)中
我找不到这方面的任何设置
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddEventLog(new EventLogSettings()
{
SourceName = "CallerTestCacheServiceCoreAPI",
LogName = "CallerTestCacheServiceCoreAPILog",
});
})
如果您真的需要,有几个第三方提供商可以处理日志汇到文件。
serilog 是一个很好的例子,请查看下面的自述文件
我在另一个class像这个项目中添加了一个扩展方法
https://github.com/MV10/Serilog.Dependency.Injection
public static IServiceCollection AddSerilogServices(this IServiceCollection services)
{
return services.AddSerilogServices(
new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.File("log.txt")
//.WriteTo.File(new CompactJsonFormatter(), "log.txt")
.WriteTo.Console());
}
并在program.cs服务中介绍
services.AddSerilogServices();
在我的工人 class 中:
readonly Serilog.ILogger _log;
public Worker( Serilog.ILogger log)
{
_log = log;
log.Information("Hello World!");
}
成功了
在Main方法中(程序class):
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
在 IHostBuilder 方法中,添加 UseSerilog()
:
Host.CreateDefaultBuilder(args)
.UseSerilog()
在您的控制器中,使用 DI 获取记录器的实例,添加以下内容:
public class MyController: Controller
{
private ILogger _logger;
public MyController(ILogger<MyController> logger)
{
_logger = logger;
} }
要记录消息,请使用 _logger
实例,例如:
_logger.LogInformation("User {user} logged in", user_record);
希望这对您有所帮助。
要使用 Serilog
记录器,请将您的 Program
class 更改为:
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.CreateLogger();
try
{
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
// Add your services and workers here
services.AddHostedService<Worker>();
})
.UseSerilog((hostingContext, services, loggerConfiguration) =>
loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration));
}
在您的 appsettings.json
中删除 "Logging"
部分并将其替换为 "Serilog"
部分(如 here 所述)或在代码中指定设置。
此答案基于 Serilog
库 (link) 为 asp net core sink 给出的说明,因为 Worker
模板使用相同的系统作为 asp 网络核心项目托管。
现在,我正在开发 .Net 核心工作者服务,我想将我项目的错误保存在一个文件(文本文件)中 我找不到这方面的任何设置
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddEventLog(new EventLogSettings()
{
SourceName = "CallerTestCacheServiceCoreAPI",
LogName = "CallerTestCacheServiceCoreAPILog",
});
})
如果您真的需要,有几个第三方提供商可以处理日志汇到文件。
serilog 是一个很好的例子,请查看下面的自述文件
我在另一个class像这个项目中添加了一个扩展方法 https://github.com/MV10/Serilog.Dependency.Injection
public static IServiceCollection AddSerilogServices(this IServiceCollection services)
{
return services.AddSerilogServices(
new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.File("log.txt")
//.WriteTo.File(new CompactJsonFormatter(), "log.txt")
.WriteTo.Console());
}
并在program.cs服务中介绍
services.AddSerilogServices();
在我的工人 class 中:
readonly Serilog.ILogger _log;
public Worker( Serilog.ILogger log)
{
_log = log;
log.Information("Hello World!");
}
成功了
在Main方法中(程序class):
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
在 IHostBuilder 方法中,添加 UseSerilog()
:
Host.CreateDefaultBuilder(args)
.UseSerilog()
在您的控制器中,使用 DI 获取记录器的实例,添加以下内容:
public class MyController: Controller
{
private ILogger _logger;
public MyController(ILogger<MyController> logger)
{
_logger = logger;
} }
要记录消息,请使用 _logger
实例,例如:
_logger.LogInformation("User {user} logged in", user_record);
希望这对您有所帮助。
要使用 Serilog
记录器,请将您的 Program
class 更改为:
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.CreateLogger();
try
{
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
// Add your services and workers here
services.AddHostedService<Worker>();
})
.UseSerilog((hostingContext, services, loggerConfiguration) =>
loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration));
}
在您的 appsettings.json
中删除 "Logging"
部分并将其替换为 "Serilog"
部分(如 here 所述)或在代码中指定设置。
此答案基于 Serilog
库 (link) 为 asp net core sink 给出的说明,因为 Worker
模板使用相同的系统作为 asp 网络核心项目托管。