NextcloudLogAlert/nextcloud_log_alert.py

64 lines
2.2 KiB
Python

import requests
import json
import configparser
import os
from time import sleep
CONFIG_FILE = "/opt/nextcloud_log_alert/config.conf"
LOG_LEVELS = {0: "DEBUG", 1: "INFO", 2: "WARN", 3: "ERROR", 4: "FATAL"}
def load_config():
config = configparser.ConfigParser()
if os.path.exists(CONFIG_FILE):
config.read(CONFIG_FILE)
webhook_url = config.get("SETTINGS", "WEBHOOK_URL", fallback=None)
log_file = config.get("SETTINGS", "LOG_FILE", fallback="/home/data/nextcloud.log")
return webhook_url, log_file
return None, "/home/data/nextcloud.log"
webhook_url, LOG_FILE = load_config()
def read_logs():
try:
with open(LOG_FILE, "r") as file:
return file.readlines()
except FileNotFoundError:
return []
last_sent = set()
while True:
logs = read_logs()
for log in logs[-10:]:
try:
log_entry = json.loads(log)
log_level = log_entry.get("level", -1)
log_level_text = LOG_LEVELS.get(log_level, "UNKNOWN")
if log not in last_sent:
last_sent.add(log)
embed = {
"title": f"Nextcloud Log Alert ({log_level_text}) :bell:",
"description": log_entry.get("message", "Keine Nachricht"),
"color": 5814783 if log_level < 3 else 16711680,
"fields": [
{"name": "Log Level", "value": log_level_text, "inline": True},
{"name": "App", "value": log_entry.get("app", "Unbekannt"), "inline": True},
{"name": "URL", "value": log_entry.get("url", "Unbekannt"), "inline": False},
{"name": "User", "value": log_entry.get("user", "System"), "inline": False},
],
"timestamp": log_entry.get("time", "")
}
payload = {"embeds": [embed]}
response = requests.post(webhook_url, json=payload)
if response.status_code != 204:
print(f"Fehler beim Senden an {webhook_url}: {response.status_code}, {response.text}")
except json.JSONDecodeError:
continue
sleep(30)