File di log personalizzato

perseoclub

Utente Attivo
28 Nov 2015
91
0
6
Ciao a tutti,

sto usando questo script per tracciare gli errori/messaggi del mio server apache

PHP:
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);
ini_set("track_errors", 1);
ini_set("log_errors", 1);
ini_set("error_log", __DIR__ . "/log/my_log.log");
ini_set("log_errors_max_len", 0);

Io vorrei importare questo script in ogni pagina php (anziché copiarlo ogni volta), ma:

- se importo lo script in ogni pagina php, usando include/require, lo script non ha effetti.. e gli errori vengono memorizzati nel file error log nativo di apache (uso linux.. quindi in /var/log/apache2/error.log),
- mentre se copio lo script ad inizio di ogni pagina php ottengo il risultato voluto (cioè gli errori/messaggi nel file mio "my_log.log").

Dove sbaglio?
 
ciao
scusa ma vorrei provare a leggere il manuale php con te (solo ini_set),
pensando al sito in "produzione"

-----
error_reporting(E_ALL);

-----
ini_set("display_errors", 1);
This determines whether errors should be printed to the screen as part of the output
or if they should be hidden from the user.

sono dell'idea che l'utente del sito non debba vedere i possibili errori (FALSE),
ma, dopo la loro intercettazione, devono essere adeguatamente gestiti,
quando un errore è incorreggibile,
mi scuso con l'utente, avverto l'amministratore in qualche modo ed interrompo l'esecuzione

-----
ini_set("display_startup_errors", 1);
Even when display_errors is on, errors that occur during PHP's startup sequence are not displayed.
It's strongly recommended to keep display_startup_errors off, except for debugging.

mi rimetto al manuale e, fermamente, accetto la sua raccomandazione

-----
ini_set("track_errors", 1);
If enabled, the last error message will always be present in the variable $php_errormsg.

non credo sia importante, di solito gli errori che si verificano "in produzione" devono essere immediatamente gestiti,
vedi errori "provenienti" dal db, ma dipende da come sono sviluppati gli script

-----
ini_set("log_errors", 1);
Tells whether script error messages should be logged to the server's error log or error_log.
This option is thus server-specific.

ok (true) per avere il log in un proprio file e non in quello di sistema

-----
ini_set("error_log", __DIR__ . "/log/my_log.log");
Name of the file where script errors should be logged.
The file should be writable by the web server's user. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

ho aggiunto io i punti esclamativi, per evidenziare che,
non solo il file deve essere "writable by the web server's user" ma lo deve essere anche la "dir" che lo contiene ovvero "log"
e dal poco che conosco, lo devono essere anche tutte le "dir" che stanno sopra alla "log"
ovvero, per cominciare, la "dir" che contiene gli script da eseguire
perchè é li che é allocata la "log"

tutto ciò non è proprio in favore della sicurezza del server, tutte le "dir" del sito web sono alla mercè dei "web server's user"

meglio creare una "dir" a se stante, che non interagisca con le "dir" del sito web

(730 precompilato non fa testo, php non gestiva un sito web, ma di fatto era un ftp per trasferire un file
per questa ragione il log era posizionato nella stessa "dir" degli script)

If the special value syslog is used, the errors are sent to the system logger instead.
On Unix, this means syslog(3) and on Windows NT it means the event log.
The system logger is not supported on Windows 95.
See also: syslog(). If this directive is not set, errors are sent to the SAPI error logger.
For example, it is an error log in Apache or stderr in CLI. See also error_log().

-----
ini_set("log_errors_max_len", 0);
Set the maximum length of log_errors in bytes. In error_log information about the source is added.
The default is 1024 and 0 allows to not apply any maximum length at all.
This length is applied to logged errors, displayed errors and also to $php_errormsg, but not to explicitly called functions such as error_log()().

non l'ho mai utilizzato per evitare di perdere dei messaggi, se non ho la possibilità di leggere con frequenza i log

-----
ritorno alla soluzione per me migliore,
PHP:
ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('display_errors', FALSE);
ini_set('log_errors', TRUE);
ini_set('error_log', 'C:/Temp/_mySiteErrors.log');

