エラーを記録し、メールの発送回数を過剰に増やさない
上級
これはEngineering, AI, IT Ops分野の自動化ワークフローで、16個のノードを含みます。主にIf, Code, Postgres, Pushover, EmailSendなどのノードを使用、AI技術を活用したスマート自動化を実現。 PostgreSQL ログ記録とレート制限通知付きエラーハンドリングシステム
前提条件
- •PostgreSQLデータベース接続情報
使用ノード (16)
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
"id": "YybYYc430rmZWJPJ",
"meta": {
"instanceId": "febfa0961d1e55a48938f0337f348b73a50538aa16673607611ead85d95f662c",
"templateCredsSetupCompleted": true
},
"name": "Log errors and avoid sending too many emails",
"tags": [
{
"id": "7YoU4oTsaGGEtWJj",
"name": "sample",
"createdAt": "2025-01-31T16:41:27.407Z",
"updatedAt": "2025-01-31T16:41:27.407Z"
}
],
"nodes": [
{
"id": "0e44df4c-00d2-4545-89ae-844a590de369",
"name": "エラートリガー",
"type": "n8n-nodes-base.errorTrigger",
"position": [
-1180,
40
],
"parameters": {},
"typeVersion": 1
},
{
"id": "7101542a-5146-4917-a1f2-13686cad197e",
"name": "ログ挿入",
"type": "n8n-nodes-base.postgres",
"position": [
-960,
-10
],
"parameters": {
"table": {
"__rl": true,
"mode": "list",
"value": "N8Err",
"cachedResultName": "N8Err"
},
"schema": {
"__rl": true,
"mode": "name",
"value": "p1gq6ljdsam3x1m"
},
"columns": {
"value": {
"URL": "={{ $json.execution.url }}",
"json": "={{ JSON.stringify($json) }}",
"Stack": "={{ $json.execution.error.stack }}",
"title": "={{ $json.workflow.name }}",
"Message": "={{ $json.execution.error.message }}",
"LastNode": "={{ $json.execution.lastNodeExecuted }}",
"created_at": "={{ $now }}"
},
"schema": [
{
"id": "id",
"type": "number",
"display": true,
"removed": true,
"required": false,
"displayName": "id",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "created_at",
"type": "dateTime",
"display": true,
"required": false,
"displayName": "created_at",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "updated_at",
"type": "dateTime",
"display": true,
"removed": true,
"required": false,
"displayName": "updated_at",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "created_by",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "created_by",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "updated_by",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "updated_by",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "nc_order",
"type": "number",
"display": true,
"removed": true,
"required": false,
"displayName": "nc_order",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "title",
"type": "string",
"display": true,
"required": false,
"displayName": "title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "URL",
"type": "string",
"display": true,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Stack",
"type": "string",
"display": true,
"required": false,
"displayName": "Stack",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "json",
"type": "object",
"display": true,
"required": false,
"displayName": "json",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Message",
"type": "string",
"display": true,
"required": false,
"displayName": "Message",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "LastNode",
"type": "string",
"display": true,
"required": false,
"displayName": "LastNode",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"credentials": {
"postgres": {
"id": "2VsRB7eDnG0FA3z2",
"name": "Postgres Nocodb"
}
},
"typeVersion": 2.6
},
{
"id": "8fb1201c-353e-466c-8d08-fd969e6b10b1",
"name": "5分間カウント",
"type": "n8n-nodes-base.postgres",
"position": [
-960,
-210
],
"parameters": {
"query": "SELECT count(*) FROM p1gq6ljdsam3x1m.\"N8Err\" where created_at >= $1;\n",
"options": {
"queryReplacement": "={{ $now.minus(5, 'minutes').toString() }}"
},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "2VsRB7eDnG0FA3z2",
"name": "Postgres Nocodb"
}
},
"typeVersion": 2.6
},
{
"id": "89f836dc-8141-4c20-a758-bf7ff261a87b",
"name": "付箋",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2260,
-300
],
"parameters": {
"color": 5,
"width": 820,
"height": 1140,
"content": "# Log errors and avoid sending too many emails\n\n## Use case\n\nMost of the time, it’s necessary to log all errors that occur. However, in some cases, a scheduled task or service consuming excessive resources might trigger a surge of errors.\n\nTo address this, we can log all errors but limit alerts to a maximum of one notification every 5 minutes.\n\n## What this workflow does\n\nThis workflow can be configured to receive error events, or you can integrate it **before your own error-handling logic.** \n\nIf used as the **primary error handler**, note that this flow will **only add a database log entry** and take no further action. You’ll need to add your own alerts (e.g., email or push notifications). Below is an example of a notification setup I prefer to use. \n\nAt the end, there’s an **error cleanup** option. This feature is particularly useful in development environments. \n\nIf you already have an error-handling workflow, you can call this one as a **sub-workflow**. Its final steps include cleanup logic to reset the execution state and terminate the workflow.\n\n## Setup\n\n**Verify all Postgres nodes and credentials when using the 'Error Handling Sample'**\n\n## How to adjust it to your needs\n\n1) You can set this workflow as a sub-workflow within your existing error-handling setup.\n\n2) Alternatively, you can add the \"Error Handling Sample\" at the end of this workflow, which sends email and push notifications.\n\nConfiguration Requirements:\n\n⚠️ You must create a database table for this to work!\n\n\n\nDDL of this sample:\n\ncreate table p1gq6ljdsam3x1m.\"N8Err\"\n(\n id serial\n primary key,\n created_at timestamp,\n updated_at timestamp,\n created_by varchar,\n updated_by varchar,\n nc_order numeric,\n title text,\n \"URL\" text,\n \"Stack\" text,\n json json,\n \"Message\" text,\n \"LastNode\" text\n);\n\nalter table p1gq6ljdsam3x1m.\"N8Err\"\n owner to postgres;\n\ncreate index \"N8Err_order_idx\"\n on p1gq6ljdsam3x1m.\"N8Err\" (nc_order);\n\nby Davi Saranszky Mesquita\nhttps://www.linkedin.com/in/mesquitadavi/"
},
"typeVersion": 1
},
{
"id": "fba7fec5-5285-46bd-9cc7-270b7dcc8c5f",
"name": "主メール",
"type": "n8n-nodes-base.emailSend",
"onError": "continueErrorOutput",
"disabled": true,
"position": [
-960,
300
],
"webhookId": "d76d2e82-b0a8-4e35-88f9-1815d4ce6c79",
"parameters": {
"text": "={{ $(\"Error Trigger\").item.json.execution.url }}\n\n{{ $(\"Error Trigger\").item.json.execution.lastNodeExecuted }}\n\n{{ $(\"Error Trigger\").item.json.execution.error.message }}\n{{ $(\"Error Trigger\").item.json.execution.error.stack }}",
"options": {
"appendAttribution": false
},
"subject": "=Erro - {{ $(\"Error Trigger\").item.json.workflow.name }}",
"toEmail": "davimesquita@gmail.com",
"fromEmail": "suporte@ideias.casa",
"emailFormat": "text"
},
"credentials": {
"smtp": {
"id": "0YIoKeISQNR2kxwO",
"name": "SMTP Resent"
}
},
"typeVersion": 2.1
},
{
"id": "979d0e82-42e8-450a-95b1-3c204ad61a50",
"name": "代替メール",
"type": "n8n-nodes-base.emailSend",
"disabled": true,
"position": [
-740,
300
],
"webhookId": "d76d2e82-b0a8-4e35-88f9-1815d4ce6c79",
"parameters": {
"text": "={{ $(\"Error Trigger\").item.json.execution.url }}\n\n{{ $(\"Error Trigger\").item.json.execution.lastNodeExecuted }}\n\n{{ $(\"Error Trigger\").item.json.execution.error.message }}\n{{ $(\"Error Trigger\").item.json.execution.error.stack }}",
"options": {
"appendAttribution": false
},
"subject": "=Erro - {{ $(\"Error Trigger\").item.json.workflow.name }}",
"toEmail": "davimesquita@gmail.com",
"fromEmail": "contato@ideias.casa",
"emailFormat": "text"
},
"credentials": {
"smtp": {
"id": "UvWloRL7Jyqt8tm9",
"name": "SMTP Contato"
}
},
"typeVersion": 2.1
},
{
"id": "6c073c03-e00e-45b1-8f14-faa29fd58472",
"name": "モバイルプッシュ通知",
"type": "n8n-nodes-base.pushover",
"disabled": true,
"position": [
-960,
500
],
"parameters": {
"message": "={{ $(\"Error Trigger\").item.json.workflow.name }} - {{ $(\"Error Trigger\").item.json.execution.url }}\n\n{{ $(\"Error Trigger\").item.json.execution.lastNodeExecuted }}\n\n{{ $(\"Error Trigger\").item.json.execution.error.message }}\n{{ $(\"Error Trigger\").item.json.execution.error.stack }}",
"userKey": "=u4RMqXQR9EFdeSQBfaL1riBy1Qd953",
"additionalFields": {}
},
"credentials": {
"pushoverApi": {
"id": "ae8Jsj87n2hSWDbs",
"name": "Pushover account"
}
},
"typeVersion": 1
},
{
"id": "4ca939e4-dcb1-40bd-b5eb-4cd00cb403fb",
"name": "ログデータベース切り詰め",
"type": "n8n-nodes-base.postgres",
"position": [
-960,
900
],
"parameters": {
"table": {
"__rl": true,
"mode": "list",
"value": "N8Err",
"cachedResultName": "N8Err"
},
"schema": {
"__rl": true,
"mode": "list",
"value": "p1gq6ljdsam3x1m",
"cachedResultName": "p1gq6ljdsam3x1m"
},
"options": {},
"operation": "deleteTable",
"restartSequences": true
},
"credentials": {
"postgres": {
"id": "2VsRB7eDnG0FA3z2",
"name": "Postgres Nocodb"
}
},
"typeVersion": 2.6
},
{
"id": "1eaf67ca-fb77-4b76-8ee3-ae65d4b79182",
"name": "時々...単にクリーンアップ",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1200,
900
],
"parameters": {},
"typeVersion": 1
},
{
"id": "01e5a7dd-41a2-43f1-bbf5-241e6791cf18",
"name": "このサンプルを呼び出し - エラーキャッチャーに前置",
"type": "n8n-nodes-base.executeWorkflow",
"disabled": true,
"position": [
-1180,
400
],
"parameters": {
"options": {},
"workflowId": {
"__rl": true,
"mode": "id",
"value": ""
}
},
"typeVersion": 1.2
},
{
"id": "4386788d-5f10-468a-8a02-cff45a4a7ed5",
"name": "エラー処理時にこれを前置するには以下を参照",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"position": [
-1180,
-260
],
"parameters": {
"inputSource": "passthrough"
},
"typeVersion": 1.1
},
{
"id": "d6aed974-4a36-4edd-809d-867a95d0f6ef",
"name": "5分間ログがない場合",
"type": "n8n-nodes-base.if",
"position": [
-740,
-210
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "a17b915d-f581-4774-a78a-48bc386aebc9",
"operator": {
"type": "number",
"operation": "lte"
},
"leftValue": "={{ $json.count }}",
"rightValue": 0
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "3c49f611-f1a6-409a-a4c6-903dadb27165",
"name": "クリーンアップ実行。このワークフローを前置する場合は以下を参照",
"type": "n8n-nodes-base.code",
"position": [
-520,
-210
],
"parameters": {
"jsCode": "return [];"
},
"typeVersion": 2
},
{
"id": "192443fc-c032-4815-acc7-c8cf6040cc34",
"name": "この後にエラー処理ロジックを挿入",
"type": "n8n-nodes-base.noOp",
"position": [
-300,
-210
],
"parameters": {},
"typeVersion": 1
},
{
"id": "2f87907f-816f-4054-8517-bb713a203131",
"name": "付箋1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1300,
240
],
"parameters": {
"width": 840,
"height": 460,
"content": "# Error handling sample\n"
},
"typeVersion": 1
},
{
"id": "b173898f-d1d8-4f83-b7b7-ba52cab7651e",
"name": "付箋2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1300,
720
],
"parameters": {
"width": 1140,
"height": 340,
"content": "# Database Cleanup: Useful in DEV, but DO NOT run in production"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {
"Error Trigger": [
{
"json": {
"workflow": {
"id": "1",
"name": "Example Workflow"
},
"execution": {
"id": 231,
"url": "https://work.ideias.casa/execution/workflow/1/231",
"mode": "manual",
"error": {
"stack": "Stacktrace",
"message": "Example Error Message"
},
"retryOf": "34",
"lastNodeExecuted": "Node With Error"
}
}
}
]
},
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"executionOrder": "v1",
"saveManualExecutions": false,
"saveExecutionProgress": false,
"saveDataErrorExecution": "all",
"saveDataSuccessExecution": "none"
},
"versionId": "f5e80ccb-c64f-47bd-89a6-55cf3e85a572",
"connections": {
"7101542a-5146-4917-a1f2-13686cad197e": {
"main": [
[]
]
},
"0e44df4c-00d2-4545-89ae-844a590de369": {
"main": [
[
{
"node": "7101542a-5146-4917-a1f2-13686cad197e",
"type": "main",
"index": 0
},
{
"node": "8fb1201c-353e-466c-8d08-fd969e6b10b1",
"type": "main",
"index": 0
}
]
]
},
"fba7fec5-5285-46bd-9cc7-270b7dcc8c5f": {
"main": [
[],
[
{
"node": "979d0e82-42e8-450a-95b1-3c204ad61a50",
"type": "main",
"index": 0
}
]
]
},
"8fb1201c-353e-466c-8d08-fd969e6b10b1": {
"main": [
[
{
"node": "d6aed974-4a36-4edd-809d-867a95d0f6ef",
"type": "main",
"index": 0
}
]
]
},
"1eaf67ca-fb77-4b76-8ee3-ae65d4b79182": {
"main": [
[
{
"node": "4ca939e4-dcb1-40bd-b5eb-4cd00cb403fb",
"type": "main",
"index": 0
}
]
]
},
"d6aed974-4a36-4edd-809d-867a95d0f6ef": {
"main": [
[],
[
{
"node": "3c49f611-f1a6-409a-a4c6-903dadb27165",
"type": "main",
"index": 0
}
]
]
},
"01e5a7dd-41a2-43f1-bbf5-241e6791cf18": {
"main": [
[
{
"node": "fba7fec5-5285-46bd-9cc7-270b7dcc8c5f",
"type": "main",
"index": 0
},
{
"node": "6c073c03-e00e-45b1-8f14-faa29fd58472",
"type": "main",
"index": 0
}
]
]
},
"4386788d-5f10-468a-8a02-cff45a4a7ed5": {
"main": [
[
{
"node": "7101542a-5146-4917-a1f2-13686cad197e",
"type": "main",
"index": 0
},
{
"node": "8fb1201c-353e-466c-8d08-fd969e6b10b1",
"type": "main",
"index": 0
}
]
]
},
"3c49f611-f1a6-409a-a4c6-903dadb27165": {
"main": [
[
{
"node": "192443fc-c032-4815-acc7-c8cf6040cc34",
"type": "main",
"index": 0
}
]
]
}
}
}よくある質問
このワークフローの使い方は?
上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。
このワークフローはどんな場面に適していますか?
上級 - エンジニアリング, 人工知能, IT運用
有料ですか?
このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。
関連ワークフロー
APIアーキテクチャ抽出ツール
APIアーキテクチャ抽出器
If
Set
Code
+
If
Set
Code
88 ノードPolina Medvedieva
エンジニアリング
Discord のスパムを自動審査
AI とヒューマンチェックを組み合わせた自動 Discord スパム審査
If
Set
Code
+
If
Set
Code
30 ノードJimleuk
人工知能
RedisとGPT-4に基づく効率のなメッセージバッファリングシステム
RedisとGPT-4に基づく効率のなメッセージバッファリングシステム
If
Set
Code
+
If
Set
Code
30 ノードEdisson Garcia
エンジニアリング
🤖 高度な Slackbot(n8n)
🤖 高度な Slackbot(n8n)
If
Set
Code
+
If
Set
Code
34 ノードMutasem
エンジニアリング
ComfyUI を使用して AI メディアの生成:画像、動画、3D、オーディオ橋渡し
ComfyUI を使って AI メディアを生成する:画像、動画、3D、オーディオ連携
If
Set
Code
+
If
Set
Code
51 ノードNielo
デザイン
待機ノード付きの長時間実行ワークフロー状態管理システム
待機ノード付きの長時間実行ワークフロー状態管理システム
If
Set
Code
+
If
Set
Code
42 ノードLucas Peyrin
エンジニアリング