You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义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_Error
    
    你会看到类似这样的输出:
    0 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:27:11