可以直接使用,防止重复造轮子。
csharp
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 MB
private string newFileName { get; set; }
private LogService()
{
// 在根目录创建Log文件夹
CreatLogDir("Log");
// 初始化
LogDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Log");
TimeDirName = DateTime.Now.ToString("yyyyMMdd");
FirstLogFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";
}
public async Task WriteErrorLog(string message)
{
await WriteLog("Error", message);
}
public async Task WriteInfoLog(string message)
{
await WriteLog("Info", message);
}
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;
}
}
}
// 使用示例
csharp
LogService.Instance.WriteErrorLog("This is an error message.");
LogService.Instance.WriteInfoLog("This is an info message.");