本文介绍了一个基于DAG结构的大模型日志分析工作流,通过从日志易平台获取数据,预处理后使用deepseek-reasoner大模型进行异常检测和分析,最终通过飞书推送报告给运维人员。工作流包含日志获取、数据预处理、LLM分析、结果提取和报告推送等关键阶段,并提供了完整的Python代码实现和定时任务配置方案,帮助构建智能化的日志分析系统。
工作流采用有向无环图(DAG)结构,分为以下关键阶段:
-
日志获取:通过 HTTP 请求从日志易平台获取过去 指定时间段请求日志。
-
数据预处理:将原始日志格式化为结构化 JSON,方便 AI 分析。
-
日志分析:利用 deepseek-reasoner 大模型进行异常归类、问题提取和建议生成。
-
结果提取:从大模型输出中提取“日志分析报告”。
-
报告推送:通过飞书 Webhook 将报告发送给运维人员。
-
流程结束:完成工作流,输出最终结果。
一、工作流
工作流图:

1. 开始节点
功能:工作流起点,触发后续流程。
作用:作为入口,启动日志获取流程,无需输入参数,直接连接 代码执行节点。

2、配置环境变量
- feishu_webhook:飞书webhook地址
- es_index:es索引名称
- es_host:es的地址和端口
- es_password:es的账号密码,格式是:Basic 用户名密码(使用base64加密)

3、代码执行 节点
功能:初始化es查询语句,传递给下一额给节点
作用:python初始化es查询语句,开始和结束时间参数,传递给HTTP节点。
输出参数:
- es_query:es查询语句
- start_time:开始时间
- end_time:结束时间