-----
perchè non funziona, quanto hai proposto ?
1 - vedi i permessi "writable"
2 - assicurati che venga incluso il file che contiene i tuoi ini_set, metti un "echo" come prima linea
3 - non ho in mente altro (poche idee ....)
ciao
Marino
 
:)

Tirata di orecchie.. Hai ragione, avrei dovuto leggere meglio.. Ma mentre cambiavo la configurazione degli ini_set(), la questione della scrittura del file di Log proprio non riesco ancora a capirla.

Intanto, fra i tanti, mi hai dato un grosso consiglio.. usare una cartella fuori della ROOT..

Io ho questa situazione:

ROOT
|
+---CONFIG---myconfig.php
|
+---LOG---mylog.php
|
+---index.php

1) se il codice con gli ini_set() lo inserisco direttamente all'inizio di index.php.. in file mylog.log viene scritto. Quindi i permessi ci sono..

2) se il codice con gli ini_set() lo inserisco in un file myconfig.php che poi richiamo in index.php con un include_once (ho usato "if file_exists().. con l'echo.. viene incluso, ma il file mylog.log NON viene scritto

Non capisco perché? Mi viene da pensare che le funzioni ini_set() non possano essere importati da un file esterno.. mah!

PS. alché, visto che a me servono dei msg promemoria tipo:
- "L'utente 1 si è loggato alle ore X"
- "L'utente 2 ha lanciato la query Q alle ore Y"
- "L'utente 3 ha modificato la tabella Z"
ecc..

..mi sto creando direttamente un file .txt (o meglio ancora .csv).
 
Tirata di orecchie
no,no, solo che leggendo quanto scrivono le persone, mi vengono dei dubbi, quindi meglio rivedere/approfondire l'argomento

Non capisco perché? Mi viene da pensare che le funzioni ini_set() non possano essere importati da un file esterno.. mah!
il problema sta nel "__DIR__" che hai aggiunto, perché la costante, rispecchia la posizione dello script, ovvero cambia ad ogni esecuzione di script, dovresti sostituire con un valore fisso
il mio file "php.ini" (mio, non di php) viene incluso ed eseguito correttamente (vedi anche 730 è posto all'inizio di "credenziali" e funziona)
PS. alché, visto che a me servono dei msg promemoria tipo:
- "L'utente 1 si è loggato alle ore X"
- "L'utente 2 ha lanciato la query Q alle ore Y"
- "L'utente 3 ha modificato la tabella Z"
un log operativo che deve essere gestito nell'applicazione, puoi creare una funzione che assolve il compito ed ogni volta che serve la chiami passando gli adeguati parametri
la funzione (assieme ad altre di carattere generale) può essere collocata in uno script che viene incluso
io ho inserito le seguenti nell'estensione della classe PDO che mi sono creato (anche se potevo collocarle altrove)
PHP:
public function MyLog($par1='',$par2='',$par3='') // può contenere anche il log operativo
public function MyErr($par1='',$par2='',$par3='') // termina l'applicazione in modo appropriato in caso di errore irreversibile
la funzione di errore viene chiamata in particolare quando riscontro delle anomalie relative alla sicurezza, richiamando lo script che invia la mail a chi deve riceverla e termina
PHP:
$swN = $this->SWN; require_once NS('Imailsoliderr'); logoff();
print "ERRORE INATTESO, contatta l'amministratore del sistema";
die;
ciao
Marino
 
Ultima modifica:
modificato __DIR__ con:
$path_log = dirname(__FILE__) . '/../log/my_log.log';
ini_set('error_log',$path_log);
..e funziona tutto alla perfezione!

Ero convinto che __DIR__ fosse una costante della radice della ROOT del progetto (ma pensandoci meglio php che ne potrebbe sapere dove comincia la radice del mio progetto, se nessuno glielo dice). Mi ero ricavato anche il "suo" echo.. ma evidentemente l'avevo testato solo da index.php. Ora capisco perché con i collegamenti faccio sempre casini!

Grazie Marino, notevole :)

Lascio aperto il post per aggiornare la funzione di log.. Interessante l'invio del Log critico, tramite mail! ;)
 

Discussioni simili