diff --git a/install.sh b/install.sh index a9ae9c0..51ad7a7 100755 --- a/install.sh +++ b/install.sh @@ -154,6 +154,27 @@ fi HAS_APACHE=0; { command -v apache2ctl >/dev/null 2>&1 || command -v httpd >/dev/null 2>&1; } && HAS_APACHE=1 # Apache-Logpfad ermitteln: erst explizit gesetzter Wert, dann uebliche Orte, # dann die von Apache selbst konfigurierte CustomLog-Direktive. +if [ "$HAS_APACHE" -eq 1 ] && [ -z "$APACHE_LOG" ]; then + # Erst die von Apache selbst konfigurierten Pfade — das ist die einzige + # verlaessliche Quelle. Viele Panels (KeyHelp, Plesk) setzen pro VHost eigene + # CustomLog-Pfade; der "globale" Standardpfad existiert dann oft leer, und + # ein Input darauf liefert still nichts. + _cl="$(grep -rhoE '^[[:space:]]*CustomLog[[:space:]]+(\S+|"[^"]+")' \ + /etc/apache2/ /etc/httpd/ /etc/apache2/sites-enabled/ 2>/dev/null \ + | sed -E 's/^[[:space:]]*CustomLog[[:space:]]+//; s/^"//; s/"$//' \ + | grep -v '^|' | grep -v '^/dev/' | sort -u)" + if [ -n "$_cl" ]; then + # Alle konfigurierten Pfade als Glob-Liste (Telegraf akzeptiert Listen). + _found="" + for _p in $_cl; do + # Variablen wie ${APACHE_LOG_DIR} aufloesen + _p="$(printf '%s' "$_p" | sed "s#\${APACHE_LOG_DIR}#/var/log/apache2#g; s#\${APACHE_LOG_DIR:-/var/log/apache2}#/var/log/apache2#g")" + [ -r "$_p" ] && _found="$_found $_p" + done + [ -n "$_found" ] && APACHE_LOG="$(printf '%s' "$_found" | sed 's/^ //')" + fi +fi + if [ "$HAS_APACHE" -eq 1 ] && [ -z "$APACHE_LOG" ]; then for _p in /var/log/apache2/access.log /var/log/httpd/access_log \ /var/log/apache2/other_vhosts_access.log /var/log/httpd/access.log; do @@ -178,6 +199,18 @@ if [ "$HAS_APACHE" -eq 1 ] && [ -z "$APACHE_LOG" ]; then fi [ -n "$APACHE_LOG" ] || APACHE_LOG="/var/log/apache2/access.log" fi +# APACHE_LOG kann mehrere, leerzeichengetrennte Pfade enthalten -> als +# TOML-Liste rendern. Achtung: Pfade mit Leerzeichen sind in Apache-Logs +# ungewoehnlich; wir quoten jeden Eintrag einzeln. +if [ "$HAS_APACHE" -eq 1 ]; then + APACHE_FILES="" + for _p in $APACHE_LOG; do + APACHE_FILES="${APACHE_FILES:+$APACHE_FILES, }\"$_p\"" + done + [ -n "$APACHE_FILES" ] || APACHE_FILES='"/var/log/apache2/access.log"' + APACHE_FILES="[$APACHE_FILES]" + export APACHE_FILES +fi if [ "$ROLE" = "auto" ]; then ROLE="none" [ "$IS_PVE" -eq 1 ] && ROLE="proxmox" @@ -346,9 +379,9 @@ fetch_conf() { fetch "$1" "$2.tmp" set -a; [ -r /etc/default/telegraf ] && . /etc/default/telegraf; set +a if command -v envsubst >/dev/null; then - envsubst '${NODE_NAME} ${PROM_URL} ${LOKI_URL} ${TELEGRAF_TOKEN} ${PVE_TOKEN} ${PVE_NODE} ${PVE_URL} ${APACHE_LOG}' < "$2.tmp" > "$2" + envsubst '${NODE_NAME} ${PROM_URL} ${LOKI_URL} ${TELEGRAF_TOKEN} ${PVE_TOKEN} ${PVE_NODE} ${PVE_URL} ${APACHE_LOG} ${APACHE_FILES}' < "$2.tmp" > "$2" else - subst_vars "$2.tmp" "$2" NODE_NAME PROM_URL LOKI_URL TELEGRAF_TOKEN PVE_TOKEN PVE_NODE PVE_URL APACHE_LOG + subst_vars "$2.tmp" "$2" NODE_NAME PROM_URL LOKI_URL TELEGRAF_TOKEN PVE_TOKEN PVE_NODE PVE_URL APACHE_LOG APACHE_FILES fi if grep -q '\${' "$2"; then log "WARNUNG: $2 enthaelt noch unaufgeloeste Platzhalter:" diff --git a/telegraf/apache.conf b/telegraf/apache.conf index e0f285d..97d72bb 100644 --- a/telegraf/apache.conf +++ b/telegraf/apache.conf @@ -18,8 +18,12 @@ # -------------------------------------------------------------------------- # 1) Roh-Logs → Loki # -------------------------------------------------------------------------- +# ${APACHE_FILES} rendert zu einer echten TOML-Liste — der Installer baut sie +# aus allen gefundenen Logpfaden (Panel-Hoster haben pro VHost eigene Dateien). +# Ein einzelner String mit Leerzeichen ("/a.log /b.log") waere ein ungueltiger +# Pfad und der Input liefe still leer. [[inputs.tail]] - files = ["${APACHE_LOG}"] + files = ${APACHE_FILES} name_override = "journal" # Beim Erstanlauf nur Neues lesen; danach Position merken. initial_read_offset = "saved-or-end" @@ -46,7 +50,7 @@ # VHost-Apache (Debian-Default) stellt den Hostnamen voran: # example.com:80 127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] "GET / HTTP/1.0" 200 2326 [[inputs.tail]] - files = ["${APACHE_LOG}"] + files = ${APACHE_FILES} name_override = "apache_access" initial_read_offset = "saved-or-end" data_format = "grok"