.NET Core中如何避免控制台打印与日志记录的代码重复?
Absolutely! You can eliminate this tedious duplicate code by using .NET Core's built-in logging framework (or a popular third-party alternative like Serilog/NLog), which lets you send log messages to multiple destinations (console + file) with a single method call. Here's a step-by-step breakdown:
Step 1: Set Up the Logging Providers
First, install the necessary NuGet packages to enable console and file logging. For a simple setup using Microsoft's official packages plus a reliable file logging extension:
dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Serilog.Extensions.Logging.File
Step 2: Configure the Logger
In your Program.cs (for .NET 6+ top-level statements), set up the logger factory to output to both console and file:
using Microsoft.Extensions.Logging; // Create a logger factory with both console and file providers var loggerFactory = LoggerFactory.Create(builder => { builder .AddConsole() // Send logs to console .AddFile("application.log"); // Send logs to a file named "application.log" }); // Create a logger instance for your program var logger = loggerFactory.CreateLogger<Program>();
If you're working with an ASP.NET Core app, the configuration is even simpler—add the providers directly to the built-in logging setup:
var builder = WebApplication.CreateBuilder(args); // Add console and file logging builder.Logging.AddConsole(); builder.Logging.AddFile("application.log");
Then inject ILogger<T> into your controllers/services to use it.
Step 3: Replace Duplicate Code with Unified Log Calls
Now you can replace all pairs of Console.WriteLine and Log.Debug with a single logger call. Your original code:
Console.WriteLine("starting app"); Log.Debug("stating app"); if (args.Length < 2) { Log.Debug("got less than 2 arguments"); Console.WriteLine("Should be run with arguments:"); Console.WriteLine("<DirecotryPath> <OutputPath>"); return; }
Becomes this clean, single-line-per-message version:
logger.LogDebug("starting app"); if (args.Length < 2) { logger.LogDebug("got less than 2 arguments"); logger.LogInformation("Should be run with arguments:"); logger.LogInformation("<DirectoryPath> <OutputPath>"); return; }
Bonus: Customize Log Levels and Formatting
You can further refine your logging by setting log levels (e.g., Debug, Information, Warning) and formatting. For example, to only show Information level and above in the console but keep all levels in the file:
builder.AddConsole(options => options.LogToStandardErrorThreshold = LogLevel.Information) .AddFile("application.log", LogLevel.Debug);
Why This Works
The .NET logging framework abstracts away the destination of your logs. When you call logger.LogXyz(), the framework automatically routes the message to all configured providers (console, file, and any others you add later like databases or monitoring tools). This eliminates duplicate code and makes your logging setup much more maintainable.
内容的提问来源于stack exchange,提问作者shani klein

