TP_SEI_Project/arm_sql_logging.md

123 lines
3.7 KiB
Markdown

# SQL Query Logging Implementation
## Overview
Il sistema di logging SQL è stato implementato per tracciare tutte le query eseguite dall'applicazione. Questo permette di monitorare le performance e debuggare eventuali problemi legati all'accesso ai dati.
## Implementazione
### 1. Classe SqlLogging
La classe `SqlLogging` è stata aggiunta in `DataAccessLayer` e gestisce il logging delle query SQL. Si trova in:
```plaintext
/root/Shared/DataAccessLayer/SqlLogging.cs
```
### 2. Funzionalità
Il logger registra le seguenti informazioni per ogni query:
* Timestamp dell'esecuzione
* Tipo di comando (Text, StoredProcedure)
* Query SQL eseguita
* Parametri e loro valori
* Tempo di esecuzione in millisecondi
### 3. Configurazione
I log vengono salvati automaticamente in:
```plaintext
{AppDomain.CurrentDomain.BaseDirectory}\SqlLogs\sql_log_YYYYMMDD.txt
```
Un nuovo file viene creato ogni giorno.
### 4. Esempio di Output
```plaintext
[2025-05-23 10:12:05.123]
Command Type: StoredProcedure
Command Text: sp_GetCustomerData
Parameters:
@CustomerId (Int): 12345
@Date (DateTime): 2025-05-23
Execution Time: 150ms
--------------------------------------------------------------------------------
```
### 5. Integrazione
Il logging è stato integrato in tutti i metodi di accesso ai dati della classe `DataAccessDE`:
* ExecuteReader
* ExecuteNonQuery
* ExecuteScalar
* Stored Procedures
* Query SQL dirette
### 6. Thread Safety
Il sistema di logging è thread-safe grazie all'utilizzo di:
* File giornalieri separati
* Lock durante la scrittura dei log
* StringBuilder per la composizione dei messaggi
### 7. Gestione Errori
* In caso di errori durante il logging, questi vengono catturati e non interferiscono con l'esecuzione normale dell'applicazione
* Gli errori di logging vengono scritti nel debug output usando `System.Diagnostics.Debug.WriteLine`
## Come Utilizzare
Non è necessaria alcuna configurazione aggiuntiva. Il logging è automaticamente attivo per tutte le query SQL eseguite attraverso il layer DataAccess.
## Performance Impact
* Il logging è progettato per avere un impatto minimo sulle performance
* La scrittura su file avviene in modo asincrono
* I file vengono suddivisi per giorno per evitare file troppo grandi
## Manutenzione
* I file di log vengono creati automaticamente nella cartella SqlLogs
* Si consiglia di implementare una policy di retention per i file di log più vecchi
* Monitorare periodicamente la dimensione della cartella SqlLogs
## FAQ
### Come posso stampare sul log le query eseguite?
Ci sono due approcci principali:
1. **ADO.NET Diretto (Implementato)**
* Utilizza la classe `SqlLogging` che intercetta e logga automaticamente tutte le query
* I log vengono salvati in file giornalieri nella cartella SqlLogs
* Include dettagli come timestamp, parametri e tempi di esecuzione
2. **LINQ to SQL**
```csharp
DataClassesStorTrimDataContext context = new DataClassesStorTrimDataContext();
context.Log = new StringWriter(); // oppure qualsiasi TextWriter
// oppure
context.Log = Console.Out; // per vedere le query direttamente nella console
```
### Quale approccio è stato implementato?
È stato implementato l'approccio ADO.NET diretto perché:
* È l'approccio principale utilizzato nel progetto
* Offre maggior controllo sul logging
* Permette di tracciare tutte le query, inclusi i parametri e i tempi di esecuzione
* Supporta il logging thread-safe su file
### Come funziona il sistema di logging?
Il sistema utilizza extension methods su `SqlCommand` per intercettare automaticamente tutte le chiamate al database:
* `ExecuteNonQueryWithLogging()`
* `ExecuteReaderWithLogging()`
* `ExecuteScalarWithLogging()`
Ogni chiamata viene loggata con tutti i dettagli rilevanti in un file giornaliero.