Newsgroup: it.comp.lang.visual-basic
Titolo: File di log: pulizia

Volevo implementare una piccola routine che mi pulisse il
file di log dell'applicazione superata una certa dimensione.
Ho un paio di punti non poco chiari.  Faccio il check della
lunghezza del file con filelen, mi ricavo la lunghezza in byte
o kbyte (non ricordo bene, ma non cambia) dopodichè
decido se maggiore di un dato valore di pulire.
Bene ... il punto è questo. Quante righe cancello per
essere sicuro di aver pulito?
Mi spiego meglio. Supponete 100 righe equivalgano
ad un file di 400k (cazzata) ... apro il file ... inizio a
cancellare una riga salvo e ricontrollo? Troppo dispendioso.
E poi ... ogni quante volte lancio la procedura di pulizia?
Ad ogni avvio di programma? Ogni lunedì .... non riesco
a trovare un criterio per non stare sempre ad eseguire la
pulizia. Magari con un parametro nel file di configurazione
mi potrei segnare la data dell'ultimo giro e magari per lo
stesso giorno non eseguirla più.
Aspetto idee ...
-- 
Saluti
Andrea Moro

 Aspetto idee ...
Ciao,
Io direi questo: anziché fare pulizia del file di log - che può
sempre tornare utile - perché non lo comprimi e ne fai un backup,
creando un nuovo file ed utilizzando quello per le scritture successive?
Potresti mettere in un file di configurazione la cadenza( settimanale,
mensile, ecc ) con una voce che ti dice se quella "corrente" è stata già
effettuata( in modo da non rieffettuarla ).
Volendo essere proprio più pratici, potresti creare un archivio solido di
tutti i log passati, magari mettendo in una cartella a parte quelli degli
anni
precedenti.
Sarà poi il cliente a decidere che farne.
Ciao
Andrea

Sono daccordo...
Secondo me il top è zippare ogni giorno il log del giorno precedente e
salvarlo nel formato 2003-07-23 in modo che quando apri la cartella
tutto sia ben ordinato prima per anno, poi per mese e poi per giorno.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Secondo me il top è zippare ogni giorno il log del giorno precedente
Imho dipende da quanto è grosso il log: se ogni log sono 1Kb non ha
senso zippare ogni giorno, ma ogni settimana, possibilmente con un
archivio solido.
Andrea

Bah il mio è un log di errori non di operazioni eseguite.
Comunque zippare ... si potrebbe perchè no, magari
a fine mese o su richiesta.
Spostare in un'altra cartella ... boh. Forse inutile.
Diciamo che teoricamente il file dovrebbe sempre
rimanere vuoto ;)
-- 
Saluti
Andrea Moro

 rimanere vuoto ;)
1)Con tutto il rispetto per la tua abilità ma scordati che
resterà sempre vuoto :-)
2) Teoricamente non dovrebbe *mai* arrivare a dimensioni
eccessive ed ad ogni modo, conservarli tutti può servire.
3) Infine, direi che un qualche meccanismo di gestione dei log
dovrebbe comunque esserci, non pensi?
Andrea

 Andrea

essere sicuro di aver pulito?
1. Apri il file in binario in lettura/scrittura;
2. fai una Seek fino al byte che corrisponde a MAX_LUNGH_PER_PULIRE;
3. se questo non e' in corrispondenza di un fine riga allora cerchi
   il primo fineriga esistente andando a ritroso;
4. definisci un array di byte dimensionato al numero di byte che ci
   sono fra il primo byte subito dopo il fine riga appena trovato e
   la fine del file;
5. carichi nell'array il suddetto blocco di byte;
6. chiudi il file;
7. scrivi l'array su un nuovo file temporaneo;
8. cancelli il vecchio file di log;
9. rinomini il file temporaneo con il nome del vecchio file di log.
Il tempo di esecuzione dovrebbe essere una sciocchezza.
-- 
ciao, hal

 Il tempo di esecuzione dovrebbe essere una sciocchezza.
Proverò e cercherò risponde intando che mi darai altri input.
-- 
Saluti
Andrea Moro

Ok, questo è quanto ... scarso 1 secondo su un PIV 2Ghz con
1GB di ram.
'---------------------------------------------------------------------------
------------
' Procedure : RedimLogFile
' DateTime  : 25/07/2003 08:29
' Author    : Andrea Moro
' Purpose   : Ridimensione il log file ad una certa dimensione
'---------------------------------------------------------------------------
------------
Public Sub RedimLogFile(ByVal LogFile As String, ByVal NewSize As Long)
  Dim iLogFile As Integer
  Dim i As Integer
  Dim NewBytePos As Long
  Dim LogFileSize As Long
  Dim Dummy As String
  Dim LogContent() As Byte
  'Recupero un handle per il file di log di partenza
  iLogFile = FreeFile
  'Apro il file
  Open LogFile For Binary As #iLogFile
  'Recupero la lunghezza in byte del file di log
  LogFileSize = LOF(iLogFile)
  'Stabilisco quanti byte voglio preservare
  NewBytePos = LogFileSize - NewSize
  'Quindi posiziono il puntatore sul file aperto
  Seek #iLogFile, NewBytePos
  'Recupero un stringa di 350 spazi bianchi (per assurdo credo sia
impossibile che
  'dal punto in cui mi sono posizionato + 350 caratteri non ci sia un
saltoriga)
  Dummy = String(350, " ")
  'Recupero i 350 caratteri successivi al puntatore
  Get #iLogFile, , Dummy
  'Cerco il primo salto riga, quindi memorizzo la sua posizione
  i = InStr(Dummy, vbCrLf) + 1
  NewBytePos = NewBytePos + i
  'Sposto il puntatore nel file
  Seek #iLogFile, NewBytePos
  'Stabilisco la nuova dimensione del file che dovrò ottenere
  LogFileSize = LogFileSize - NewBytePos
  'Ridimensiono un array di byte e recupero il contenuto del file
  'dalla posizione in cui mi trovo fino alla fine.
  ReDim LogContent(LogFileSize)
  LogContent = InputB(LogFileSize, iLogFile)
  'Apro un nuovo file di appoggio
  iLogFile = FreeFile
  Open LogFile & "_" For Append As #iLogFile
  'Svuoto la variabile stringa di appoggio
  Dummy = ""
  'Mi ciclo l'array di byte ricomponendo la riga e scrivendola ad ogni salto
  For i = 0 To UBound(LogContent)
    If (LogContent(i) = 13) Then
      i = i + 1
      Print #iLogFile, Dummy
      Dummy = ""
    Else
      Dummy = Dummy & Chr(LogContent(i))
    End If
  Next
  'Chiudo tutti i file aperti
  Reset
  'Cancello il vecchio file di log e rinomino quello nuovo con il nome
originale.
  Call Kill(LogFile)
  Call FileCopy(LogFile & "_", LogFile)
  Call Kill(LogFile & "_")
End Sub
-- 
Saluti
Andrea Moro

End Sub
-- 
ciao, hal