commit 3deb05dc7d4ff85347446ba950a2ab9a15e23b03 Author: Gilles Mouchet Date: Sat May 31 13:05:15 2025 +0200 from chatgpt diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b3ee43d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "editor.fontSize": 13, + "terminal.integrated.fontSize": 13, + "window.zoomLevel": 1.4, +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..dcb83ea --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM bash:5.2 + +WORKDIR /app +COPY fake_logs.sh . +RUN chmod +x fake_logs.sh + +CMD ["./fake_logs.sh", "100", "json"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..e226537 --- /dev/null +++ b/README.md @@ -0,0 +1,770 @@ +# đŸ§Ș Fake Log Generator for Loki + +Ce projet gĂ©nĂšre de faux logs rĂ©alistes dans plusieurs formats (`apache`, `json`, `ltsv`, `custom`) et les envoie Ă  Grafana Loki via Promtail. + +## 🔧 DĂ©marrage rapide + +```bash +docker compose up -d +./fake_logs.sh 0 json --loop >> logs/access.log +``` + +## 🔗 AccĂšs + +- Grafana : http://localhost:3000 (admin / admin) +- Loki : http://localhost:3100 + +## 🔍 RequĂȘte exemple (Grafana Explore) + +```logql +{job="fake_logs"} +``` + +## 📩 Contenu + +- `fake_logs.sh` : gĂ©nĂ©rateur de logs +- `promtail-config.yml` : config pour envoyer vers Loki +- `docker-compose.yml` : stack Loki + Promtail + Grafana + + + +FROM AI +Exemple de script Bash : fake_logs.sh +#!/bin/bash + +# Nombre de lignes de log Ă  gĂ©nĂ©rer (par dĂ©faut : 100) +LINES=${1:-100} + +# Listes de donnĂ©es factices +METHODS=("GET" "POST" "PUT" "DELETE" "PATCH") +PATHS=("/" "/login" "/dashboard" "/api/data" "/settings" "/products" "/checkout") +CODES=(200 201 204 301 302 400 401 403 404 500 503) +AGENTS=( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" + "curl/7.68.0" + "PostmanRuntime/7.29.0" + "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X)" +) + +# Fonction pour gĂ©nĂ©rer une IP alĂ©atoire +random_ip() { + echo "$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256))" +} + +# Fonction pour gĂ©nĂ©rer une date au format Apache +random_date() { + date -d "$((RANDOM % 30 + 1)) days ago" "+%d/%b/%Y:%H:%M:%S %z" +} + +# Boucle de gĂ©nĂ©ration de log +for ((i=0; i access.log +(Cela gĂ©nĂ©rera 500 lignes de logs dans un fichier access.log) +🔄 Exemple de sortie : +92.123.44.222 - - [15/May/2025:14:23:01 +0000] "GET /api/data HTTP/1.1" 200 3412 "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" +14.56.222.1 - - [10/May/2025:18:43:51 +0000] "POST /login HTTP/1.1" 401 834 "curl/7.68.0" +Souhaites-tu qu’on ajoute la prise en charge de plusieurs formats de log (JSON, Apache, LTSV, etc.) comme le fait flog ? + + +Vous avez dit : +oui +ChatGPT a dit : +Parfait ! Voici une version Ă©tendue du script Bash fake_logs.sh qui permet de gĂ©nĂ©rer des logs en plusieurs formats comme le fait mingrammer/flog : apache, json, ltsv, ou custom. + +✅ Script Bash : fake_logs.sh (multi-formats) + +#!/bin/bash + +# Nombre de lignes Ă  gĂ©nĂ©rer +LINES=${1:-100} +FORMAT=${2:-apache} # apache | json | ltsv | custom + +METHODS=("GET" "POST" "PUT" "DELETE" "PATCH") +PATHS=("/" "/login" "/dashboard" "/api/data" "/settings" "/products" "/checkout") +CODES=(200 201 204 301 302 400 401 403 404 500 503) +AGENTS=( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" + "curl/7.68.0" + "PostmanRuntime/7.29.0" + "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X)" +) + +random_ip() { + echo "$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256))" +} + +random_date() { + date -d "$((RANDOM % 30 + 1)) days ago" "+%d/%b/%Y:%H:%M:%S %z" +} + +iso_date() { + date -d "$((RANDOM % 30 + 1)) days ago" --iso-8601=seconds +} + +# Fonction principale de gĂ©nĂ©ration de logs +generate_log() { + IP=$(random_ip) + DATE=$(random_date) + ISO_DATE=$(iso_date) + METHOD=${METHODS[$RANDOM % ${#METHODS[@]}]} + PATH=${PATHS[$RANDOM % ${#PATHS[@]}]} + CODE=${CODES[$RANDOM % ${#CODES[@]}]} + SIZE=$((RANDOM % 5000 + 200)) + AGENT=${AGENTS[$RANDOM % ${#AGENTS[@]}]} + + case "$FORMAT" in + apache) + echo "$IP - - [$DATE] \"$METHOD $PATH HTTP/1.1\" $CODE $SIZE \"$AGENT\"" + ;; + json) + echo "{\"ip\":\"$IP\",\"timestamp\":\"$ISO_DATE\",\"method\":\"$METHOD\",\"path\":\"$PATH\",\"code\":$CODE,\"size\":$SIZE,\"agent\":\"$AGENT\"}" + ;; + ltsv) + echo "host:$IP\ttime:$ISO_DATE\tmethod:$METHOD\tpath:$PATH\tstatus:$CODE\tsize:$SIZE\tagent:$AGENT" + ;; + custom) + echo "[$ISO_DATE] $IP | $METHOD $PATH => $CODE ($SIZE bytes)" + ;; + *) + echo "Format inconnu : $FORMAT" >&2 + exit 1 + ;; + esac +} + +# Boucle de gĂ©nĂ©ration +for ((i=0; i logs.json +đŸ§Ș Exemples + +Format apache +173.29.44.102 - - [17/May/2025:12:04:10 +0000] "GET /dashboard HTTP/1.1" 200 2641 "curl/7.68.0" +Format json +{"ip":"244.51.138.41","timestamp":"2025-05-06T13:32:01+00:00","method":"POST","path":"/login","code":403,"size":876,"agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X)"} +Format ltsv +host:201.34.118.72 time:2025-05-22T08:17:14+00:00 method:GET path:/api/data status:200 size:2123 agent:PostmanRuntime/7.29.0 +Format custom +[2025-05-14T07:10:33+00:00] 102.144.33.111 | PUT /checkout => 201 (4321 bytes) +Souhaites-tu que j'ajoute aussi : + +la gĂ©nĂ©ration en continu (mode --loop) +des logs dans des fichiers sĂ©parĂ©s (erreur/access) +une version DockerisĂ©e ? +Je peux aussi Ă©crire une version Python plus puissante si tu veux aller plus loin. + +Vous avez dit : +Souhaites-tu que j'ajoute aussi : + +la gĂ©nĂ©ration en continu (mode --loop) +des logs dans des fichiers sĂ©parĂ©s (erreur/access) +une version DockerisĂ©e ? oui +ChatGPT a dit : +Parfait ! Voici une version complĂšte de fake_logs.sh avec gĂ©nĂ©ration continue (--loop), fichiers sĂ©parĂ©s (access.log / error.log), et image Docker. + +📜 Script Bash complet : fake_logs.sh + +#!/bin/bash + +# Nombre de lignes par dĂ©faut +LINES=${1:-100} +FORMAT=${2:-apache} +MODE=$3 + +METHODS=("GET" "POST" "PUT" "DELETE" "PATCH") +PATHS=("/" "/login" "/dashboard" "/api/data" "/settings" "/products" "/checkout") +CODES_OK=(200 201 204 301 302) +CODES_ERR=(400 401 403 404 500 503) +AGENTS=( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" + "curl/7.68.0" + "PostmanRuntime/7.29.0" + "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X)" +) + +random_ip() { + echo "$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256))" +} + +random_date() { + date "+%d/%b/%Y:%H:%M:%S %z" +} + +iso_date() { + date --iso-8601=seconds +} + +generate_log() { + IP=$(random_ip) + DATE=$(random_date) + ISO_DATE=$(iso_date) + METHOD=${METHODS[$RANDOM % ${#METHODS[@]}]} + PATH=${PATHS[$RANDOM % ${#PATHS[@]}]} + AGENT=${AGENTS[$RANDOM % ${#AGENTS[@]}]} + SIZE=$((RANDOM % 5000 + 200)) + + # Choix entre code OK ou erreur (20% erreurs) + if (( RANDOM % 10 < 2 )); then + CODE=${CODES_ERR[$RANDOM % ${#CODES_ERR[@]}]} + FILE="error.log" + else + CODE=${CODES_OK[$RANDOM % ${#CODES_OK[@]}]} + FILE="access.log" + fi + + case "$FORMAT" in + apache) + LOG="$IP - - [$DATE] \"$METHOD $PATH HTTP/1.1\" $CODE $SIZE \"$AGENT\"" + ;; + json) + LOG="{\"ip\":\"$IP\",\"timestamp\":\"$ISO_DATE\",\"method\":\"$METHOD\",\"path\":\"$PATH\",\"code\":$CODE,\"size\":$SIZE,\"agent\":\"$AGENT\"}" + ;; + ltsv) + LOG="host:$IP time:$ISO_DATE method:$METHOD path:$PATH status:$CODE size:$SIZE agent:$AGENT" + ;; + custom) + LOG="[$ISO_DATE] $IP | $METHOD $PATH => $CODE ($SIZE bytes)" + ;; + *) + echo "Format inconnu : $FORMAT" >&2 + exit 1 + ;; + esac + + echo "$LOG" >> "$FILE" + echo "$LOG" +} + +# Fonction de gĂ©nĂ©ration continue +generate_loop() { + while true; do + generate_log + sleep 0.5 + done +} + +# ExĂ©cution +if [[ "$MODE" == "--loop" ]]; then + generate_loop +else + for ((i=0; i [Promtail] --> [Loki] --> [Grafana] +✅ Étapes + +1. ⚙ Lancer une stack Loki + Grafana + Promtail via Docker Compose +CrĂ©e un fichier docker-compose.yml : + +version: '3.7' + +services: + loki: + image: grafana/loki:2.9.4 + ports: + - "3100:3100" + command: -config.file=/etc/loki/local-config.yaml + + promtail: + image: grafana/promtail:2.9.4 + volumes: + - ./logs:/var/log/fake + - ./promtail-config.yml:/etc/promtail/promtail.yml + command: -config.file=/etc/promtail/promtail.yml + + grafana: + image: grafana/grafana:10.2.0 + ports: + - "3000:3000" + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + volumes: + - grafana-storage:/var/lib/grafana + +volumes: + grafana-storage: +2. 📝 Fichier promtail-config.yml +server: + http_listen_port: 9080 + grpc_listen_port: 0 + +positions: + filename: /tmp/positions.yaml + +clients: + - url: http://loki:3100/loki/api/v1/push + +scrape_configs: + - job_name: fake_logs + static_configs: + - targets: + - localhost + labels: + job: fake_logs + __path__: /var/log/fake/*.log +Ce fichier dit Ă  Promtail de lire les fichiers dans ./logs/*.log et de les pousser vers Loki. + +3. 🚀 Lancer la stack +docker compose up -d +Grafana sera sur http://localhost:3000 (login: admin / admin) +Loki sur port 3100 +Promtail lit les fichiers dans ./logs +4. 🛠 Lancer ton script fake_logs.sh +Assure-toi que les logs sont bien Ă©crits dans ./logs/ : +mkdir -p logs +./fake_logs.sh 100 json > logs/access.log +./fake_logs.sh 50 json > logs/error.log +Ou en continu : +./fake_logs.sh 0 json --loop >> logs/access.log +Tu peux aussi Dockeriser la gĂ©nĂ©ration de logs : +Monte ./logs comme volume dans le conteneur du gĂ©nĂ©rateur. +5. 📊 Visualiser dans Grafana +Va dans Grafana : http://localhost:3000 +Ajoute Loki comme source de donnĂ©es : +URL : http://loki:3100 +Va dans Explore +ExĂ©cute une requĂȘte comme : +{job="fake_logs"} +Tu verras tous les logs poussĂ©s par Promtail ! + +🔁 Automatiser tout ça (bonus) + +Tu peux crĂ©er un Dockerfile pour fake_logs.sh comme gĂ©nĂ©rateur, et l’exĂ©cuter dans le mĂȘme rĂ©seau que Promtail/Loki, pour simuler une vraie application. + +✅ RĂ©sumĂ© + +Composant RĂŽle +fake_logs.sh GĂ©nĂšre des logs rĂ©alistes +Promtail Lit les fichiers .log et les envoie Ă  Loki +Loki Stocke et indexe les logs +Grafana Visualise et interroge les logs +Souhaites-tu un repo GitHub prĂȘt Ă  cloner avec tout ça dedans ? Je peux te gĂ©nĂ©rer une structure complĂšte immĂ©diatement. + +Vous avez dit : +oui mais sur https://gitweb.dyndns.org +ChatGPT a dit : +Merci pour la prĂ©cision ! + +🚧 Contexte +https://gitweb.dyndns.org semble ĂȘtre un serveur Git auto-hĂ©bergĂ© utilisant GitWeb. Ce type d'interface web ne permet pas directement de pousser des dĂ©pĂŽts, comme le fait GitHub ou GitLab. Au lieu de cela, tu dois : + +CrĂ©er un dĂ©pĂŽt Git sur ton serveur +Pousser ton projet localement ou via SSH +Ensuite, GitWeb affichera le contenu automatiquement +🛠 Étapes pour dĂ©ployer ton projet sur gitweb.dyndns.org + +✅ 1. PrĂ©pare le projet en local +Structure du projet : + +fake-log-generator/ +├── fake_logs.sh +├── logs/ # (vides, ignorĂ©s) +├── Dockerfile +├── promtail-config.yml +├── docker-compose.yml +└── .gitignore +.gitignore + +logs/ +*.log +Initialise Git : + +cd fake-log-generator +git init +git add . +git commit -m "Initial commit of fake log generator for Loki" +✅ 2. Connecte-toi Ă  ton serveur Git +Si ton serveur GitWeb est bien configurĂ© en tant que serveur Git SSH, il te faut une ligne comme : + +git remote add origin ssh://user@gitweb.dyndns.org:/srv/git/fake-log-generator.git +Ou si tu utilises git-shell : + +git remote add origin user@gitweb.dyndns.org:fake-log-generator.git +✅ 3. Pousse ton projet +git push -u origin master +⚠ VĂ©rifie que tu as bien les droits en Ă©criture sur le rĂ©pertoire Git distant (/srv/git/
). +✅ 4. Configure GitWeb (si pas dĂ©jĂ  fait) +Assure-toi que : + +Ton dĂ©pĂŽt est bien placĂ© dans le rĂ©pertoire lu par GitWeb (souvent /srv/git/) +Le fichier description existe : +echo "Fake log generator for Loki" > /srv/git/fake-log-generator.git/description +Le dĂ©pĂŽt est en mode bare : +git init --bare /srv/git/fake-log-generator.git +✅ Bonus : contenu complet prĂȘt Ă  copier + +Souhaites-tu que je te gĂ©nĂšre un .zip de ce projet prĂȘt Ă  envoyer, ou que je t’affiche le contenu de chaque fichier ici pour que tu le copies facilement ? + +Je peux aussi t’aider Ă  : + +Automatiser les tests via GitHub Actions ou autre +GĂ©nĂ©rer un tag/version +Ajouter un README.md avec les instructions +Souhaites-tu tout ça ? + +Vous avez dit : +oui +ChatGPT a dit : +Parfait ! Voici le projet complet du gĂ©nĂ©rateur de logs pour Loki, prĂȘt Ă  ĂȘtre copiĂ© et poussĂ© sur ton dĂ©pĂŽt GitWeb (gitweb.dyndns.org). + +📁 Structure du projet : fake-log-generator + +fake-log-generator/ +├── fake_logs.sh +├── docker-compose.yml +├── Dockerfile +├── promtail-config.yml +├── .gitignore +└── README.md +📜 1. fake_logs.sh + +#!/bin/bash + +LINES=${1:-100} +FORMAT=${2:-apache} +MODE=$3 + +METHODS=("GET" "POST" "PUT" "DELETE" "PATCH") +PATHS=("/" "/login" "/dashboard" "/api/data" "/settings" "/products" "/checkout") +CODES_OK=(200 201 204 301 302) +CODES_ERR=(400 401 403 404 500 503) +AGENTS=( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" + "curl/7.68.0" + "PostmanRuntime/7.29.0" + "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X)" +) + +mkdir -p logs + +random_ip() { + echo "$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256))" +} + +random_date() { + date "+%d/%b/%Y:%H:%M:%S %z" +} + +iso_date() { + date --iso-8601=seconds +} + +generate_log() { + IP=$(random_ip) + DATE=$(random_date) + ISO_DATE=$(iso_date) + METHOD=${METHODS[$RANDOM % ${#METHODS[@]}]} + PATH=${PATHS[$RANDOM % ${#PATHS[@]}]} + AGENT=${AGENTS[$RANDOM % ${#AGENTS[@]}]} + SIZE=$((RANDOM % 5000 + 200)) + + if (( RANDOM % 10 < 2 )); then + CODE=${CODES_ERR[$RANDOM % ${#CODES_ERR[@]}]} + FILE="logs/error.log" + else + CODE=${CODES_OK[$RANDOM % ${#CODES_OK[@]}]} + FILE="logs/access.log" + fi + + case "$FORMAT" in + apache) + LOG="$IP - - [$DATE] \"$METHOD $PATH HTTP/1.1\" $CODE $SIZE \"$AGENT\"" + ;; + json) + LOG="{\"ip\":\"$IP\",\"timestamp\":\"$ISO_DATE\",\"method\":\"$METHOD\",\"path\":\"$PATH\",\"code\":$CODE,\"size\":$SIZE,\"agent\":\"$AGENT\"}" + ;; + ltsv) + LOG="host:$IP time:$ISO_DATE method:$METHOD path:$PATH status:$CODE size:$SIZE agent:$AGENT" + ;; + custom) + LOG="[$ISO_DATE] $IP | $METHOD $PATH => $CODE ($SIZE bytes)" + ;; + *) + echo "Format inconnu : $FORMAT" >&2 + exit 1 + ;; + esac + + echo "$LOG" >> "$FILE" + echo "$LOG" +} + +if [[ "$MODE" == "--loop" ]]; then + while true; do + generate_log + sleep 0.5 + done +else + for ((i=0; i> logs/access.log +🔗 AccĂšs + +Grafana : http://localhost:3000 (admin / admin) +Loki : http://localhost:3100 +🔍 RequĂȘte exemple (Grafana Explore) + +{job="fake_logs"} +📩 Contenu + +fake_logs.sh : gĂ©nĂ©rateur de logs +promtail-config.yml : config pour envoyer vers Loki +docker-compose.yml : stack Loki + Promtail + Grafana + +--- + +## 🚀 Étapes suivantes pour GitWeb + +1. Initialise Git dans le dossier : + ```bash + git init + git remote add origin ssh://user@gitweb.dyndns.org:/srv/git/fake-log-generator.git + git add . + git commit -m "Initial fake log project for Loki" + git push -u origin master +VĂ©rifie que description, HEAD, etc. sont bien en place sur le serveur (mode bare repo). +Souhaites-tu que je te prĂ©pare une archive .zip contenant tout ce projet ? Je peux aussi gĂ©nĂ©rer les fichiers individuellement si tu le souhaites. + +Vous avez dit : +oui +ChatGPT a dit : +📩 Ton projet est prĂȘt ! + +Tu peux tĂ©lĂ©charger l’archive contenant le gĂ©nĂ©rateur de faux logs pour Loki ici : + +👉 fake-log-generator.zip + +Cette archive contient : + +fake_logs.sh (le gĂ©nĂ©rateur de logs) +Dockerfile + docker-compose.yml +promtail-config.yml +.gitignore +README.md +Tu peux maintenant le dĂ©compresser, le tester localement ou le pousser directement sur ton dĂ©pĂŽt GitWeb. + +Souhaites-tu aussi un exemple de configuration pour intĂ©grer ça dans un dashboard Grafana ? + +Vous avez dit : +oui +ChatGPT a dit : +Parfait ! Voici un exemple complet de tableau de bord Grafana pour visualiser les logs gĂ©nĂ©rĂ©s par ton script fake_logs.sh via Loki. + +📊 Dashboard Grafana pour les logs fake_logs + +📌 MĂ©thode 1 : Import manuel via JSON +Tu peux importer le JSON suivant dans Grafana : + +📝 JSON de Dashboard (extrait) +Voici un extrait (je peux te fournir le .json complet si tu prĂ©fĂšres en fichier) : + +{ + "dashboard": { + "title": "Fake Log Generator Dashboard", + "panels": [ + { + "type": "logs", + "title": "Logs rĂ©cents (Loki)", + "targets": [ + { + "expr": "{job=\"fake_logs\"}", + "refId": "A" + } + ], + "options": { + "dedupStrategy": "none", + "showTime": true, + "showLabels": true + }, + "gridPos": { "x": 0, "y": 0, "w": 24, "h": 10 } + }, + { + "type": "stat", + "title": "Nombre total de logs", + "targets": [ + { + "expr": "count_over_time({job=\"fake_logs\"}[1m])", + "refId": "B" + } + ], + "gridPos": { "x": 0, "y": 10, "w": 6, "h": 6 } + }, + { + "type": "piechart", + "title": "RĂ©partition par code HTTP", + "targets": [ + { + "expr": "count_over_time({job=\"fake_logs\"} |= \"HTTP\" | regexp \"\\\" ([0-9]{3}) \" | unwrap code [1m]) by (code)", + "refId": "C" + } + ], + "gridPos": { "x": 6, "y": 10, "w": 9, "h": 6 } + } + ], + "schemaVersion": 36, + "version": 1 + } +} +đŸ“„ Importer dans Grafana + +Ouvre Grafana : http://localhost:3000 +Va dans Dashboards > New > Import +Colle le JSON ci-dessus ou charge un fichier .json +SĂ©lectionne ta source Loki comme "data source" +🔍 Astuces LogQL utiles pour Grafana Explore + +Tous les logs : +{job="fake_logs"} +Logs d'erreurs : +{job="fake_logs"} |= " 5" or |= " 4" +Filtrer par mĂ©thode HTTP : +{job="fake_logs"} |= "POST" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d740687 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +version: '3.7' + +services: + loki: + image: grafana/loki:2.9.4 + ports: + - "3100:3100" + command: -config.file=/etc/loki/local-config.yaml + + promtail: + image: grafana/promtail:2.9.4 + volumes: + - ./logs:/var/log/fake + - ./promtail-config.yml:/etc/promtail/promtail.yml + command: -config.file=/etc/promtail/promtail.yml + + grafana: + image: grafana/grafana:10.2.0 + ports: + - "3000:3000" + environment: + - GF_SECURITY_ADMIN_PASSWORD=admin + volumes: + - grafana-storage:/var/lib/grafana + +volumes: + grafana-storage: diff --git a/fake-log-generator.sh b/fake-log-generator.sh new file mode 100644 index 0000000..b1c59da --- /dev/null +++ b/fake-log-generator.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +LINES=${1:-100} +FORMAT=${2:-apache} +MODE=$3 + +METHODS=("GET" "POST" "PUT" "DELETE" "PATCH") +PATHS=("/" "/login" "/dashboard" "/api/data" "/settings" "/products" "/checkout") +CODES_OK=(200 201 204 301 302) +CODES_ERR=(400 401 403 404 500 503) +AGENTS=( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" + "curl/7.68.0" + "PostmanRuntime/7.29.0" + "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X)" +) + +mkdir -p logs + +random_ip() { + echo "$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256)).$((RANDOM % 256))" +} + +random_date() { + date "+%d/%b/%Y:%H:%M:%S %z" +} + +iso_date() { + date --iso-8601=seconds +} + +generate_log() { + IP=$(random_ip) + DATE=$(random_date) + ISO_DATE=$(iso_date) + METHOD=${METHODS[$RANDOM % ${#METHODS[@]}]} + PATH=${PATHS[$RANDOM % ${#PATHS[@]}]} + AGENT=${AGENTS[$RANDOM % ${#AGENTS[@]}]} + SIZE=$((RANDOM % 5000 + 200)) + + if (( RANDOM % 10 < 2 )); then + CODE=${CODES_ERR[$RANDOM % ${#CODES_ERR[@]}]} + FILE="logs/error.log" + else + CODE=${CODES_OK[$RANDOM % ${#CODES_OK[@]}]} + FILE="logs/access.log" + fi + + case "$FORMAT" in + apache) + LOG="$IP - - [$DATE] \"$METHOD $PATH HTTP/1.1\" $CODE $SIZE \"$AGENT\"" + ;; + json) + LOG="{\"ip\":\"$IP\",\"timestamp\":\"$ISO_DATE\",\"method\":\"$METHOD\",\"path\":\"$PATH\",\"code\":$CODE,\"size\":$SIZE,\"agent\":\"$AGENT\"}" + ;; + ltsv) + LOG="host:$IP time:$ISO_DATE method:$METHOD path:$PATH status:$CODE size:$SIZE agent:$AGENT" + ;; + custom) + LOG="[$ISO_DATE] $IP | $METHOD $PATH => $CODE ($SIZE bytes)" + ;; + *) + echo "Format inconnu : $FORMAT" >&2 + exit 1 + ;; + esac + + echo "$LOG" >> "$FILE" + echo "$LOG" +} + +if [[ "$MODE" == "--loop" ]]; then + while true; do + generate_log + sleep 0.5 + done +else + for ((i=0; i