使用 Markdown 格式,我将为您详细介绍如何编写一个异步写日志的实用工具类(LogAsyncWriter)。
LogAsyncWriter 类的设计
LogAsyncWriter 是一个轻量级的异步写日志工具类。它的设计主要包括以下内容:
属性
-
LogFilePath
: 可读写的字符串属性,表示日志文件的完整路径。默认为项目根目录下的 log.txt 文件。 -
LogLevel
: 枚举类型属性,表示日志输出的级别。默认为 Info。
方法
-
Log(string msg)
: 接收一个字符串参数,直接将日志信息写入日志文件中。 -
Log(string msg, LogLevle level)
: 接收两个参数,第一个日志信息,第二个为日志级别,将日志信息按照指定日志级别写入日志文件中。
注意:日志级别的枚举类型可以自行定义,如:
public enum LogLevel {
Debug,
Info,
Warning,
Error
}
基本实现
using System;
using System.IO;
using System.Threading.Tasks;
public enum LogLevel {
Debug,
Info,
Warning,
Error
}
public class LogAsyncWriter {
private static readonly object locker = new object();
private string logFilePath;
private LogLevel logLevel;
public LogAsyncWriter(string logFilePath = "./log.txt", LogLevel logLevel = LogLevel.Info) {
this.logFilePath = logFilePath;
this.logLevel = logLevel;
}
public string LogFilePath {
get { return logFilePath; }
set { logFilePath = value; }
}
public LogLevel LogLevel {
get { return logLevel; }
set { logLevel = value; }
}
public async Task LogAsync(string msg, LogLevel level = LogLevel.Info) {
if (level < LogLevel) return;
var logMsg = $"[{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss.fff}][{level}] {msg}";
await WriteAsync(logMsg);
}
private async Task WriteAsync(string msg) {
await Task.Run(() => {
lock (locker) {
using (var writer = new StreamWriter(LogFilePath, append: true)) {
writer.WriteLine(msg);
}
}
});
}
}
上述代码使用 C# 实现了异步写日志的基本功能。其中,WriteAsync
方法使用 StreamWriter
写入日志文件,LogAsync
方法将日志信息按照指定的日志级别写入日志文件,LogLevel
控制日志输出的级别。
使用示例
using System;
class Program {
static void Main(string[] args) {
var logger = new LogAsyncWriter();
logger.LogAsync("start My Application").Wait();
try {
// your code here
} catch (Exception e) {
logger.LogAsync(e.Message, LogLevel.Error).Wait();
}
logger.LogAsync("finish My Application").Wait();
}
}
在上面的代码示例中,我们先实例化 LogAsyncWriter
类,并使用 LogAsync
方法记录日志。Wait()
方法将异步任务转化为同步的,以确保日志正确地写入。
再看一个使用事件的示例:
using System;
class Program {
static void Main(string[] args) {
var logger = new LogAsyncWriter();
AppDomain.CurrentDomain.UnhandledException += (sender, e) => {
var ex = (Exception)e.ExceptionObject;
logger.LogAsync(ex.Message, LogLevel.Error).Wait();
};
logger.LogAsync("start My Application").Wait();
try {
// your code here
} catch (Exception e) {
logger.LogAsync(e.Message, LogLevel.Error).Wait();
}
logger.LogAsync("finish My Application").Wait();
}
}
在这个示例中,我们注册了 UnhandledException
事件,可以在全局捕获未处理的异常,将其写入日志。无需使用 try-catch
块来捕获异常。
希望以上代码示例能够让您更好地使用 LogAsyncWriter 类。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter) - Python技术站