.NET兼职社区
可以直接使用,防止重复造轮子。
using System.IO;
using System;
using System.Threading.Tasks;namespace Wpf.PersonnelNotice.Servers
{public sealed class LogService{private static readonly Lazy<LogService> lazy =new Lazy<LogService>(() =>{return new LogService();});public static LogService Instance { get { return lazy.Value; } }private string LogDirectory { get; set; }private string TimeDirName { get; set; }private string LogFileName { get; set; }private string FirstLogFileName { get; set; }private const long maxLogSize = 2 * 1024 * 1024; // 2 MBprivate string newFileName { get; set; }private bool _isInitialized = false;private LogService(){// 初始化LogDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Log");TimeDirName = DateTime.Now.ToString("yyyyMMdd");FirstLogFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";}public async Task WriteErrorLog(string message){EnsureInitialized();await WriteLog("Error", message);}public async Task WriteInfoLog(string message){EnsureInitialized();await WriteLog("Info", message);}private void EnsureInitialized(){if (!_isInitialized){CreatLogDir("Log");_isInitialized = true;}}public async Task WriteLog(string logType, string message){//创建文件夹string dirType = TimeDirName + "\\" + logType;CreatDir(dirType, LogDirectory);LogFileName = Path.Combine(LogDirectory, dirType, FirstLogFileName);if (!File.Exists(LogFileName)){using (StreamWriter sw = File.CreateText(LogFileName)){await sw.WriteLineAsync($"【{logType}】 {DateTime.Now} \r\n {message} \r\n \r\n");}}else{FileInfo fileInfo = new FileInfo(LogFileName);if (fileInfo.Length > maxLogSize){string newFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";FirstLogFileName = newFileName;LogFileName = Path.Combine(LogDirectory, dirType, newFileName);using (StreamWriter sw = File.CreateText(LogFileName)){await sw.WriteLineAsync($"【{logType}】 {DateTime.Now} \r\n {message} \r\n \r\n");}}else{using (StreamWriter sw = File.AppendText(LogFileName)){await sw.WriteLineAsync($"【{logType}】 {DateTime.Now} \r\n {message} \r\n \r\n");}}}}public static void CreatLogDir(string name){string rootDirectory = Directory.GetCurrentDirectory();Instance.CreatDir(name, rootDirectory);}// 将CreatDir方法改为非静态,因为在单例模式下由实例调用public bool CreatDir(string name, string path){if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path");string logPath = Path.Combine(path, name);// 判断文件夹是否存在if (!Directory.Exists(logPath)){// 在当前项目根目录创建一个新的文件夹Directory.CreateDirectory(logPath);return true;}return false;}}
}
// 使用示例
LogService.Instance.WriteErrorLog("This is an error message.");
LogService.Instance.WriteInfoLog("This is an info message.");