作为n8n的用户,你可能已经创建了许多自动化工作流。但你是否思考过如何追踪这些工作流的运行状态?如何及时发现问题?如何确保系统安全?本教程将带你深入了解n8n的三大运维核心功能:日志管理、监控告警和安全审计。
这篇教程适合初学者,我们将通过实操案例和完整工作流代码,让你轻松上手n8n的运维管理。
日志就像是n8n实例的"日记",它记录了所有发生的事情。当工作流出错时,日志能帮你快速定位问题。
n8n提供了4个日志级别,从低到高排列:
| 日志级别 | 说明 | 使用场景 |
|---|---|---|
| error | 只显示错误信息 | 生产环境,只关心故障 |
| warn | 显示错误和警告 | 生产环境,需要提前发现问题 |
| info | 显示错误、警告和信息 | 默认级别,记录关键事件 |
| debug | 显示所有信息,最详细 | 开发环境,深度调试 |
如果你使用Docker或命令行启动n8n,设置这些环境变量:
# 设置日志级别为 info
export N8N_LOG_LEVEL=info
# 设置日志输出到文件
export N8N_LOG_OUTPUT=file
# 设置日志文件位置
export N8N_LOG_FILE_LOCATION=/data/logs/n8n.log
# 设置单个日志文件最大为 16 MB
export N8N_LOG_FILE_SIZE_MAX=16
# 设置最多保留 100 个日志文件
export N8N_LOG_FILE_COUNT_MAX=100在你的n8n配置文件中添加:
n8n:
log:
level: info
output: console,file
file:
location: /data/logs/n8n.log
fileSizeMax: 16
fileCountMax: 100N8N_LOG_LEVEL=debug 能看到最详细的信息。n8n提供了三个API端点让你监控实例的健康状态:
curl http://localhost:5678/healthz返回说明:
200 OK:实例运行正常,可以接收请求应用场景: 快速检查实例是否在线,用于负载均衡器或简单的健康检查。
curl http://localhost:5678/healthz/readiness返回说明:
200 OK:数据库已连接且迁移完成,实例可以开始处理业务应用场景: Kubernetes 的 readiness probe,或在启动其他依赖服务前进行检查。
curl http://localhost:5678/metrics注意: 需要先启用!
返回说明: 包含CPU、内存、请求数等详细指标(Prometheus 格式)
首先需要在环境变量中启用 /metrics 端点:
# 启用指标收集
export N8N_METRICS=true
# 如果使用Docker,确保这些端口开放
# 默认端口:5678 (HTTP)
# 可选指标端口:指定在 N8N_METRICS_* 变量中通过 /metrics 端点,你能获取:
安全审计能自动检查你的n8n实例中存在的5大安全风险,帮助你快速发现和修复问题。
检查您的API密钥和凭证是否存在问题:
处理建议: 删除未使用的凭证,降低被泄露的风险。
检查SQL查询中的安全隐患:
执行查询 时直接拼接的表达式(容易被SQL注入)处理建议: 使用参数化查询,避免直接拼接用户输入。
检查哪些节点会访问服务器的文件系统:
处理建议: 确认这些文件操作都是必要的,限制节点的文件访问权限。
检查使用的节点类型是否存在安全风险:
处理建议: 谨慎使用代码执行节点,仅从信任的来源安装社区节点。
检查整个实例的安全配置:
处理建议: 为Webhook添加认证,启用安全功能,定期更新n8n。
n8n audit运行后会生成一份包含所有风险的报告。
curl -X POST http://localhost:5678/rest/audit \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json"在工作流中添加 n8n 节点,选择:
然后运行工作流,会返回审计报告。
现在我们要创建一个完整可执行的工作流,它能自动检查实例健康状态、收集指标、运行安全审计,并发送报告。
定时触发 → 检查实例健康 → 检查数据库 → 收集指标 → 安全审计 → 生成报告 → 发送通知将下面的JSON代码导入到n8n中(点击"Import Workflow"):
{
"name": "n8n实例健康监控工作流",
"active": true,
"connections": {
"Schedule": {
"main": [
[
{
"node": "检查实例健康状态",
"type": "main",
"index": 0
}
]
]
},
"检查实例健康状态": {
"main": [
[
{
"node": "检查数据库准备状态",
"type": "main",
"index": 0
}
]
]
},
"检查数据库准备状态": {
"main": [
[
{
"node": "获取详细指标",
"type": "main",
"index": 0
}
]
]
},
"获取详细指标": {
"main": [
[
{
"node": "安全审计检查",
"type": "main",
"index": 0
}
]
]
},
"安全审计检查": {
"main": [
[
{
"node": "格式化报告",
"type": "main",
"index": 0
}
]
]
},
"格式化报告": {
"main": [
[
{
"node": "发送通知",
"type": "main",
"index": 0
}
]
]
}
},
"nodes": [
{
"parameters": {
"interval": 1,
"unit": "hours"
},
"id": "Schedule",
"name": "Schedule",
"type": "n8n-nodes-base.schedule",
"typeVersion": 1,
"position": [50, 100]
},
{
"parameters": {
"method": "GET",
"url": "http://localhost:5678/healthz",
"authentication": "none",
"responseFormat": "json"
},
"id": "检查实例健康状态",
"name": "检查实例健康状态",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [300, 100]
},
{
"parameters": {
"method": "GET",
"url": "http://localhost:5678/healthz/readiness",
"authentication": "none",
"responseFormat": "json"
},
"id": "检查数据库准备状态",
"name": "检查数据库准备状态",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [550, 100]
},
{
"parameters": {
"method": "GET",
"url": "http://localhost:5678/metrics",
"authentication": "none",
"responseFormat": "text"
},
"id": "获取详细指标",
"name": "获取详细指标",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [800, 100]
},
{
"parameters": {
"method": "POST",
"url": "http://localhost:5678/rest/audit",
"authentication": "genericCredentialType",
"genericCredentialType": "httpBasicAuth",
"responseFormat": "json"
},
"id": "安全审计检查",
"name": "安全审计检查",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [1050, 100],
"credentials": {
"httpBasicAuth": {
"id": "your_credential_id",
"name": "n8n_instance_auth"
}
}
},
{
"parameters": {
"functionCode": "return {\n timestamp: new Date().toISOString(),\n healthStatus: $('检查实例健康状态').$response.statusCode === 200 ? 'healthy' : 'unhealthy',\n dbReady: $('检查数据库准备状态').$response.statusCode === 200 ? 'ready' : 'not-ready',\n metricsAvailable: $('获取详细指标').$response.statusCode === 200 ? true : false,\n auditCompleted: $('安全审计检查').json.data ? true : false,\n summary: 'All monitoring checks completed successfully'\n};"
},
"id": "格式化报告",
"name": "格式化报告",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [1300, 100]
},
{
"parameters": {
"webhookUrl": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
"message": "=JSON.stringify($('格式化报告').json, null, 2)",
"method": "POST"
},
"id": "发送通知",
"name": "发送通知",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [1550, 100]
}
]
}/healthz/healthz/readiness/metrics/rest/audithttp://localhost:5678 改为你的n8n实例地址工作流运行后,你会收到类似这样的报告:
{
"timestamp": "2025-12-03T10:30:00.000Z",
"healthStatus": "healthy",
"dbReady": "ready",
"metricsAvailable": true,
"auditCompleted": true,
"summary": "All monitoring checks completed successfully"
}N8N_LOG_LEVEL=info
N8N_LOG_OUTPUT=file
N8N_LOG_FILE_SIZE_MAX=50
N8N_LOG_FILE_COUNT_MAX=30A: 不会。n8n会自动管理日志文件。当文件达到N8N_LOG_FILE_SIZE_MAX设置的大小时,会自动轮转生成新文件。当文件数达到N8N_LOG_FILE_COUNT_MAX时,会删除最旧的文件。
/metrics 端点返回404是什么原因?A: 说明指标功能未启用。需要设置环境变量 N8N_METRICS=true 并重启n8n。
A: 主要包括:
这些节点本身没有问题,但如果接收不受信任的输入会有风险。
A: 不行。n8n的日志输出是全局的,所有级别的日志都会同时输出到配置的目标(console和/或file)。
A:
N8N_METRICS=true/metrics 端点可访问(Prometheus Scrape Target)[1] 官方文档 - 日志管理: https://docs.n8n.io/hosting/logging-monitoring/logging/
[2] 官方文档 - 监控系统: https://docs.n8n.io/hosting/logging-monitoring/monitoring/
[3] 官方文档 - 安全审计: https://docs.n8n.io/hosting/securing/security-audit/
[4] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#