python代码主要功能:获取es查询语句和开始结束时间
from datetime import datetime, timedelta, timezone
import json
def main():
tz = timezone(timedelta(hours=8))
end_time = datetime.now(tz)
start_time = end_time - timedelta(minutes=5)
query = {
"size": 10000,
"query": {
"bool": {
"must": [
{
"range": {
"@timestamp": {
"gte": "now-5m",
"lte": "now"
}
}
}
]
}
},
"_source": [
"@timestamp", "clientip", "request_method",
"request_uri","response_code", "request_time",
"body_bytes_sent", "user_agent", "hostname", "referrer"
]
}
return {
"es_query": json.dumps(query),
"start_time": start_time.strftime("%Y-%m-%d %H:%M:%S"),
"end_time": end_time.strftime("%Y-%m-%d %H:%M:%S")
}
4、HTTP 请求节点
功能:从 ELK 日志易平台获取基地网络设备日志。
作用:通过精准查询条件获取异常日志,Basic 认证和重试机制确保请求安全和稳定。
参数说明:
- 请求方式:POST
- URL:{{#env.es_host#}}/{{#env.es_index#}}/_search
- HEADERS认证:Basic 认证方式
- BODY:JSON获取上一个节点{{es_query}}的数据
- 重试机制:3 次重试,间隔 100ms。
- 输出:JSON 格式的日志数据(body),传递给下一级 代码执行 节点。

注意:HTTP请求默认数据体大小1MB,否则报如下错误。
Text size is too large, max size is 1.00 MB, but current size is 1.24 MB.
5、代码执行 节点
功能:将原始日志转化为结构化 JSON,供大模型分析。
作用:确保日志数据结构化,便于大模型处理,同时限制数据量以提升性能。
import json
from collections import Counter
import re
def main(body, status_code):
if status_code != 200:
return {
'processed_success': 'false',
'error': f'ES request failed with status {status_code}',
'summary': 'Failed to fetch data'
}
try:
result = json.loads(body)
hits = result.get('hits', {}).get('hits', [])
if not hits:
return {
'processed_success': 'true',
'summary': 'No logs found in the time range',
'ip_stats': {},
'error_requests': [],
'suspicious_count': 0,
'error': ''
}
logs = []
for hit in hits:
source = hit.get('_source', {})
logs.append({
'timestamp': source.get('@timestamp'),
'clientip': source.get('clientip'),
'request_method': source.get('request_method'),
'request_uri': source.get('request_uri'),
'referrer': source.get('referrer'),
'response_code': source.get('response_code'),
'user_agent': source.get('user_agent')
})
ip_counter = Counter()
error_requests = []
suspicious_count = 0
response_code_stats = Counter()
error_code_stats = Counter()
attack_patterns = [
r'\.\./', r'<script', r'union.*select',
r'exec\(', r'/etc/passwd', r'\bor\s+1=1'
]
for log in logs:
clientip = log.get('clientip', '')
response_code_raw = log.get('response_code', 200)
request_uri = log.get('request_uri', '')
# 确保response_code是整数类型
try:
response_code = int(response_code_raw) if response_code_raw is not None else 200
except (ValueError, TypeError):
response_code = 200 # 默认值
if clientip:
ip_counter[clientip] += 1
# 统计所有响应码
response_code_stats[response_code] += 1
# 过滤非2xx和3xx的响应码(异常请求)
if not (200 <= response_code < 400):
error_requests.append(log)
error_code_stats[response_code] += 1
request_content = request_uri.lower()
for pattern in attack_patterns:
if re.search(pattern, request_content, re.IGNORECASE):
suspicious_count += 1
break
top_ips = dict(ip_counter.most_common(10))
high_freq_ips = {ip: count for ip, count in top_ips.items() if count > 20}
# 计算异常率
error_rate = round((len(error_requests) / len(logs)) * 100, 2) if len(logs) > 0 else 0
summary = f"总日志数: {len(logs)}, 异常请求数: {len(error_requests)} ({error_rate}%), 可疑模式: {suspicious_count}, 高频IP: {len(high_freq_ips)}"
return {
'processed_success': 'true',
'ip_stats': json.dumps(top_ips, ensure_ascii=False),
'error_requests': json.dumps(error_requests[:20], ensure_ascii=False),
'suspicious_count': suspicious_count,
'high_frequency_ips': json.dumps(high_freq_ips, ensure_ascii=False),
'response_code_stats': json.dumps(dict(response_code_stats), ensure_ascii=False),
'error_code_stats': json.dumps(dict(error_code_stats), ensure_ascii=False),
'error_rate': error_rate,
'summary': summary,
'total_logs': len(logs),
'error': ''
}
except Exception as e:
return {
'processed_success': 'false',
'error': str(e),
'summary': 'Processing failed'
}
具体输出参数如下:

6、LLM 模型节点
功能:利用 大模型分析日志,生成结构化报告。
模型:deepseek-reasoner。

提示模板内容:
# SYSTEM
你是一个专业的网络安全分析师,专门分析Nginx访问日志中的异常行为。请根据提供的日志统计数据,判断是否存在安全威胁。
分析重点:
1. 异常高频访问(可能的DDoS或爬虫攻击)
2. 可疑的请求模式(SQL注入、XSS、目录遍历等)
3. 异常的响应码分布
4. 可疑的User-Agent
请以JSON格式返回分析结果:
{
"anomaly_detected": true/false,
"anomaly_details": "详细的异常描述",
"risk_level": "low/medium/high"
}
# USER
请分析以下Nginx日志统计数据:
统计摘要:{{#1756090016784.summary#}}
IP访问统计:{{#1756090016784.ip_stats#}}
高频IP详情:{{#1756090016784.high_frequency_ips#}}
响应码分布:{{#1756090016784.response_code_stats#}}
异常响应码统计:{{#1756090016784.error_code_stats#}}
异常请求率:{{#1756090016784.error_rate#}}%
错误请求样本:{{#1756090016784.error_requests#}}
可疑模式匹配数量:{{#1756090016784.suspicious_count#}}
请基于以上数据进行安全分析,重点关注异常响应码(4xx、5xx)的分布和异常请求率,判断是否存在安全威胁。
注意:尽量输入输出模型的数据精简,降低token成本。
7、条件分支 节点
功能:根据模型分析出来的结果,判断是否存在异常,但存在则触发通知,否则结束流程
作用:提取异常请求,减少不必要的通知告警。

8、HTTP 请求节点(异常处理节点)
功能:获取异常数,将告警信息通过飞书通知
作用:确保报告及时送达运维人员,提升问题响应效率。
{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true
},
"header": {
"title": {
"tag": "plain_text",
"content": "🚨 Nginx日志异常检测告警"
},
"template": "red"
},
"elements": [{
"tag": "div",
"fields": [{
"is_short": true,
"text": {
"tag": "lark_md",
"content": "**📅 监控时间段**\n 至 "
}
}, {
"is_short": true,
"text": {
"tag": "lark_md",
"content": "**📊 总日志数**\n 条"
}
}]
}, {
"tag": "div",
"fields": [{
"is_short": true,
"text": {
"tag": "lark_md",
"content": "**⚠️ 异常请求率**\n%"
}
}, {
"is_short": true,
"text": {
"tag": "lark_md",
"content": "**🔍 可疑模式数**\n个"
}
}]
}
]
}
}
说明:因飞书机器人数据体的限制,目前只有传递这些参数,若采用其他通知方式可以补充通知数据报告,完善数据消息的通知。
9、结束节点
功能:标记工作流完成。
作用:接收推送结果,结束流程。
飞书通知消息如下:

二、扩展功能
1、工作流启动接口
curl -X POST 'http://192.168.10.20/v1/workflows/run' \
--header 'Authorization: Bearer {api_key}' \
--header 'Content-Type: application/json' \
--data-raw '{
"inputs": {},
"response_mode": "streaming",
"user": "abc-123"
}'
目前dify没有完善的定时任务调度,可以使用接口处理。
2、使用python定时处理
1)定义一个dify_elk.py文件
# 定义一个dify_elk.py文件
import requests
import json,os
from datetime import datetime
# Dify 工作流 API 配置
DIFY_API_URL = "http://127.0.0.1/v1/workflows/run"
DIFY_API_KEY ="app-Flz8M3qIo0H8b87C2LPgEBUW"
def dify_elk() -> None:
"""调用 Dify 工作流 API"""
headers = {
"Authorization": f"Bearer {DIFY_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"inputs": {},
"response_mode": "blocking", # 阻塞模式
"user": "admin" # 唯一用户标识
}
try:
response = requests.post(DIFY_API_URL, headers=headers, json=payload)
response.raise_for_status()
result = response.json()
print(f"服务器响应: {json.dumps(result, indent=2, ensure_ascii=False)}")
except requests.RequestException as e:
print(f"工作流触发失败: {str(e)}")
if __name__ == "__main__":
dify_elk()
2)手动验证触发:
# 手动执行
python dify_elk.py

3)定时任务
# python环境
chmod +x /opt/dify_elk.py
python3 -m venv /opt/dify_venv
source /opt/dify_venv/bin/activate # 进入后安装相应的依赖包
# 添加定时任务
0 9 * * * /opt/dify_venv/bin/activate /opt/dify_elk.py >> /var/log/dify_elk.log 2>&1
同时也可以在Dify对应的工作流上查看历史执行记录。
三、如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】


四、为什么要学习大模型?
我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。


五、大模型入门到实战全套学习大礼包
1、大模型系统化学习路线
作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

2、大模型学习书籍&文档
学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

3、AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

4、大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

5、大模型大厂面试真题
面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

适用人群

第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

大模型日志分析DAG工作流详解
644

被折叠的 条评论
为什么被折叠?



