Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update version to 1.5.0 #13

Merged
merged 86 commits into from
Dec 14, 2024
Merged

Update version to 1.5.0 #13

merged 86 commits into from
Dec 14, 2024

Conversation

F1F88
Copy link
Owner

@F1F88 F1F88 commented Dec 8, 2024

This is a major update!
This update resolves all currently known issues, simplifies some natives to ease the burden on developers, and adds some new features.


这是一次重大更新!
此次更新解决了目前已知的所有问题,简化了一些 natives 以减轻开发者负担,同时还增加了一些新的特性。

F1F88 added 30 commits November 16, 2024 21:41
* error C2338: static_assert failed: 'Unicode support requires compiling with /utf-8'
* See: gabime/spdlog#3233

* error 1:
    * tweakme.h:107:88: error: call to non-‘constexpr’ function
    * include/spdlog/common-inl.h:19:47: note: in expansion of macro ‘SPDLOG_LEVEL_NAMES’
* error 2:
    * the value of ‘leftAlign’ is not usable in a constant expression
增强
* 支持无限长度格式化字符串
* 格式化失败时不再中断脚本执行,而是调用默认 logger 以及发生错误的 logger 来记录相关的错误信息

修复
* 修复格式化出现错误时,会重复记录上一条日志的问题
* 格式化宽度小于数据长度时可能溢出的问题
* return void 的 native 统一返回 0
* return handle 的 native 统一返回 handle 或 BAD_HANDLE
* 记录日志的 native 不再预判断日志级别(因为这个操作是冗余的,为了追求性能,留给用户自行处理)
* 参数 level 越界时,直接修改为最近的边界值,不再用默认的 logger 输出警告信息
…g" "critical"

* 支持 NameToLogLevel() 识别日志级别的别名 "warning" "critical"
* 引入 logger_handle_manager 以重构所有 native 的 handle 读写
* 当参数 level, policy 越界时直接修改为临近的边界值,不再报错
* 改造 SetErrorHandler 以提高性能
* 默认 logger 不再提供给插件使用,只专用于拓展
* 默认 logger 的 sinks 变更为 stdout + daily file
* 默认 logger 的 daily file sink 比 stdout sink 的输出信息更详细
* 私有化 logger_handle_data 构造和析构,只允许 logger_handle_manager 进行管理,外部只能读取

* 使用 dist_sink 管理多线程 sink 以解决并发空指针的问题
* 使用 sink_handle_manager 替代 log4sp::sinks
* 现在尝试往单线程 logger 添加多线程 sink 会直接报错,反之多线程 logger 添加单线程 sink 也一样
* 移除 Sink 的格式化输出 natives,因为当格式错误时不方便溯源
* 不再区分 ***SinkST 或 ***SinkMT
* Sink 的构造函数添加 bool async 参数,用于区分单线程/多线程 sink
* 移除 common 中不再使用的 logger 和 sink 代码
@F1F88
Copy link
Owner Author

F1F88 commented Dec 9, 2024

改动记录(可能不是全部):

