# đŸ§Ș 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"