C#中Logger实例调用Log方法时如何同步写入另一实例日志文件
日志同步需求实现方案
核心思路
不要改动原有Logger基类的底层写入逻辑,通过派生带转发功能的日志子类实现需求,既保证原有日志输出逻辑完全不变,也能严格按照实际执行时序同步日志内容,不会打乱日志顺序。
- 原有DebugInfoLogger的实例化和使用逻辑完全不动,不影响已有调试日志的写入
- 针对TestStepLogger单独做一层包装,调用其Log方法时,写完自身绑定的TestStepLogFile后,同步把相同日志内容传给DebugInfoLogger写入对应文件
- 全程在日志写入时实时同步,不需要事后读取文件合并,完全匹配期望的日志输出顺序
具体实现
- 先定义继承自原有Logger基类的转发日志子类
public class SyncForwardLogger : Logger { private readonly Logger _syncTarget; public SyncForwardLogger(string selfLogFile, Logger syncTargetLogger) : base(selfLogFile) { _syncTarget = syncTargetLogger; } public override void Log(string logContent) { // 执行基类原有的写入逻辑,保证自身日志文件输出和之前完全一致 base.Log(logContent); // 同步将内容写入目标调试日志文件 _syncTarget.Log(logContent); } }
- 调整原有的实例化代码,注意先初始化DebugInfoLogger,再初始化TestStepLogger
// 调试日志实例初始化逻辑完全不变 DebugInfoLogger = new Logger(DebugInfoLogFile); // 替换TestStepLogger的初始化逻辑,传入需要同步的目标日志实例 TestStepLogger = new SyncForwardLogger(TestStepLogFile, DebugInfoLogger);
效果说明
按照这个方案实现后:
- TestStepLogFile的写入逻辑没有任何改动,内容和之前完全一致,只保留步骤类日志
- DebugInfoLogFile会按照实际代码的调用顺序记录所有日志:先写入的调试日志在前,中间调用TestStepLogger写入的步骤日志会按调用顺序插入,最后写入的调试日志在后,和给出的期望输出完全匹配
注意不要采用日志落盘后再合并两个文件的方案,这种方案无法还原代码运行时的真实日志时序,很容易出现日志顺序错乱的问题,会直接影响日志的问题排查价值。
内容的提问来源于stack exchange,提问作者Hemant Pawar
相关产品推荐
相关产品推荐

