Log4sp 是一个强大的 SourceMod 拓展,为 SourceMod 插件开发者提供了一套高性能、功能丰富、简单易用的记录日志 API。
借助 log4sp,插件开发者无需再编写复杂的日志记录代码,从而更专注于插件的核心功能开发。
-
非常快,比 SourceMod API - Logging 快得多
-
支持自定义日志过滤
-
对于测试环境,使用较低的日志级别(如:
trace
、debug
)可以增加日志输出,从而排查问题 -
对于发布环境,使用较高的日志级别(如:
warn
、error
)可以减少日志输出,从而提高性能
-
-
支持自定义日志消息模板
-
指定日志消息的样式,附加其他信息(如:时间、日志级别、源代码位置 等)
-
默认日志模板:
[%Y-%m-%d %H:%M:%S.%e] [%n] [%l] [%s:%#] %v
[2024-08-01 12:34:56:789] [log4sp] [info] [example.sp:123] message
-
日志模板占位符:spdlog wiki
-
-
支持自定义日志消息刷新级别
-
默认情况下,log4sp 拓展会在认为合适时刷新日志缓冲区,以实现更高的性能
-
Logger.Flush()
可以手动刷新 -
Logger.FlushOn()
可以自定义触发自动刷新的最低日志级别
-
-
支持服务器控制台菜单
- 控制台指令 "sm log4sp" 能够动态修改:日志级别、刷新级别、日志模板、等
-
支持 "无限长度" 的日志消息
-
对于
Logger.LogAmxTpl()
方法,日志消息的最大长度为 2048 字符,超出的部分会被截断 -
对于
Logger.Log()
和Logger.LogEx()
方法,日志消息的长度不受限制(理论上取决于可用内存)
-
-
支持一次日志操作写入多个输出源
-
每一个记录器 (Logger) 都可以拥有多个输出源 (Sink)
-
每一个输出源 (Sink) 都可以自定义不同的日志级别、日志模板
例如:当 Logger 拥有
ServerConsoleSink
和DailyFileSink
时,相当于sv_logecho 1
时的 LogMessage
-
-
支持多种输出源
-
BaseFileSink (类似于 LogToFile)
-
ClientChatAllSink(类似于 PrintToChatAll)
-
ClientConsoleAllSink(类似于 PrintToConsoleAll)
-
DailyFileSink(类似于 LogMessage,基于日期更替日志文件)
-
RotatingFileSink(类似于 LogMessage,基于文件大小更替日志文件)
-
ServerConsoleSink(类似于 PrintToServer)
-
完整的 Sink 列表请查看:sinks 文件夹
-
API 文档:Native API Reference
使用文档:Wiki Pages
log4sp
拓展适用于 Linux 和 Windows 上的所有游戏
测试平台: Windows 11 + VMware + Ubuntu 24.04 LTS + SourceMod 1.13.0.7178
宿主机配置: AMD Ryzen 7 7840HS + 32 GB 内存
VM Ubuntu 配置: 1 CPU + 8 核心 + 8 GB 内存
测试用例:benchmark-log4sp.sp
[benchmark] base-file | Iters 1000000 | Elapsed 0.465 secs 2150463/sec
[benchmark] daily-file | Iters 1000000 | Elapsed 0.471 secs 2118729/sec
[benchmark] rotating-file | Iters 1000000 | Elapsed 0.482 secs 2073553/sec
[benchmark] server-console | Iters 1000000 | Elapsed 4.847 secs 206288/sec
作为参考, 还测试了 sourcemod 的 logging API
[benchmark] LogMessage | Iters 1000000 | Elapsed 9.657 secs 103548/sec
[benchmark] LogToFile | Iters 1000000 | Elapsed 8.070 secs 123903/sec
[benchmark] LogToFileEx | Iters 1000000 | Elapsed 7.959 secs 125637/sec
[benchmark] PrintToServer | Iters 1000000 | Elapsed 4.718 secs 211920/sec
-
gabime 的 spdlog 库实现了绝大部分功能,此拓展将 spdlog API 包装后提供给 SourcePawn 使用
-
Fyren, nosoop, Deathreus 为拓展管理 Sink Handle 提供了解决思路
-
blueblur0730, Digby 帮助改进了遍历操作所有 logger
-
Bakugo, Anonymous Player, Fyren 帮助解决异步调用 SourcePawn 导致崩溃的问题
如有遗漏,请联系我