<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Debug%3A_log4PHP</id>
	<title>Debug: log4PHP - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Debug%3A_log4PHP"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Debug:_log4PHP&amp;action=history"/>
	<updated>2026-08-30T06:30:34Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Debug:_log4PHP&amp;diff=2000&amp;oldid=prev</id>
		<title>192.168.1.2: /* Guardar objectes en una variable de sessió */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Debug:_log4PHP&amp;diff=2000&amp;oldid=prev"/>
		<updated>2009-03-23T09:34:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Guardar objectes en una variable de sessió&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Teoria bàsica=&lt;br /&gt;
Log4php is a logging package for php. log4php és un projecte de la Apache Software Foundation, i és un port a PHP del log4j (per a Java). VTiger uses this logging package,so we need to understand it.&lt;br /&gt;
&lt;br /&gt;
Està explicat a la wiki de vTiger: http://wiki.vtiger.com/index.php/Log4php&lt;br /&gt;
&lt;br /&gt;
*quick setup guide: http://incubator.apache.org/log4php/qsg.html&lt;br /&gt;
*Apache Log4php Usage Example: http://incubator.apache.org/log4php/usage.html&lt;br /&gt;
&lt;br /&gt;
'''Log Levels''': here is the complete list, starting with the lowest loglevel, ending with the highest:&lt;br /&gt;
* '''debug''' - All debugging info which helps you to understand what your project actually does. Use it as you please, but don't start to mess around. Mind you that you have to read all those messages in a debuggin case. And don't forget to write GOOD messages which really help you&lt;br /&gt;
* '''info''' - Log if you want to know if several steps have been reached. Those messages are less than debug messages. For example you could log an user login at info level, or the sending of an invoice mail or an order or something like that.&lt;br /&gt;
* '''warn''' - Log if you run in a unexpected behaviour, which is strange, but which do not cause any trouble. For example if an request comes without an expected GET parameter. This could mean that you have an error in your site, probably a wrong link, or somebody wants to do something evil with your URLs.&lt;br /&gt;
* '''error''' - All errors go here. Log exceptions, if you cannot send a mail or if page generation has failed somehow. These messages should never occure (hopefully). If they do you have definitly do some coding.&lt;br /&gt;
* '''fatal''' - Use this one if you have an error which corrupts your data! Or if you have to to some die(); which is not a normal case. Fatal means you have problems, and probably the sort of problems which prevent you from sleeping. &lt;br /&gt;
&lt;br /&gt;
==Ús de log4php==&lt;br /&gt;
&lt;br /&gt;
VTiger's index.php code opens loggers like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$log =&amp;amp; LoggerManager::getLogger('index');&lt;br /&gt;
$seclog =&amp;amp; LoggerManager::getLogger('SECURITY');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This opens a log for the index.php file itself called &amp;quot;index&amp;quot;, and another for security logging called &amp;quot;SECURITY&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To log a line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$log-&amp;gt;debug(&amp;quot;This is a DEBUG level message for the &amp;quot;index&amp;quot; log.']); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, ''$log-&amp;gt;debug()'' logs a ''DEBUG'' level message to the logger referenced by $log. The functions ''fatal()'', ''error()'', ''warn()'', and ''info()'' log ''FATAL'', ''ERROR'', ''WARN'', and ''INFO' level messages. &lt;br /&gt;
&lt;br /&gt;
==Configuració==&lt;br /&gt;
&lt;br /&gt;
The log configuration file specifies details for each named logger. If there is no entry for a logger by that name, no messages for that logger are logged.&lt;br /&gt;
&lt;br /&gt;
The configuration file is the least documented part of log4php. For VTiger the file is '''log4php.properties'''.&lt;br /&gt;
&lt;br /&gt;
Here's an example from our configuration file that we added to get logs from VTiger's main index.php:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
log4php.logger.index=DEBUG,A8&lt;br /&gt;
log4php.appender.A8=LoggerAppenderRollingFile&lt;br /&gt;
log4php.appender.A8.MaxFileSize=3MB&lt;br /&gt;
log4php.appender.A8.MaxBackupIndex=10&lt;br /&gt;
log4php.appender.A8.layout=LoggerLayoutTTCC&lt;br /&gt;
log4php.appender.A8.layout.ContextPrinting=&amp;quot;true&amp;quot;&lt;br /&gt;
log4php.appender.A8.layout.DateFormat=&amp;quot;%c&amp;quot;&lt;br /&gt;
log4php.appender.A8.File=logs/index.log &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name of the log is the identifier following ''log4php.logger.''. In this case the logger is named ''index''. In VTiger you open the ''index'' log with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$log =&amp;amp; LoggerManager::getLogger('index');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the same line as the log name is the logging level. In this case it's ''DEBUG''. That means that messages at level ''DEBUG'' and above are logged. The levels from highest to lowest are ''FATAL'', ''ERROR'', ''WARN'', ''INFO'' and ''DEBUG''. When the log entry specifies level ''DEBUG'', messages at all levels will be logged.&lt;br /&gt;
&lt;br /&gt;
Here's an entry for security logging that ships with VTiger:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
log4php.logger.SECURITY=FATAL,A2&lt;br /&gt;
log4php.appender.A2=LoggerAppenderRollingFile&lt;br /&gt;
log4php.appender.A2.MaxFileSize=3MB&lt;br /&gt;
log4php.appender.A2.MaxBackupIndex=10&lt;br /&gt;
log4php.appender.A2.layout=LoggerLayoutTTCC&lt;br /&gt;
log4php.appender.A2.layout.ContextPrinting=&amp;quot;true&amp;quot;&lt;br /&gt;
log4php.appender.A2.layout.DateFormat=&amp;quot;%c&amp;quot;&lt;br /&gt;
log4php.appender.A2.File=logs/security.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every line in a log configuration entry includes a unique ID for that entry. This ID tells log4php which lines go together. The index log entry ID is ''A8''. The security entry ID is ''A2''.&lt;br /&gt;
&lt;br /&gt;
The name of the security log is ''SECURITY''. In VTiger you open the ''SECURITY'' logger like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$seclog =&amp;amp; LoggerManager::getLogger('SECURITY');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The ''File='' line of each entry specifies the log filename. For index.php it's ''logs/index.log''. For the security log it's ''logs/security.log''.&lt;br /&gt;
&lt;br /&gt;
The log files are intentionally created write-only. The code comment is ''Denying read option for log file. Added for Vulnerability fix''. You can use a script to copy the logs to somewhere safe and change the permissions of the copies. &lt;br /&gt;
&lt;br /&gt;
==How to turn on the DEBUG feature for troubleshooting==&lt;br /&gt;
&lt;br /&gt;
Edit ''log4php.properties'' file in vtiger folder and change&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
log4php.rootLogger=FATAL,A1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
to&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
log4php.rootLogger=DEBUG,A1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La idea del rootLogger és que recull els log de tots els logger:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
log4php.rootLogger=DEBUG,A1&lt;br /&gt;
log4php.appender.A1=LoggerAppenderRollingFile&lt;br /&gt;
log4php.appender.A1.MaxFileSize=3MB&lt;br /&gt;
log4php.appender.A1.MaxBackupIndex=10&lt;br /&gt;
log4php.appender.A1.layout=LoggerLayoutTTCC&lt;br /&gt;
log4php.appender.A1.layout.ContextPrinting=&amp;quot;true&amp;quot;&lt;br /&gt;
log4php.appender.A1.layout.DateFormat=&amp;quot;%c&amp;quot;&lt;br /&gt;
log4php.appender.A1.File=logs/projecte.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Implementació mínima en un projecte=&lt;br /&gt;
&lt;br /&gt;
El primer que faig és construir-me un projecte petit a partir del vtiger. És important conservar els permisos dels fitxers. El millor és que el propietari sigui www-data. He de copiar la carpeta els fitxers de vtiger/ a projecte/ conservant els atributs mitjançant l'opció --preserve.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ mkdir /home/joan/projecte&lt;br /&gt;
 $ cd vtiger&lt;br /&gt;
 $ sudo cp -R --preserve log4php ../projecte&lt;br /&gt;
 $ sudo cp -R --preserve logs ../projecte&lt;br /&gt;
 $ sudo cp --preserve include/logging.php ../projecte/include&lt;br /&gt;
 $ sudo cp --preserve log4php.properties ../projecte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
o bé crear manualment els fitxers i fer que el propietari sigui www-data&lt;br /&gt;
&lt;br /&gt;
i és que si ens fixem bé, el propietari dels fitxers del projecte és www-data. Mirant vtiger els atributs de index.php són:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-rw-r--r-- 1 www-data root 23021 2009-03-18 10:21 index.php&lt;br /&gt;
$ sudo chown www-data:root index.php&lt;br /&gt;
o bé, per canviar una carpeta&lt;br /&gt;
$ sudo chown -R www-data:root logs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per buidar els fitxers dins de /logs, podem utilitzar la comanda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo cp /dev/null fitxer_a_esborrar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fitxer index.php:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once('include/logging.php');&lt;br /&gt;
global $seclog;&lt;br /&gt;
&lt;br /&gt;
$log =&amp;amp; LoggerManager::getLogger('INDEX');&lt;br /&gt;
$seclog =&amp;amp; LoggerManager::getLogger('SECURITY');&lt;br /&gt;
&lt;br /&gt;
$log-&amp;gt;debug(&amp;quot;****Starting for new session&amp;quot;);&lt;br /&gt;
$log-&amp;gt;info(&amp;quot;estem a index.php&amp;quot;);&lt;br /&gt;
$seclog-&amp;gt;debug('operació permesa');&lt;br /&gt;
echo &amp;quot;prova logs&amp;quot;;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Com veig, tinc dos loggers: ''index'' i ''SECURITY'', i vull registrar els log al fitxer index.log (per  al logger ''index''), security.log (per al logger ''SECURITY'') i projecte.log (per als dos loggers). Per tal que això sigui possible, el fitxer ''log4php.properties'' queda de la següent manera:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
log4php.rootLogger=DEBUG,A1&lt;br /&gt;
log4php.appender.A1=LoggerAppenderRollingFile&lt;br /&gt;
log4php.appender.A1.MaxFileSize=3MB&lt;br /&gt;
log4php.appender.A1.MaxBackupIndex=10&lt;br /&gt;
log4php.appender.A1.layout=LoggerLayoutTTCC&lt;br /&gt;
log4php.appender.A1.layout.ContextPrinting=&amp;quot;true&amp;quot;&lt;br /&gt;
log4php.appender.A1.layout.DateFormat=&amp;quot;%c&amp;quot;&lt;br /&gt;
log4php.appender.A1.File=logs/projecte.log&lt;br /&gt;
&lt;br /&gt;
log4php.logger.INDEX=DEBUG,A4&lt;br /&gt;
log4php.appender.A4=LoggerAppenderRollingFile&lt;br /&gt;
log4php.appender.A4.MaxFileSize=3MB&lt;br /&gt;
log4php.appender.A4.MaxBackupIndex=10&lt;br /&gt;
log4php.appender.A4.layout=LoggerLayoutTTCC&lt;br /&gt;
log4php.appender.A4.layout.ContextPrinting=&amp;quot;true&amp;quot;&lt;br /&gt;
log4php.appender.A4.layout.DateFormat=&amp;quot;%c&amp;quot;&lt;br /&gt;
log4php.appender.A4.File=logs/index.log&lt;br /&gt;
&lt;br /&gt;
log4php.logger.SECURITY=DEBUG,A2&lt;br /&gt;
log4php.appender.A2=LoggerAppenderRollingFile&lt;br /&gt;
log4php.appender.A2.MaxFileSize=3MB&lt;br /&gt;
log4php.appender.A2.MaxBackupIndex=10&lt;br /&gt;
log4php.appender.A2.layout=LoggerLayoutTTCC&lt;br /&gt;
log4php.appender.A2.layout.ContextPrinting=&amp;quot;true&amp;quot;&lt;br /&gt;
log4php.appender.A2.layout.DateFormat=&amp;quot;%c&amp;quot;&lt;br /&gt;
log4php.appender.A2.File=logs/security.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La lectura del fitxer de configuració és fa en el fitxer include/logging.php:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
define('LOG4PHP_DIR', 'log4php');&lt;br /&gt;
define('LOG4PHP_DEFAULT_INIT_OVERRIDE', true);&lt;br /&gt;
&lt;br /&gt;
require_once(LOG4PHP_DIR.'/LoggerManager.php');&lt;br /&gt;
require_once(LOG4PHP_DIR.'/LoggerPropertyConfigurator.php');&lt;br /&gt;
&lt;br /&gt;
$config = new LoggerPropertyConfigurator();&lt;br /&gt;
$config-&amp;gt;configure('log4php.properties');&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aquí et pots descarregar el codi mínim per fer funcionar un projecte PHP que implementa log4php per a debugar i informar d'errors: [[Image:Projecte_log4php.zip‎]]&lt;br /&gt;
&lt;br /&gt;
Per veure la última línia d'un fitxer de log:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ tail -f fitxer.log | grep 'XXX'&lt;br /&gt;
$  sudo tail -f index.log | grep 'DEBUG'&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on ''XXX'' és la cadena a buscar&lt;br /&gt;
&lt;br /&gt;
=Guardar objectes en una variable de sessió=&lt;br /&gt;
Per tal de no haver de crear la variable $log cada vegada, que representa una referència a l'objecte LoggerManager, hem de ser capaços d'emmagatzemar aquest objecte en una variable de sessió. Això és útil quna utilitzem tècniques com AJAX o similar.&lt;br /&gt;
&lt;br /&gt;
L'exemple mínim seria:&lt;br /&gt;
&lt;br /&gt;
us_login.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
require_once('include/logging.php');&lt;br /&gt;
session_start();&lt;br /&gt;
if (strpos ($_SERVER[&amp;quot;REQUEST_URI&amp;quot;], &amp;quot;us_login.php&amp;quot;) == 0 &amp;amp; !isset($_SESSION['login'])) {&lt;br /&gt;
//logging&lt;br /&gt;
$log =&amp;amp; LoggerManager::getLogger('INDEX');&lt;br /&gt;
$log-&amp;gt;debug(&amp;quot;****Starting for new session&amp;quot;);&lt;br /&gt;
$_SESSION['log']=serialize($log);&lt;br /&gt;
header(&amp;quot;Location: us_login.php&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
us_login2.php (on es comprova si les dades de login/password són correctes)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
header (&amp;quot;Content-Type: text/html; charset=iso-8859-1&amp;quot;);&lt;br /&gt;
require_once('include/logging.php');&lt;br /&gt;
session_start();&lt;br /&gt;
$log=unserialize($_SESSION['log']);&lt;br /&gt;
&lt;br /&gt;
$vlogin=trim($_POST['vlogin']);&lt;br /&gt;
$vpwd=trim($_POST['vpwd']);&lt;br /&gt;
$key = '123456789012345678901234567890123456789012345678901234567890';&lt;br /&gt;
$vpwd = mcrypt_cbc(MCRYPT_RIJNDAEL_128, substr($key,0,32), $vpwd, MCRYPT_ENCRYPT,substr($key,32,16));&lt;br /&gt;
$vpwd=bin2hex($vpwd);&lt;br /&gt;
&lt;br /&gt;
include 'config_db.php';&lt;br /&gt;
include 'open_db.php';&lt;br /&gt;
&lt;br /&gt;
$sql = &amp;quot;SELECT * FROM LOGIN WHERE login='&amp;quot; . $vlogin . &amp;quot;'&amp;quot;;&lt;br /&gt;
$log-&amp;gt;debug($sql);&lt;br /&gt;
$result = mysql_query($sql);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
d'aquesta manera es pot debugar si la sentència SQL que executem està ben formada. Fixem-nos que fent-ho d'aquesta manera la sentència &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$log =&amp;amp; LoggerManager::getLogger('INDEX');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
que és la que inicialitza l'objecte, només s'ha de fer una vegada.&lt;br /&gt;
&lt;br /&gt;
'''serialize''' serveix per generar una representació de l'objecte apta per a ser emmagatzemada en una variable de sessió. Al contrari, '''unserialize''' fa el contrari: a partir de la cadena emmagatzemada en la variable de sessió, genera la referència de l'objecte al qual volem fer referència.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, març 2009&lt;br /&gt;
[[Categoria: Programació PHP]]&lt;/div&gt;</summary>
		<author><name>192.168.1.2</name></author>
		
	</entry>
</feed>