如何使用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
相关产品推荐
相关产品推荐

