Può essere utile poter scrivere un file di testo specifico per tracciare un log della propria applicazione web con informazioni di operazioni compiute su di essa, come login, logout, apertura di videate ecc.
L’idea è creare un file di log per giorno che contenga le righe di log con l’ora dell’operazione.
Ogni file di log avrà un nome con questa struttura log_yyyy-mm-dd.txt dove yyyy-mm-dd è la data data del giorno.
I file verranno memorizzati nella directory logs dell’appplicazione.
Come fare a realizzarlo?
Vi allego un progetto di esempio che implementa la cosa.
Log File Testo.zip (1,6 MB)
Vediamo come funziona.
Nel progetto è presente la classe Log che è stata creata manualmente, non dipende da una tabella, eredita da IDDocument e utilizza la Document Orientation, ha una unica proprietà il Nome del file di log.
Questa classe serve a visualizzare la lista dei file di log e implementa i seguenti metodi statici:
- writeLog - scrive il messaggio di log
- listaLog - restituisce la lista dei file di log presenti
- leggiLog - restituisce il testo di un file di log
Il metodo writeLog apre o crea un file di testo sul file system del server e scrive il messaggio ricevuto.
La scrittura p condizionata al fatto che il log sia abilitato e il livello di log sia quello corretto.
Queste impostazioni dipendono da dai campi di una tabella IMDB che viene impostata nell’evento Inizialize e OnLogin dell’applicazione.
- LogAttivo - true o false
- LivelloLogRichiesto - Sinettico o Dettagliato
public static void Log.writeLog(
string messaggio //
int livelloLog //
)
{
// Scrivo solo se il log è attivo
if (CommonDoc.ParametriSessione.LogAttivo == true)
{
// Scrivo solo se il livello di log è quello corretto
if (livelloLog <= CommonDoc.ParametriSessione.LivelloLogRichiesto)
{
int nFile = CommonDoc.freeFile()
string file = "log_" + format(today(), "yyyy-mm-dd", ...) + ".txt"
string path = CommonDoc.path() + "/logs/"
CommonDoc.openFileForAppend(path + file, nFile, ...)
CommonDoc.writeLine(nFile, format(now(), "hh:nn:ss", ...) + " - " + messaggio)
CommonDoc.closeFile(nFile)
}
}
}
Per scrivere un messaggio di log questa è un esempio dell’istruzione da usare:
Log.writeLog("Avvio applicazione", Sintetico)
Il metodo listaLog che carica i file di log presenti nella dir logs è questo:
public static IDCollection Log.listaLog()
{
IDCollection coll of Log = new()
string file = CommonDoc.readDirectory(CommonDoc.path() + "/logs/log_*.txt", ...)
while (file != "")
{
Log l = new()
l.init()
l.Nome = file
coll.add(l)
file = CommonDoc.readDirectory(...)
}
//
coll.setOriginal()
//
return coll
}
La videata che visualizza i file di log permette di vederne il contenuto, scaricare il file di log e cancellarli.
Nella lista a video sono stati aggiunti anche i tre bottoni per visualizzare, scaricare e cancellare un file di log.
Per mettere in lista i tre bottoni ho modificato la master query del pannello aggiungendo tre costanti con le icone relative.
select
Nome
"{{icon-vela-microscope}}" as Leggi (LEGGI)
"{{icon-vela-trash-01}}" as Elimina (ELIMINA)
"{{icon-vela-file-download-01}}" as Download (DOWNLOAD)
from
Log // master table
Poi ho aggiunto i campi al pannello ed impostato il fatto che siano cliccabili.
Inoltre ho collegato le tre procedure che effettuano i relativi comandi.
Il resto del codice lo potete vedere scaricando il progetto.
