Newsgroup: it.comp.www.php
Titolo: Loggare azioni

ciao a tutti, chiedo a chi di voi fa il programmatore php di mestiere
o che comunque ne sa più di me su questa cosa; voglio fare in modo che
nel mio cms ogni azione venga loggata...ora quelle che ho in mente
come soluzione sarebbero:
1) per ogni punto "strategico" ossia dove l'azione viene effettuata
chiamo una funzione che mi apre un file di testo, ci scrive la stringa
(tipo pippo ha fatto questo) e chiude il file di testo.
-questa soluzione per quanto banale e immagino funzionante mi fa
dubitare in termini prestazionali e di uso del disco...ora il cms è
mio e lo uso per miei fini ma dato che poi sarà disponibile per tutti
se magari qualcuno lo usa e ha parecchi accessi....st'apertura,
scrittura e chiusura magari su N utenti per N volte mi da da pensare
2) in ogni punto metto una chiamata ad una funzione che mi scrive la
stringa in memoria e ogni volta che viene richiamata fa un controllo
della grandezza della memoria e nel caso sia superiore ad un tot apre
un file di testo e ci scive tutto il buffer e poi lo richiude
- anche qui ottimizzo le aperture e chiusure del file ma manco troppo
perchè comunque dipende da quanto navigano sulle pagine
3) boh...non mi viene in mente altro...il cms ha anche sqlite3 come db
però se sia giusto (o meglio) sparare una raffica di dati dentro un db
non saprei....forse 2 db diversi?
peraltro ero indeciso su come realizzare questa soluzione, ossia se
mettere il log o acceso o spento o se metterlo come si trova a giro "a
livelli", forse a livelli sarebbe più performante ma è anche vero che
non so nemmeno da dove partire per classificare quali eventi vadano
nel livello 1 e quali nel 2 ecc....
qualcuno ha una qualche opinione o consiglio?
ps. la soluzione 2 prevede che io abbia accesso ad una memoria buffer
indipendente dalla pagina php in questione e cioè che non sia resa
inaccessibile al termine delle istruzioni ma permanga nel tempo e che
sopratutto sia controllabile nella dimensione...altrimenti la vedo
difficile....

 qualcuno ha una qualche opinione o consiglio?
Leggere i manuali di base tanto per cominciare non sarebbe una 
cattivissima idea, io ho cominciato cos� anche se sono trascorsi molti 
anni, credo funzioni ancora.

 anni, credo funzioni ancora.
a parte che se leggevi ho scritto che il cms usa sqlite...e mi risulta
sia un database...poi che non piaccia magari posso essere
d'accordo....però..
comunque non ho chiesto come si fa...il come si fa l'ho trovato anche
io, ho chiesto se è giusto che si faccia così...intendo la soluzione
tecnicamente giusta...è giusto e dal punto di vista delle risorse
corretto aprire un file scriverlo e chiuderlo tante volte al secondo?
o c'è qualcosa di migliore? io ipotizzo il db ma alla fine che tu
parli di db su file (ossia sqlite) o che parli di mysql (che poi alla
fine sempre su file vanno a finire i dati), è giusto anche qui fare
tante volte una query di insert per ogni azione?
su un manuale non c'è mica scritto "questa cosa si fa così" almeno io
disolito non vedo argomenti del genere...piuttosto ci sarà "come
scrivere un file"....ma è un'altra la mia richiesta

 non saprei....forse 2 db diversi?
La 2 la scarterei, se non altro per la complicazione, e per il rischio 
che ti perda il buffer (magari per un crash dello script o di php).
Fossi in te farei una classe che astrae i metodi 1 e 3, poi fai un po' di 
benchmark.
A naso credo che la 3 sia piu` efficiente, perche` il DB si arrangia a 
bufferizzare le insert, a meno che non usi l'autocommit e l'autoflush 
(che mi pare siano il default in sqlite), ma hai il rischio del metodo 2.
In ogni caso userei un file diverso per il DB dei log, per evitare di 
intasare quello principale con insert e cancellazioni (vorrai ripulirli, 
i log, ogni tanto...)
Coi file (metodo 1) hai l'overhead di apertura e chiusura, ma (almeno in 
Linux) dovrebbe essere abbastanza basso, e il buffer lo fa il kernel, 
quindi hai (si spera) meno probabilita` che crashi e ti perda il log.
Io, piu` che sulle prestazioni, che credo cambino di poco, punterei sulla 
convenienza caso per caso.
Se quei log te li leggi con calma con un less, puoi pensare al file di 
testo, piu` maneggevole, grep-pabile e in generale maneggevole da shell.
Se invece vuoi renderli un po' piu` complessi, e magari visualizzarli dal 
cms permettendo di filtrare in base al modulo che li ha generati, o 
all'orario, o al livello di gravita`, andrei sul DB.
Bye.

