1

我正在尝试实现一个 websocket 客户端(在 C 中使用 libwebsockets)。我正在使用 cmake 来控制软件编译过程。

我的问题很简单:如何使用 Libwebsockets 启用调试日志记录?

首先,我编译并安装了 libwebsockets,就像它在关于构建 lws 的文档注释中所说的那样:

要为编译的低优先级调试消息使用调试信息和 _DEBUG 进行构建,请使用

$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG

来自Libwebsockets 2.1 doc Notes about encoding with lws ( https://libwebsockets.org/lws-api-doc-master/html/md_README.coding.html ):

调试日志

同样使用 lws_set_log_level api,您可以提供自定义回调来实际发出日志字符串。默认情况下, this 指向一个发送到 stderr 的内部 emit 函数。将其设置为 NULL 会使其保持原样。

帮助函数 lwsl_emit_syslog() 从库中导出以简化日志记录到 syslog。您仍然需要在用户代码中使用 setlogmask、openlog 和 closelog。

日志记录 API 可用于用户代码。

lwsl_err(...) lwsl_warn(...) lwsl_notice(...) lwsl_info(...) lwsl_debug(...) notice 和 info 的区别在于默认情况下会记录notice,而默认情况下会忽略info .

如果您没有使用定义的 _DEBUG 构建,即没有这个

$ cmake .. -DCMAKE_BUILD_TYPE=DEBUG 然后日志级别低于通知实际上并没有被编译。

就像在这个(官方)示例中一样,我把lws_set_log_level(10, NULL);我的 websocket 主要功能放在了开头。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.6)
project(foo)
set(CMAKE_C_STANDARD 11)
set(CMAKE_BUILD_TYPE DEBUG) #For CLion IDE but i'm pretty sur it does nothing.

set(SOURCE_FILES
        websocket.c
        websocket.h
        main.c)

add_executable(foo ${SOURCE_FILES})
target_link_libraries(foo websockets)

然后我运行 cmake :

cmake .. -DCMAKE_BUILD_TYPE=DEBUG
make

一切正常,我的 websocket 客户端似乎还可以。

但我没有调试日志......我错过了什么?

4

1 回答 1

1

感谢 Github 上的lws 团队

DEBUG 的构建类型会阻止更详细的日志记录类型在构建期间被删除。

您仍然需要在运行时使用 lws_set_log_level() 中的位图启用它们...默认值为 7(错误/警告/通知)

我误读了 libwebsockets.h :

    enum lws_log_levels {
    LLL_ERR = 1 << 0,
    LLL_WARN = 1 << 1,
    LLL_NOTICE = 1 << 2,
    LLL_INFO = 1 << 3,
    LLL_DEBUG = 1 << 4,
    LLL_PARSER = 1 << 5,
    LLL_HEADER = 1 << 6,
    LLL_EXT = 1 << 7,
    LLL_CLIENT = 1 << 8,
    LLL_LATENCY = 1 << 9,
    LLL_USER = 1 << 10,

    LLL_COUNT = 11 /* set to count of valid flags */
};

就像安迪说的,默认是0000 0111,所以 7...

于 2017-03-28T10:09:11.710 回答