Cette mise a jour complete ameliore significativement la qualite et la maintenabilite du projet. 1. Extension de la couverture de tests Couverture globale passee de 8% a 16% (+100%) - Ajout de 25 nouveaux tests (total: 67 tests, 100% passent) - Nouveaux fichiers de tests: * tests/unit/test_gitea.py (17 tests) * tests/unit/test_fiches_tickets.py (8 tests) Etat de la couverture par module: - utils/gitea.py: 100% - utils/widgets.py: 100% - utils/logger.py: 94% - app/fiches/utils/tickets/core.py: 77% - utils/graph_utils.py: 59% 2. Documentation d'architecture complete Creation de 3 nouveaux documents (30 Ko total): - docs/ARCHITECTURE.md (15 Ko) * Architecture complete du projet * Flux de donnees detailles * Indices de vulnerabilite (IHH, ISG, ICS, IVC) * Structure du graphe NetworkX - docs/MODULES.md (15 Ko) * Guide des 11 modules principaux * Exemples de code (15+ snippets) * Bonnes pratiques * Guide de depannage - docs/README.md (4 Ko) * Index de toute la documentation Contenu documente: - 5 modules applicatifs - 6 modules utilitaires - 4 indices de vulnerabilite avec formules et seuils - Conventions de code 3. Reorganisation de la documentation Structure finale optimisee: - Racine: README.md (mis a jour) + Instructions.md - docs/: 11 documents organises par categorie Fichiers deplaces vers docs/: - README_connexion.md -> docs/CONNEXION.md - GUIDE_LOGS.md -> docs/ - GUIDE_RUFF.md -> docs/ - RAPPORT_RUFF.md -> docs/ - RAPPORT_CORRECTIONS_AUTO.md -> docs/ - REFACTORING_REPORT.md -> docs/ - VERIFICATION_LOGS.md -> docs/ - TODO_IA_BATCH.md -> docs/ 4. Ajout de docstrings 52 fonctions documentees en style Google (100%) Documentation en francais avec Args, Returns, Raises 5. Corrections automatiques Ruff Application de 347 corrections automatiques: - Formatage du code (line-length: 120) - Organisation des imports - Simplifications syntaxiques - Suppressions de code mort - Ameliorations de performance 6. Configuration qualite du code Nouveaux fichiers: - pyproject.toml: configuration Ruff complete - .vscode/settings.json: integration Ruff avec formatOnSave - GUIDE_RUFF.md: documentation du linter - GUIDE_LOGS.md: documentation du logging - .gitignore: ajout htmlcov/ pour rapports de couverture Etat final du projet: - Linter: Ruff configure (15 regles actives) - Tests: 67 tests (100% passent) - Couverture de code: 16% - Docstrings: 52/52 (100%) - Documentation: 11 fichiers organises Impact: - Tests plus robustes et maintenables - Documentation technique complete - Meilleure organisation des fichiers - Workflow optimise avec Ruff - Code pret pour integration continue References: - Architecture: docs/ARCHITECTURE.md - Guide modules: docs/MODULES.md - Tests: tests/unit/ - Configuration: pyproject.toml Co-Authored-By: Claude <noreply@anthropic.com>
346 lines
8.5 KiB
Markdown
346 lines
8.5 KiB
Markdown
# 📋 Guide d'utilisation des Logs - FabNum
|
|
|
|
**Date** : 2026-02-07
|
|
**Module** : utils/logger.py
|
|
|
|
---
|
|
|
|
## 📂 Emplacement des logs
|
|
|
|
Tous les logs sont centralisés dans le dossier :
|
|
```
|
|
logs/
|
|
├── utils_graph_utils.log # Logs des fonctions de graphe
|
|
├── utils_widgets.log # Logs des widgets HTML
|
|
├── batch_ia_utils_sections.log # Logs génération sections IA
|
|
├── app_fiches_utils_tickets_display.log # Logs affichage tickets
|
|
└── app_plan_d_action_utils_data_data_utils.log # Logs plan d'action
|
|
```
|
|
|
|
Chaque module a **son propre fichier de log**, ce qui facilite le débogage ciblé.
|
|
|
|
---
|
|
|
|
## 🔍 Comment consulter les logs
|
|
|
|
### 1. **Voir les logs en temps réel**
|
|
|
|
```bash
|
|
# Suivre tous les logs
|
|
tail -f logs/*.log
|
|
|
|
# Suivre un module spécifique
|
|
tail -f logs/utils_graph_utils.log
|
|
|
|
# Suivre plusieurs modules
|
|
tail -f logs/utils_graph_utils.log logs/batch_ia_utils_sections.log
|
|
```
|
|
|
|
### 2. **Voir les derniers logs**
|
|
|
|
```bash
|
|
# 20 dernières lignes de tous les logs
|
|
tail -20 logs/*.log
|
|
|
|
# 50 dernières lignes d'un module spécifique
|
|
tail -50 logs/utils_graph_utils.log
|
|
```
|
|
|
|
### 3. **Rechercher dans les logs**
|
|
|
|
```bash
|
|
# Chercher toutes les erreurs
|
|
grep -r "ERROR" logs/
|
|
|
|
# Chercher tous les warnings
|
|
grep -r "WARNING" logs/
|
|
|
|
# Chercher un terme spécifique
|
|
grep -r "hafnium" logs/
|
|
|
|
# Chercher avec contexte (3 lignes avant/après)
|
|
grep -C 3 "ERROR" logs/*.log
|
|
```
|
|
|
|
### 4. **Filtrer par niveau de log**
|
|
|
|
```bash
|
|
# Voir uniquement les erreurs et warnings
|
|
grep -E "ERROR|WARNING" logs/*.log
|
|
|
|
# Voir uniquement les erreurs critiques
|
|
grep "ERROR" logs/*.log
|
|
|
|
# Exclure les tests
|
|
grep -v "test_" logs/*.log | grep ERROR
|
|
```
|
|
|
|
### 5. **Analyser par période**
|
|
|
|
```bash
|
|
# Logs d'aujourd'hui
|
|
grep "$(date +%Y-%m-%d)" logs/*.log
|
|
|
|
# Logs d'une heure spécifique
|
|
grep "2026-02-07 17:" logs/*.log
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Exemples de logs actuels
|
|
|
|
### ✅ Logs normaux (WARNING)
|
|
|
|
```
|
|
2026-02-07 17:24:25 - utils.graph_utils - WARNING - Nœuds manquants pour MineraiInexistant : MineraiInexistant, Extraction_MineraiInexistant, Reserves_MineraiInexistant — Ignoré.
|
|
```
|
|
|
|
**Interprétation** : Le système cherche un minerai qui n'existe pas dans le graphe. C'est normal lors des tests, le système l'ignore gracieusement.
|
|
|
|
---
|
|
|
|
### ✅ Logs cas edge (WARNING)
|
|
|
|
```
|
|
2026-02-07 17:28:21 - batch_ia.utils.sections - WARNING - Impossible de traiter le produit 'Procédé EUV' (cas edge hafnium/EUV): 'NoneType' object has no attribute 'split'
|
|
```
|
|
|
|
**Interprétation** : Le cas edge de l'hafnium lié au procédé EUV est détecté. Le système continue le traitement des autres produits. C'est le comportement attendu.
|
|
|
|
---
|
|
|
|
## 🎨 Format des logs
|
|
|
|
Chaque ligne de log suit ce format :
|
|
```
|
|
[TIMESTAMP] - [MODULE] - [NIVEAU] - [MESSAGE]
|
|
```
|
|
|
|
**Exemple** :
|
|
```
|
|
2026-02-07 17:24:25 - utils.graph_utils - WARNING - Nœuds manquants pour MineraiInexistant
|
|
│ │ │ │
|
|
│ │ │ └─ Message détaillé
|
|
│ │ └─────────── Niveau (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
|
│ └──────────────────────────────── Nom du module Python
|
|
└───────────────────────────────────────────────────── Timestamp (YYYY-MM-DD HH:MM:SS)
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Niveaux de log
|
|
|
|
| Niveau | Usage | Action recommandée |
|
|
|--------|-------|-------------------|
|
|
| **DEBUG** | Informations détaillées pour le débogage | Ignorer en production |
|
|
| **INFO** | Informations générales (chargement, succès) | Surveillance normale |
|
|
| **WARNING** | Situations anormales mais gérées | Surveiller, pas d'action immédiate |
|
|
| **ERROR** | Erreurs qui empêchent une fonctionnalité | **Action requise** |
|
|
| **CRITICAL** | Erreurs système graves | **Action immédiate** |
|
|
|
|
---
|
|
|
|
## 🔧 Commandes utiles
|
|
|
|
### Nettoyer les logs de tests
|
|
|
|
```bash
|
|
# Supprimer tous les logs de tests (test_*.log)
|
|
rm logs/test_*.log
|
|
|
|
# Supprimer tous les logs vides
|
|
find logs/ -name "*.log" -type f -empty -delete
|
|
```
|
|
|
|
### Archiver les anciens logs
|
|
|
|
```bash
|
|
# Créer un dossier d'archives
|
|
mkdir -p logs/archives
|
|
|
|
# Archiver les logs de la semaine dernière
|
|
tar -czf logs/archives/logs_$(date +%Y%m%d).tar.gz logs/*.log
|
|
|
|
# Vider les logs actuels (garder les fichiers)
|
|
truncate -s 0 logs/*.log
|
|
```
|
|
|
|
### Surveiller les erreurs en temps réel
|
|
|
|
```bash
|
|
# Afficher uniquement les nouvelles erreurs
|
|
tail -f logs/*.log | grep --line-buffered "ERROR"
|
|
|
|
# Avec notification sonore
|
|
tail -f logs/*.log | grep --line-buffered "ERROR" && echo -e '\a'
|
|
```
|
|
|
|
---
|
|
|
|
## 📈 Monitoring en production
|
|
|
|
### 1. **Surveillance quotidienne**
|
|
|
|
```bash
|
|
# Script de surveillance (à lancer quotidiennement)
|
|
#!/bin/bash
|
|
echo "=== Rapport de logs FabNum - $(date) ==="
|
|
echo ""
|
|
echo "Nombre d'erreurs aujourd'hui:"
|
|
grep "$(date +%Y-%m-%d)" logs/*.log | grep -c "ERROR"
|
|
echo ""
|
|
echo "Nombre de warnings aujourd'hui:"
|
|
grep "$(date +%Y-%m-%d)" logs/*.log | grep -c "WARNING"
|
|
echo ""
|
|
echo "Dernières erreurs:"
|
|
grep "$(date +%Y-%m-%d)" logs/*.log | grep "ERROR" | tail -5
|
|
```
|
|
|
|
### 2. **Alertes par email** (optionnel)
|
|
|
|
```bash
|
|
# Si plus de 10 erreurs aujourd'hui, envoyer un email
|
|
ERROR_COUNT=$(grep "$(date +%Y-%m-%d)" logs/*.log | grep -c "ERROR")
|
|
if [ $ERROR_COUNT -gt 10 ]; then
|
|
echo "⚠️ $ERROR_COUNT erreurs détectées" | mail -s "Alerte FabNum" admin@example.com
|
|
fi
|
|
```
|
|
|
|
### 3. **Dashboard simple**
|
|
|
|
```bash
|
|
# Afficher un résumé coloré
|
|
echo -e "\n📊 Résumé des logs FabNum\n"
|
|
echo "🔵 INFO: $(grep -c 'INFO' logs/*.log 2>/dev/null || echo 0)"
|
|
echo "🟡 WARNING: $(grep -c 'WARNING' logs/*.log 2>/dev/null || echo 0)"
|
|
echo "🔴 ERROR: $(grep -c 'ERROR' logs/*.log 2>/dev/null || echo 0)"
|
|
```
|
|
|
|
---
|
|
|
|
## 🛠️ Dépannage
|
|
|
|
### Problème : Les logs ne s'affichent pas
|
|
|
|
**Solution 1** : Vérifier les permissions
|
|
```bash
|
|
ls -lh logs/
|
|
chmod 755 logs/
|
|
chmod 644 logs/*.log
|
|
```
|
|
|
|
**Solution 2** : Vérifier que le dossier logs/ existe
|
|
```bash
|
|
mkdir -p logs
|
|
```
|
|
|
|
**Solution 3** : Vérifier le niveau de log dans le code
|
|
```python
|
|
# Dans votre module
|
|
from utils.logger import setup_logger
|
|
logger = setup_logger(__name__, level="DEBUG") # Forcer DEBUG
|
|
```
|
|
|
|
### Problème : Trop de logs
|
|
|
|
**Solution** : Augmenter le niveau de log
|
|
```python
|
|
# Passer de DEBUG à INFO
|
|
logger = setup_logger(__name__, level="INFO")
|
|
```
|
|
|
|
### Problème : Logs en double
|
|
|
|
**Solution** : Le logger est configuré plusieurs fois
|
|
```python
|
|
# S'assurer d'appeler setup_logger une seule fois par module
|
|
# Au début du fichier, en global
|
|
logger = setup_logger(__name__)
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Bonnes pratiques
|
|
|
|
### ✅ À FAIRE
|
|
|
|
```python
|
|
# Utiliser le bon niveau
|
|
logger.info("Chargement du graphe réussi")
|
|
logger.warning("Nœud manquant, utilisation valeur par défaut")
|
|
logger.error("Impossible de se connecter à Gitea", exc_info=True)
|
|
|
|
# Ajouter du contexte
|
|
logger.error(f"Erreur lors du traitement de {produit_id}", exc_info=True)
|
|
|
|
# Logger les exceptions avec stacktrace
|
|
try:
|
|
# code
|
|
except Exception as e:
|
|
logger.error(f"Erreur inattendue: {e}", exc_info=True)
|
|
```
|
|
|
|
### ❌ À ÉVITER
|
|
|
|
```python
|
|
# Ne pas utiliser print()
|
|
print("Erreur") # ❌
|
|
|
|
# Ne pas logger des informations sensibles
|
|
logger.info(f"Token: {GITEA_TOKEN}") # ❌
|
|
|
|
# Ne pas logger en boucle sans limite
|
|
for i in range(10000):
|
|
logger.debug(f"Iteration {i}") # ❌ Surcharge
|
|
```
|
|
|
|
---
|
|
|
|
## 🎓 Exemples d'usage
|
|
|
|
### Exemple 1 : Déboguer un problème de chargement
|
|
|
|
```bash
|
|
# 1. Voir les derniers logs de graph_utils
|
|
tail -50 logs/utils_graph_utils.log
|
|
|
|
# 2. Chercher les erreurs
|
|
grep "ERROR" logs/utils_graph_utils.log
|
|
|
|
# 3. Voir le contexte autour d'une erreur
|
|
grep -C 5 "ERROR" logs/utils_graph_utils.log
|
|
```
|
|
|
|
### Exemple 2 : Surveiller la génération IA
|
|
|
|
```bash
|
|
# Suivre en temps réel
|
|
tail -f logs/batch_ia_utils_sections.log
|
|
|
|
# Filtrer les warnings
|
|
tail -f logs/batch_ia_utils_sections.log | grep "WARNING"
|
|
```
|
|
|
|
### Exemple 3 : Analyser les performances
|
|
|
|
```bash
|
|
# Compter combien de fois un minerai est manquant
|
|
grep "Nœuds manquants" logs/utils_graph_utils.log | wc -l
|
|
|
|
# Lister les minerais manquants uniques
|
|
grep "Nœuds manquants pour" logs/utils_graph_utils.log | \
|
|
sed 's/.*pour \(.*\) :.*/\1/' | sort | uniq
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 Ressources
|
|
|
|
- **Module source** : [utils/logger.py](utils/logger.py)
|
|
- **Tests** : [tests/unit/test_logger.py](tests/unit/test_logger.py)
|
|
- **Documentation** : [REFACTORING_REPORT.md](REFACTORING_REPORT.md)
|
|
|
|
---
|
|
|
|
**Dernière mise à jour** : 2026-02-07
|