You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET控制台应用如何用Serilog同时输出日志到控制台与文件?

.NET控制台应用用Serilog同时输出到控制台和文件

核心思路

Serilog 原生支持多Sink输出,不需要重定向控制台输出,只需配置同时向控制台和文件写入日志即可。如果原有代码使用Console.WriteLine,建议统一替换为Serilog的日志方法(如Log.Information),既能保留控制台显示,又能自动写入文件;若必须保留Console调用,也可通过简单包装实现同步记录。

步骤1:安装必要NuGet包

打开NuGet包管理器,安装以下包:

  • Serilog.Sinks.Console:控制台输出Sink
  • Serilog.Sinks.File:文件输出Sink
  • Serilog.Extensions.Hosting(.NET Core/.NET 5+ 必备):整合Host环境

命令行安装:

Install-Package Serilog.Sinks.Console
Install-Package Serilog.Sinks.File
Install-Package Serilog.Extensions.Hosting

步骤2:基础配置(无Host的控制台应用)

直接在Program.cs中配置Serilog,同时启用控制台和文件输出:

using Serilog;

// 配置Serilog
var logger = new LoggerConfiguration()
    .MinimumLevel.Information() // 设置最低日志级别(可按需调整)
    .WriteTo.Console() // 输出到控制台
    .WriteTo.File(
        path: "logs/app-.txt", // 日志文件路径,自动按日期分割
        rollingInterval: RollingInterval.Day, // 每天生成新日志文件
        retainedFileCountLimit: 7, // 保留最近7天的日志
        outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" // 自定义日志格式
    )
    .CreateLogger();

// 设置全局日志实例
Log.Logger = logger;

try
{
    Log.Information("应用启动");
    
    // 示例:用户交互逻辑
    Console.WriteLine("请输入指令:");
    var userInput = Console.ReadLine();
    Log.Information("用户输入:{UserInput}", userInput);
    
    Console.WriteLine("处理完成,按任意键退出");
    Log.Information("应用正常结束");
    Console.ReadKey();
}
catch (Exception ex)
{
    Log.Fatal(ex, "应用意外终止");
}
finally
{
    Log.CloseAndFlush(); // 确保所有日志写入文件
}

步骤3:Host环境下的配置(.NET Core/.NET 5+)

如果使用Generic Host搭建控制台应用,可通过UseSerilog整合配置:

using Microsoft.Extensions.Hosting;
using Serilog;

var host = Host.CreateDefaultBuilder(args)
    .UseSerilog((context, config) =>
    {
        config
            .ReadFrom.Configuration(context.Configuration) // 支持从appsettings.json读取配置
            .WriteTo.Console()
            .WriteTo.File("logs/app-.txt", rollingInterval: RollingInterval.Day);
    })
    .Build();

await host.RunAsync();

保留原有Console.WriteLine的方案

如果不想修改原有大量Console调用,可重定向Console.Out到Serilog:

// 在Serilog配置完成后添加
Console.SetOut(new SerilogWriter(Log.Logger));

// 自定义Writer类
public class SerilogWriter : TextWriter
{
    private readonly ILogger _logger;

    public SerilogWriter(ILogger logger)
    {
        _logger = logger;
    }

    public override Encoding Encoding => Encoding.UTF8;

    public override void WriteLine(string? value)
    {
        if (!string.IsNullOrEmpty(value))
            _logger.Information(value);
        base.WriteLine(value);
    }
}

这样所有Console.WriteLine的内容会同时输出到控制台和日志文件。

内容的提问来源于stack exchange,提问作者Dominique BOYER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:51:08