新增

  • 新增可格式化无限长度的 native Logger.***Ex() ([Feature Request] 增强日志格式化 #10)

    public native void LogEx(LogLevel lvl, const char[] fmt, any ...);
    public native void LogSrcEx(LogLevel lvl, const char[] fmt, any ...);
    public native void InfoEx(const char[] fmt, any ...);

  • 新增输出源 ClientChatSink(输出到玩家聊天框) ([Feature Request] Add client chat sink #11)

  • 新增默认 logger 名称的宏定义

    LOG4SP_DEFAULT_LOGGER_NAME

  • 新增 NameToLogLevel() 可识别的别名

    warn - warning
    error - err
    fatal - critical

变更

  • 变更 Logger.DropSink() 的返回值

    新:public native void DropSink(Sink sink);

    旧:public native bool DropSink(Sink sink);

  • 变更 Logger 的自定义错误处理回调

    新:LoggerErrorHandler --> function void (const char[] name, const char[] msg);

    旧:Log4spErrorCallback --> function void (const char[] msg);

  • 变更 handle 权限

    新:除了默认 logger,每个由插件创建的 Logger 和 Sink 都可以被任何插件释放

    旧:Logger 和 Sink 只能被创建者释放,其他插件只能使用,不能释放

  • 增强 LOG4SP_NO_EXT

    实现纯 SourcePawn 版的 LogLevelToName()、LogLevelToShortName()、NameToLogLevel()

    优化 Logger 日志输出格式

  • 变更 Logger 检查日志级别逻辑

    由于 spdlog 本身已对日志级别进行检查,因此 native 不再重复检查

  • 变更(合并)单线程 Sink 与多线程 Sink 的 methodmap

    现在每种 Sink 的单线程和多线程版都只有一个 methodmap

    创建多线程 Sink,只需在构造函数里将 multiThread 设为 true

  • 移除 Sink methodmap 中除 Sink.Log() 以外的所有日志输出 native

  • 变更 ClientConsoleSink 的玩家过滤器

    新:SinkClientFilter --> function Action (int client);

    旧:ClientConsoleSinkFilter --> function Action (int client);

  • 变更 RotatingFileSink.CalcFilename() 为静态 native

  • 变更 log4sp_empty 头文件为 log4sp_no_ext

  • 当 LogLevel 参数越界时,native 将使用最近的合法边界值,不再输出警告信息

  • 当 AsyncOverflowPolicy 参数越界时,native 将使用最近的合法边界值,不再输出警告信息

  • 当 PatternTimeType 参数越界时,native 将使用最近的合法边界值,不再输出警告信息

修复

杂项

  • 更新依赖库 spdlog 至版本 1.15.0

  • 更新测试用例和使用示例

  • 更新文档介绍和基准测试

  • 添加若干编译参数以提升拓展性能

  • 使用适配器模式重构了 handle 管理

    支持创建智能指针的 handle

  • 使用代理模式重构了 spdlog::logger

    解决并发安全问题

  • 使用命令模式重构了控制台指令 "sm log4sp"

    使命令模块代码结构更加清晰

  • 统一项目代码风格

    导入头文件时,标准库优先使用 <>,其他头文件优先使用 ""
    如果 native 函数返回 void,统一返回 0
    如果 native 函数返回 Handle,失败时统一返回 BAD_HANDLE
    src/log4sp 代码文件优先使用 .h 和 -inl.h 文件,代码风格参考 K & R 风格
    src/native 代码文件优先使用 .cpp 文件,代码风格参考 SourceMod 或其他拓展

@F1F88 F1F88 linked an issue Dec 9, 2024 that may be closed by this pull request
src/natives/logger.cpp Outdated Show resolved Hide resolved
src/natives/logger.cpp Outdated Show resolved Hide resolved
src/natives/logger.cpp Outdated Show resolved Hide resolved
@F1F88 F1F88 linked an issue Dec 11, 2024 that may be closed by this pull request
@F1F88 F1F88 self-assigned this Dec 11, 2024
src/log4sp/utils-inl.h Outdated Show resolved Hide resolved
F1F88 added 10 commits December 14, 2024 15:15
* 抽象后台工作接口,而不是将 thread_pool、async_logger、backend_worker 绑定
* 这能更灵活的自定义 async_logger 并复用 spdlog::thread_pool
* 由于 v2.x 还没有发行版,v1.x 拒绝合并破坏 api 的更改
  所以我们自己修改 spdlog 源码以满足自定义 async_logger 的需求
  后续需要特别注意此处的兼容性
* gabime/spdlog#3293
@F1F88 F1F88 merged commit 4287618 into main Dec 14, 2024
@F1F88 F1F88 deleted the 1.5-dev branch December 14, 2024 09:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant