TP_SEI_Project/arm_sql_logging.md

3.7 KiB

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:

/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:

{AppDomain.CurrentDomain.BaseDirectory}\SqlLogs\sql_log_YYYYMMDD.txt

Un nuovo file viene creato ogni giorno.

4. Esempio di Output

[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

    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.