基于 SQLite 的高性能异步日志库,支持按天分库、按小时分表,适用于 .NET Framework 和 .NET Core。
$ dotnet add package AsyncLoggerLib适用于 .NET Framework 4.8 及以上版本的高并发日志记录库,使用 SQLite 存储日志,支持:
dotnet add package AsyncLoggerLib
using AsyncLoggerLib;
class Program
{
static void Main(string[] args)
{
// 自定义配置路径 + 自定义日志目录
string configPath = @"C:\MyApp\config\logger.json";
string logDir = @"C:\Users\Administrator\Desktop\logs";
// 初始化日志系统
LoggerBootstrapper.Initialize(ELogWriteMethod.FileAndDatabase, configPath, logDir);
// 写入日志
Logger.Shared.Info("应用程序已启动");
Logger.Shared.Warn("这是一个警告信息");
Logger.Shared.ErrorAsync("发生了一个错误", new Exception("测试异常"));
Console.WriteLine("日志已写入,按任意键退出...");
Console.ReadKey();
// 关闭日志系统
LoggerBootstrapper.Shutdown();
}
}
// 指定配置文件路径 + 日志存储目录
LoggerBootstrapper.Initialize(
configPath: @"C:\MyApp\config\logger.json",
logDirectory: @"D:\MyApp\logs"
);
// 加载配置
LoggerOptionsLoader.Load();
// 初始化日志缓冲器
var buffer = new DbLogBuffer("Normal",Environment.GetFolderPath(SpecialFolder.Desktop));
// 创建日志器
var logger = new DbLogger(buffer);
logger.RegisterCallback(
"附加事件",
(log, key) =>
{
Console.WriteLine($"附加事件:{log.Message}");
}
);
//Console.WriteLine("=== 欢迎使用 AsyncLoggerLib 命令行 Demo ===\n");
// 示例 1:写入 Info 日志 + 自定义属性
var writeStopwatch = Stopwatch.StartNew();
logger.Info(
"用户登录成功。",
[("UserId", "U12345"), ("Action", "Login")],
tag: "附加事件"
);
//Console.WriteLine("已记录一条 Info 日志(含自定义属性)");
// 示例 2:写入 Warn 日志
logger.Warn("这是一个警告信息。", tag: "附加事件");
//Console.WriteLine("已记录一条 Warn 日志");
// 示例 3:写入 Error 日志 + 异常信息
try
{
throw new InvalidOperationException("数据库连接失败");
}
catch (Exception ex)
{
logger.Error("发生错误:", ex);
}
//Console.WriteLine("已记录一条 Error 日志(含异常)");
// 示例 4:异步写入日志
await logger.LogAsync(LogLevel.Debug, "这是调试信息。");
//Console.WriteLine("已异步记录 Debug 日志");
// 等待缓冲队列刷新
//await Task.Delay(3000);
// 结束前关闭日志系统
writeStopwatch.Stop();
Console.WriteLine(
$"\n⏱ 日志写入总耗时:{writeStopwatch.Elapsed.TotalMilliseconds:F2} 毫秒\n"
);
buffer.Shutdown();
//// 示例 5:构建查询条件并执行查询
var queryService = CreateQueryServiceForToday();
var queryOptions = new LogQueryOptions { };
Console.WriteLine("正在执行日志查询...");
var queryStopwatch = Stopwatch.StartNew();
var logs = await queryService.QueryLogsAsync(queryOptions);
queryStopwatch.Stop();
Console.WriteLine(
$"\n⏱ 日志查询耗时:{queryStopwatch.Elapsed.TotalMilliseconds:F2} 毫秒"
);
Console.WriteLine($"共找到 {logs.Count()} 条日志:\n");
foreach (var log in logs)
{
log.Print();
}
logger.UnregisterCallback("附加事件");
Console.WriteLine("按任意键退出...");
Console.ReadKey();
默认日志文件会保存在程序根目录下的 Logs/ 文件夹中:
Logs/
├── 2025-04-05.db
│ ├── Logs_00
│ ├── Logs_01
│ └── ...
{
"LoggerOptions": {
"BatchSize": 50,
"FlushIntervalSeconds": 2,
"MaxRetries": 3,
"MaxDaysToKeep": 7,
"IncludeThreadId": true,
"IncludeProcessId": true,
"IncludeMachineName": true,
"IncludeProcessName": true,
"IncludeThreadName": true
}
}
| 配置项 | 描述 |
|---|---|
BatchSize | 批量写入条数 |
FlushIntervalSeconds | 写入间隔(秒) |
MaxRetries | 写入失败最大重试次数 |
MaxDaysToKeep | 最大保留天数 |
Include* | 是否记录系统属性 |
var queryService = new SqliteLogQueryService(dbFilePath);
var options = new LogQueryOptions
{
LevelFilter = LogLevelFilter.Warn | LogLevelFilter.Error,
FromTime = DateTime.Now.AddDays(-1),
ToTime = DateTime.Now,
FullTextSearchTerm = "error",
OrderByTimestampDescending = true,
PageNumber = 1,
PageSize = 20
};
var logs = await queryService.QueryLogsAsync(options);