Serilog不会创建日志文件。

4

Serilog不会创建日志文件,因此(我认为)不会记录任何内容。由于目标是微服务,我正在使用CQRS模式。

这是我的Startup.cs文件

private readonly ISession session;
private readonly ILogger logger;

public Startup(IConfiguration configuration)
{
  Configuration = configuration;

    var baseDirectory = Directory.GetDirectoryRoot(AppDomain.CurrentDomain.BaseDirectory);

    Log.Logger = new LoggerConfiguration()
                    .WriteTo
                    .Logger(lc => lc.Filter
                                    .ByIncludingOnly(e => e.Level == LogEventLevel.Information || e.Level == LogEventLevel.Debug)
                                    .WriteTo.RollingFile(Path.Combine(baseDirectory, "/Logs/info.log")))
                    .WriteTo
                    .Logger(lc => lc.Filter
                                    .ByIncludingOnly(e => e.Level == LogEventLevel.Error)
                                    .WriteTo.RollingFile(Path.Combine(baseDirectory, "/Logs/error.log")))

}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
  if (env.IsDevelopment())
  {
    app.UseDeveloperExceptionPage();
  }

   loggerFactory.AddSerilog();
   ...//To shorten this example in Stackoverflow, I've excluded the standard code. But in reality they are of course there
}

这是我的类,在该类中,日志记录器将通过 DI 进行注入:

public MaterialCommandHandler(ISession session, ILogger<MaterialCommandHandler> logger)
{
  this.session = session;
  this.logger = logger;
}

我想在MaterialCommandHandler类中的Handle方法中写入一些内容到日志文件中。

public async Task Handle(CreateMaterialCommand command)
{
  var material = new Material(command.Id, command.TechDesc, command.Description, command.MaterialClass);
  logger.LogDebug($"{DateTimeOffset.UtcNow} - {nameof(CreateMaterialCommand)} - received for {material} with {nameof(command.TechDesc)} : {command.TechDesc}.");
  await session.Add(material);
  await session.Commit();
  logger.LogDebug($"{DateTimeOffset.UtcNow} - {nameof(CreateMaterialCommand)} - received for {material} with {nameof(command.TechDesc)} : {command.TechDesc}.");
}

有没有人知道为什么这些文件没有生成,而且也没有日志记录?


系统上是否存在“/Logs”目录?该进程是否以具有对“/Logs”写入权限的用户身份运行?是否出现错误? - Pete Garafano
@PeteGarafano 是的,该文件夹存在于系统中。它位于C:/Logs/ - 而且我是系统管理员,所以不应该有任何访问/授权问题。不幸的是,也没有出现任何错误 - 这就是为什么我想知道为什么它不起作用的原因。 - Azeristar
你展示的代码无法编译。我没有看到对CreateLogger()的调用。而且,为了测试认证\权限问题,最好在日志文件夹上赋予“Everyone”修改权限(仅限测试)。 - SpruceMoose
@CalC 噢,抱歉我忘记在这里复制了 - 当然我在我的代码中有它。 - Azeristar
1
你尝试启用自记录器了吗?文档中有描述。 - mason
1个回答

10

你在日志构建的末尾缺少.CreateLogger()语句,但我认为真正的问题是你的Path.Combine语句可能会导致无效的路径或不符合你期望的路径。 Path.Combine有一些令人讨厌的行为,你可能还不知道。请考虑以下内容:

Path.Combine(@"C:\Temp", @"Logs\mylog.txt"); // C:\Temp\Logs\mylog.txt
Path.Combine(@"C:\Temp\", @"Logs\mylog.txt"); // C:\Temp\Logs\mylog.txt
Path.Combine(@"C:\Temp\", @"\Logs\mylog.txt"); // \Logs\mylog.txt
Path.Combine(@"C:\Temp", @"\Logs\mylog.txt"); // \Logs\mylog.txt

1
我已经检查过了,问题确实是Path.Combine。非常感谢。 - Azeristar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接