c# 简单实现将Message的内容保存到txt中,超过100个则清理旧文件

csharp 复制代码
using System;
using System.IO;
using System.Threading;

public static class LogManager
{
    private static readonly object _fileLock = new object(); // 线程安全锁
    private const int MaxFiles = 100;                        // 最大文件数限制
    private const string LogDirectory = "Logs";              // 日志目录
    private const string FilePrefix = "log_";                // 文件名前缀
    private const string FileExtension = ".txt";             // 文件扩展名

    /// <summary>
    /// 安全写入日志(自动处理文件滚动和清理)
    /// </summary>
    public static void SaveMessageWithRotation(string message)
    {
        try
        {
            // 确保日志目录存在
            Directory.CreateDirectory(LogDirectory);

            // 线程安全操作
            lock (_fileLock)
            {
                // 生成带时间戳的新文件名
                string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmssfff");
                string newFilePath = Path.Combine(LogDirectory, $"{FilePrefix}{timestamp}{FileExtension}");

                // 写入新文件
                File.WriteAllText(newFilePath, message);

                // 执行文件清理(异步不阻塞当前操作)
                ThreadPool.QueueUserWorkItem(_ => CleanOldLogs());
            }
        }
        catch (Exception ex)
        {
            // 这里应该用真正的日志系统记录错误(如NLog)
            Console.WriteLine($"日志写入失败: {ex.Message}");
        }
    }

    /// <summary>
    /// 清理旧日志文件(保留最新100个)
    /// </summary>
    private static void CleanOldLogs()
    {
        try
        {
            var directory = new DirectoryInfo(LogDirectory);
            if (!directory.Exists) return;

            // 获取所有日志文件并按创建时间排序
            var files = directory.GetFiles($"{FilePrefix}*{FileExtension}")
                               .OrderBy(f => f.CreationTime)
                               .ToArray();

            // 删除超出数量的旧文件
            if (files.Length > MaxFiles)
            {
                foreach (var file in files.Take(files.Length - MaxFiles))
                {
                    try { file.Delete(); }
                    catch { /* 忽略删除失败 */ }
                }
            }
        }
        catch
        {
            // 清理失败不影响主流程
        }
    }
}
相关推荐
EIP低代码平台9 小时前
EIP低代码平台-系统参数配置详解|落地三级等保+高灵活私有化部署方案
低代码·c#·权限·工作流·netcore
王莎莎-MinerU10 小时前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
-银雾鸢尾-10 小时前
C#中Object类内的方法
开发语言·c#
tiankong121312 小时前
如何拓展多态下的子类
设计模式·c#
geats人山人海13 小时前
c# 第九章 record
开发语言·c#
-银雾鸢尾-13 小时前
C#中的抽象类与抽象方法
开发语言·c#
影寂ldy14 小时前
C# Task 进阶:WaitAll / WaitAny / WhenAll / WhenAny
开发语言·c#
咏方舟【长江支流】15 小时前
【编程】(1)-跨平台跨语言C#、Java、鸿蒙ArkTS三端通用实体接口
java·c#·ai编程·harmonyos·arkts·咏方舟-长江支流·用宝框架
o52788318415 小时前
校园一体化管理系统2.1、基于整洁四层架构 + DDD+CQRS 项目目录解读
后端·架构·c#·asp.net·visual studio