nel mio cms ogni azione venga loggata...
Ti prepari funzioni tipo "log_message(area, importance, message)" e una
funzione "dump_message($message = false)".
La funzione log_message fa ragionamenti come
	if (LOG_AREAS & $area)
	if (LOG_LEVEL <= $importance)
		dump_message(date("Y-m-d H:i:s") . "\t" .
			(altra roba da $_SERVER)
			. $message);
e la funzione dump_message fa ragionamenti come
	if (message !== false)
		if (dimensioni del buffer + messaggio < maxdim)
			aggiunge messaggio a buffer e return;
	aggiunge messaggio a buffer
	scrive il buffer su DB (meglio) o disco (occhio ai lock!)
Poi devi registrare dump_message come funzione di shutdown.
Tutto cio' si farebbe bene con una classe Logger e buffer privato.
Poi imposti quali aree vuoi monitorare:
	LOG_NOTHING	=  0x0000
	LOG_CONNECT	=  0x0001
	LOG_DATABASE	=  0x0002
	LOG_SECURITY	=  0x0004
	LOG_FUCKING_ALL	=  0xFFFF
	LOG_ERROR	=  100
	LOG_DIRE_WARNING=  95
	LOG_WARNING	=  90
	LOG_INFO	=  50
	LOG_DEBUG	=  20
	LOG_INANITY     =  1
e quale livello di allerta ti serve. In tutto il codice metti dei
richiami all'opportuno log_message.
Poi in debug metterai
	LOG_AREAS	= LOG_EVERYTHING;
	LOG_LEVEL	= LOG_INANITY;
e in produzione
	LOG_AREAS	= (aree da controllare)
	LOG_LEVEL	= LOG_WARNING;
e sei lesto.
Leonardo
-- 
The cock doth craw, the day doth daw,
the channerin' worm doth chide:
gin we be mist oot o' oor place,
a sair pain we maun bide.

 qualcuno ha una qualche opinione o consiglio?
Se vuoi usare un file di testo, IMHO ti dovresti tenere aperto il file e non
continuare ad aprirlo e chiuderlo, magari istanziando un oggetto log che nella
funzione di creazione ha l'apertura del file e si registra in una variabile
locale dell'istanza l'handle del file.
Se vuoi usare un database, meglio considerare MySQL.
Come alternativa potresti considerare l'uso del logger di sistema (syslog o
eventlog, dipende dalla piattaforma) cosi' sono affari del sistema operativo.
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
DELTA: Didn't Even Leaves The Airport


ho fatto qualche prova....la soluzione di Leonardo seppur (immagino)
molto valida, senza modestia affermo che è al di fuori delle mie
competenze al momento e siccome non è la mia principale professione
dubito che riuscirò ad implementarla anche in un futuro..
per quanto riguarda il file di testo in effetti tenerne aperto
l'handle sarebbe possibile ma non so se funzionerebbe dappertutto
(parlo nel caso di hosting condiviso o altro...credo di si ma dovrei
documentarmi sul come farlo) e in effetti però a confronto col db
permette una minore maneggevolezza in ricerca e gestione
per ora la sctrada che sto vedendo include il database sqlite, scelto
al posto di mysql poichè una delle "feature" se così le vogliamo
chiamare è il fatto che il cms sia senza server ma che abbia comunque
sotto un db che funzioni come tale, chi ha il noto provider&hosting
fiorentino sa che il db server è a parte...e questa cosa non la
digerisco volentieri quindi....
facendomi due conti ho implementato per ora con il log DI TUTTO senza
distinzione tra "severe" "notice" ecc...e ho riscontrato un tempo
medio di 0.004812 (questo l'ho tirato fuori dalla differenza di
microtime() all'inizio e alla fine della funzione NON di tutta la
pagina, e non ho capito se il valore prima del punto sia espresso in
secondi perchè da manuale sembra di no, e quindi sia equivalente a
quasi 5 millesimi di secondo), vi sembra accetabile?
grazie per le idee....spero di fare un qualcosa di valido

 quasi 5 millesimi di secondo), vi sembra accetabile?
Non ho mai fatto prove di questo tipo, ma attento alla sostanziale differenza
tra un programma che gira su un computer e uno script server side come PHP.
In una situazione come il PHP la differenza di tempo tra l'inizio della "pagina"
e la sua fine e' il tempo che lo script impiega a creare l'output HTML che viene
inviato al client. Ovviamente sono esclusi da questo calcolo il trasferimento
del testo html e, soprattutto, il tempo di trasferimento di tutti gli oggetti di
grafica (immagine e CSS).
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Il sindaco di Tortona potrebbe essere una ciliegina.
    --Alessandro Bergonzoni, "Le balene restino sedute"

 secondo), vi sembra accetabile?
Non puoi valutare i tempi medi in questo modo. Meglio fare un ciclo di 
qualche milione di iterazioni su quella funzione, e fare il microtime 
prima e dopo il ciclo, non dentro la funzione, altrimenti non tieni conto 
di vari overhead (tra cui quello della chiamata alla funzione e quello 
delle due chiamate a microtime) e della imprecisione della macchina su 
cui gira (interrupt, latenze, ecc.).
Bye.