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

OpenWrt Adblock拦截请求统计日志累计计算问题求助

问题背景

我正在使用OpenWrt的Adblock包,希望将adb_report.json中的total和blocked数据累计存入stored_data.json,目标格式如下:

{
  "TOTAL": 39100,
  "BLOCKED": 16172
}

但每次生成报告时,adb_report.json的start_date、start_time、end_date、end_time会发生变更,导致无法准确计算累计数据;另外Adblock包不会自动生成adb_report.json。我编写的shell脚本如下:

#!/bin/bash

# Path to the JSON file
JSON_S_FILE="adb_report.json"
# Path to extracted datd file
JSON_O_FILE="stored_data.json"

# Check if the JSON file exists
if [ ! -f "$JSON_S_FILE" ]; then
    echo "Error: JSON file '$JSON_S_FILE' not found!"
    exit 1
fi

# Extract specific values using jq
TOTAL=$(jq -r '.total' "$JSON_S_FILE")
BLOCKED=$(jq -r '.blocked' "$JSON_S_FILE")

#updating values in extracted data file

if [ -s $JSON_O_FILE ] && jq empty $JSON_O_FILE >/dev/null 2>&1; then
#if exists & valid
    echo "The JSON file is valid and not empty."
    jq --arg total "$TOTAL" --arg blocked "$BLOCKED" \
       '{"TOTAL": ((.TOTAL|tonumber) + ($total|tonumber)), 
         "BLOCKED": ((.BLOCKED|tonumber) + ($blocked|tonumber))}' \
       "$JSON_O_FILE" > temp.json && mv temp.json "$JSON_O_FILE"
else
#if not, create & write!!
    echo "The JSON file is either empty or not valid."
    echo "{\"TOTAL\": \"$TOTAL\", \"BLOCKED\": \"$BLOCKED\"}" >stored_data.json
fi

adb_report.json示例数据如下:

{
  "start_date": "2024-12-24",
  "start_time": "22:13:12",
  "end_date": "2024-12-25",
  "end_time": "01:05:04",
  "total": "6076",
  "blocked": "4355",
  "percent": "71.68%"
}

现求助两个问题:

  1. 该报告时间戳的变更规则是什么?
  2. 有没有更优的拦截请求统计方法?

解答

一、adb_report.json时间戳的变更规则

adb_report.json是手动执行adb_report命令生成的临时统计文件,Adblock本身不会自动创建它。时间戳的逻辑如下:

  • start_date/start_time:统计周期的起始点,对应Adblock服务最近一次启动、规则重载,或上次执行adb_report后统计计数器被重置的时间
  • end_date/end_time:执行adb_report命令的当前系统时间
    每次执行adb_report都会覆盖原文件,同时Adblock默认会重置内存中的统计计数器,所以每次生成的报告仅包含从上一个起始点到当前命令执行时间的请求数据,时间戳自然随每次执行动作变化。

二、更优的拦截请求统计方法

1. 直接调用Adblock的ubus接口获取实时统计

跳过生成adb_report.json的步骤,直接通过OpenWrt的ubus机制读取Adblock的实时统计数据,避免文件依赖:

#!/bin/bash
JSON_O_FILE="stored_data.json"

# 直接从ubus获取统计数据
REPORT=$(ubus call adb report)
TOTAL=$(echo "$REPORT" | jq -r '.total')
BLOCKED=$(echo "$REPORT" | jq -r '.blocked')

# 更新累计数据
if [ -s "$JSON_O_FILE" ] && jq empty "$JSON_O_FILE" >/dev/null 2>&1; then
    # 直接原地修改文件,无需临时文件
    jq --arg total "$TOTAL" --arg blocked "$BLOCKED" \
       '.TOTAL += ($total|tonumber) | .BLOCKED += ($blocked|tonumber)' \
       -i "$JSON_O_FILE"
else
    # 初始化文件时存储数值类型,而非字符串
    echo "{\"TOTAL\": $TOTAL, \"BLOCKED\": $BLOCKED}" > "$JSON_O_FILE"
fi

可以配合cron定时执行脚本,实现自动累计统计。

2. 开启Adblock的统计持久化(若支持)

检查Adblock的配置文件/etc/config/adblock,查看是否有report_save相关配置项,配置后可让统计数据持久化到指定文件,避免每次生成报告后重置计数器。例如:

config adblock 'global'
    option report_save '/var/lib/adblock/adb_stats.json'

配置完成后,Adblock会自动维护累计的统计数据,无需手动累加。

3. 直接分析DNS原始日志统计

Adblock本质通过DNS拦截请求,直接分析dnsmasq的日志(默认路径/var/log/dnsmasq.log)可以获得最原始的请求数据,不受Adblock统计逻辑限制:

  • 统计总DNS请求数:
    grep -c "query" /var/log/dnsmasq.log
    
  • 统计被Adblock拦截的请求数(日志中通常带有blocked标记):
    grep -c "blocked" /var/log/dnsmasq.log
    

可以结合logrotate管理日志文件,实现按周期统计或长期累计。


内容的提问来源于stack exchange,提问作者fwiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:28:10