如何在自定义Varnish VMOD中利用内置库记录错误?
在Varnish VMOD中使用内置日志记录错误
你完全不需要依赖第三方C日志库——Varnish提供了一套原生的日志API,专门用于VMOD扩展,能完美适配Varnish的日志系统,还能避免多进程环境下的日志竞争问题。
核心思路:使用Varnish的VSL日志函数
Varnish的日志系统基于VSL(Varnish Shared Log),VMOD可以通过VSLb等宏将日志信息写入这个共享日志流,之后你可以通过varnishlog、varnishncsa等工具捕获或导出这些日志,甚至配置自定义日志文件。
修改你的代码示例
下面是更新后的代码,添加了Varnish内置日志的调用,同时修复了内存泄漏问题(别忘了释放jansson的对象):
#include "vrt.h" #include "cache/cache.h" #include "vcc_if.h" #include <jansson.h> #define JSON_ERROR "-1" #define JSON_LOC "/etc/example.json" VCL_STRING vmod_validate_mymod(VRT_CTX) { char *return_code = "0"; json_t *jobj; json_error_t error; jobj = json_load_file(JSON_LOC, 0, &error); if (!jobj) { // 用Varnish内置日志记录错误详情 VSLb(ctx, SLT_VCL_Error, "VMOD mymod: Failed to load JSON file '%s' - %s", JSON_LOC, error.text); return JSON_ERROR; } // 释放jansson对象,避免内存泄漏 json_decref(jobj); return return_code; }
关键细节说明
VSLb函数:这是Varnish提供的格式化日志宏,用法和printf类似,支持可变参数。b代表"buffer",会自动处理日志的缓冲区管理。SLT_VCL_Error标签:这是日志的分类标签,属于VCL错误类,确保你的错误日志会被归类到正确的日志流中。如果是调试信息,也可以用SLT_Debug标签。ctx参数:必须传递VRT_CTX上下文,Varnish需要它来关联日志到当前的请求或worker进程上下文。- 内存管理:一定要调用
json_decref(jobj)释放jansson创建的对象,VMOD中的内存泄漏会导致Varnish进程内存持续增长,引发性能问题。
查看和导出日志
- 实时查看日志:用
varnishlog过滤VCL错误日志:
你会看到类似这样的输出:varnishlog -g raw -i VCL_Error0 CLI - Rd ping 1 VCL_Error - VMOD mymod: Failed to load JSON file '/etc/example.json' - No such file or directory - 写入自定义文件:如果要将这些日志持久化到自定义文件,可以将
varnishlog的输出重定向,或者通过systemd等服务管理器配置:varnishlog -g raw -i VCL_Error >> /var/log/varnish/mymod_errors.log
重要提醒
不要在VMOD中直接用fopen/fprintf等标准C函数写入自定义文件——Varnish是多worker进程模型,直接写文件会导致日志混乱、竞争条件,甚至文件损坏。使用Varnish内置的日志系统是符合Varnish设计理念的安全方案。
内容的提问来源于stack exchange,提问作者codename_x
相关产品推荐
相关产品推荐

