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

如何使用Curl将Linux日志文件内容保存到Mongodb服务器

Shell脚本实现curl上传Linux日志到MongoDB方案

前置依赖

  • 安装工具:运行yum install jq curl -y(RHEL系)或apt install jq curl -y(Debian系)
  • 准备MongoDB HTTP写入接口:可以使用MongoDB官方Data API,或者自行部署Mongo REST网关,提前获取API密钥、目标数据库、集合名称

完整脚本

#!/bin/bash
# 自定义配置项,根据实际情况修改
LOG_PATH="/var/log/nginx/access.log"       # 要上传的日志文件路径
MONGO_WRITE_API="你的MongoDB写入接口地址"  # 例如Atlas Data API地址
MONGO_API_SECRET="你的API认证密钥"
TARGET_DB="operation_logs"
TARGET_COLLECTION="nginx_access"
DATASOURCE_NAME="Cluster0"                 # 自建接口可删除该配置对应逻辑

# 检查依赖是否存在
if ! command -v jq &>/dev/null || ! command -v curl &>/dev/null; then
    echo "错误:请先安装jq和curl工具"
    exit 1
fi

# 检查日志文件是否存在
if [ ! -f "${LOG_PATH}" ]; then
    echo "错误:日志文件${LOG_PATH}不存在"
    exit 1
fi

# 逐行读取日志处理,保留原始格式
line_count=0
success_count=0
while IFS= read -r log_content || [ -n "${log_content}" ]; do
    ((line_count++))
    # 跳过空行
    if [ -z "${log_content}" ]; then
        continue
    fi

    # 构造合法JSON请求体,自动转义特殊字符
    req_body=$(jq -n \
        --arg db "${TARGET_DB}" \
        --arg coll "${TARGET_COLLECTION}" \
        --arg ds "${DATASOURCE_NAME}" \
        --arg content "${log_content}" \
        --arg upload_at "$(date +'%Y-%m-%dT%H:%M:%S%z')" \
        '{
            "dataSource": $ds,
            "database": $db,
            "collection": $coll,
            "document": {
                "raw_log": $content,
                "upload_time": $upload_at,
                "line_num": $line_count
            }
        }')

    # 调用curl上传到MongoDB
    resp=$(curl -s -o /dev/null -w "%{http_code}" -X POST "${MONGO_WRITE_API}" \
        -H "Content-Type: application/json" \
        -H "api-key: ${MONGO_API_SECRET}" \
        -d "${req_body}")

    if [[ "${resp}" =~ ^2[0-9]{2}$ ]]; then
        ((success_count++))
    else
        echo "第${line_count}行上传失败,HTTP状态码:${resp}" >&2
    fi
done < "${LOG_PATH}"

echo "处理完成,总行数:${line_count},成功上传:${success_count}"

核心逻辑说明

  • 逐行读取:使用while IFS= read -r log_content结构,IFS=保留行首行尾空格,-r禁止自动转义反斜杠字符,末尾|| [ -n "${log_content}" ]兼容无换行符的最后一行日志,确保不丢数据
  • 格式兼容:用jq构造JSON请求体,自动转义日志中的双引号、换行符等特殊字符,避免JSON格式错误
  • 状态校验:每次上传返回HTTP状态码校验,失败日志输出到标准错误流方便排查
  • 可选优化:如果需要增量同步,可在脚本中增加记录上次读取行号的逻辑,下次运行直接从对应行开始读取,避免重复上传

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:39:02