Log su file di testo per Foundation

,

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.

3 Mi Piace

Wow @paolo.giannelli , c’è un’epdiemia di “condivisite” nella community!

Quello che hai fatto mi pare di capire è utile anche per avere una sorta di DTTLogMessage avanzato quando si compila col debug. Poi chiaro è un aiuto per farsi un log in ogni caso.

1 Mi Piace

@f.faleschini mi piace questa cosa della condivisite :smiley:

Io cerco di condividere tutti i miei esempi un po’ alla volta.

1 Mi Piace

Grazie!
Secondo me la condivisione fa bene sia alla community sia al prodotto: dà movimento e stimoli nuovi.

Ci sono componenti “piccoli ma finiti” (tipo PNotify, log viewer, QR code ecc.) che sono subito riutilizzabili e danno valore immediato.

Poi ci sono sfide più grandi, come componenti strutturati stile Id Unit o qualcosa tipo “il devextreme della community”: lì però il livello di impegno cambia tanto. Anche solo adottarli richiede un certo approccio, figuriamoci evolverli. Noi abbiamo usato DevExtreme per un diagramma workflow ed è stato bello tosto, difficile da rendere davvero generico.

Per me già avere piccoli componenti utili e confrontarci su nuove idee è un grande risultato. Portare avanti progetti enormi come community, senza essere in un contesto open source vero e proprio, forse è un po’ ambizioso.

In ogni caso condividere è sempre positivo. Anche perché spesso fuori dal giro dev si vede solo la UI, mentre il lavoro sotto resta invisibile :slightly_smiling_face:

2 Mi Piace