La teoría es muy sencilla se añade un unique_id cuando la petición llega a Apache2 y se pasa como header a la aplicación web o API donde se almacenará en los headers.
Una vez en la aplicación podemos grabarla en logs o tablas para tener todo relacionado una petición de entrada y salida.
Para el ejemplo utilizare:
- Ubuntu Server con Apache2 donde añadir el unique_id cuando una petición llega y registrar en el acces_log y error_log el unique_id
- Una API en PHP, muy simple, sin framework, para ver como registramos en un log el unique_id y en base de datos y log de base de datos
- Servidor de base de datos MySql para ver el seguimiento de ese unique_id en las consultas.
Esta es la base del proyecto, al final dejo el repo del proyecto completo.
1) Añadir un unique_id al log de Apache2
Voy a crear el directorio del proyecto de test, sino tenemos creada la ruta del proyecto al reiniciar apache nos dará error /data/code/testid/apiy podemos crear dentro un index.php para el código que después pondremos
Vamos con la parte del servidor Apache2, ahora asignamos un , un id único a cada petición que llega a Apache2
En Apache2 tenemos que tener habilitar los mods
sudo a2enmod unique_id
sudo a2enmod headers
sudo service apache2 restart
Ahora en el fichero de virtualhost del dominio que queréis hacer el seguimiento añadir los siguiente en la parte final del VirtualHost
# Follow the request.
#
# --- Header con el UNIQUE_ID real generado por Apache ---
Header set X-Trace-Id "%{UNIQUE_ID}e"
# --- Log de errores personalizado con UNIQUE_ID ---
ErrorLog ${APACHE_LOG_DIR}/error_testuid.log
ErrorLogFormat "[%t] [pid %P:tid %T] [client %{REMOTE_ADDR}e] [%{UNIQUE_ID}e] %M"
# --- Log de acceso con el UNIQUE_ID ---
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{UNIQUE_ID}e" combined_with_trace
CustomLog ${APACHE_LOG_DIR}/access_testuid.log combined_with_trace
#
</VirtualHost>
Al acceder al web en el registro del log access_testui.log queda registrado una línea como la siguiente:
192.168.65.1 - - [05/Nov/2025:16:55:20 +0100] "GET / HTTP/1.1" 200 857 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:144.0) Gecko/20100101 Firefox/144.0" aQt0ks0MqoURL4qS90CdAwAAAAI
donde el ultimo parametro aQt0ks0MqoURL4qS90CdAwAAAAI es el unique_id de la peticiónSi generamos un error el formato del error será el siguiente:
[Wed Nov 05 16:56:57 2025] [pid 467:tid [client 192.168.65.1] [aQtzybVhXkICAWgVyKGengAAAAE] PHP Fatal error: Test page error in /data/code/testid/web/error.php on line 3
donde el código aQtzybVhXkICAWgVyKGengAAAAE entre corchetes es el unique_id de la peticiónPara probar el error puedes crear una página .php con este código dentro:
trigger_error("Test page error", E_USER_ERROR);
Los parámetros que se pueden poner en la configuración de los logs son variados y aquí los podéis encontrar https://httpd.apache.org/docs/2.4/mod/mod_log_config.html
Ahora lo pasamos a nuestra aplicación web o api con la siguiente línea pasamos el ID a la aplicación
RequestHeader set uniqueid %{UNIQUE_ID}e
2) Recoger el unique_id en la aplicación web o api
En PHP este unique id lo recogemos desde la variable de entorno $_SERVER¿Cómo utilizar el unique_id generado en la petición para realizar un seguimiento?
Utilizaré un ejemplo de una API, el ejemplo es muy simple en PHP pero podréis ver como utilizar este unique_id a lo largo de todo el programa.
La API recibí un json con datos:
- Guardamos el json recibido en un log con el unique_id para identificar la petición
- Hacemos modificaciones en el json a lo largo de la aplicación y cada modificación la guardamos en un log junto al unique_id
- Antes de devolver el resultado guardamos en un log lo que devolvemos.
Este es el código
# Store the input data in a variable
$_input = file_get_contents( 'php://input');
$unique_id = $_SERVER['UNIQUE_ID'];
# Save the input json along with the unique_id that comes from Apache2
error_log( "[" . date("Y-m-d H:s:i") . "] - input - " . $unique_id . " - " . $_input, 3, "./app.log");
# Decode the JSON
$obj_input = json_decode( $_input);
# Delete libros obtject
unset($obj_input->libreria->libros);
error_log( "[" . date("Y-m-d H:s:i") . "] - output - " . $unique_id . " - Eliminado el objeto libros", 3, "./app.log");
# Add usuarios object
$obj_input->usuarios = new stdClass();
$obj_input->usuarios->total = 25;
error_log( "[" . date("Y-m-d H:s:i") . "] - output - " . $unique_id . " - Añadido el objeto usuarios", 3, "./app.log");
# Log response
error_log( "[" . date("Y-m-d H:s:i") . "] - output - " . $unique_id . " - " . json_encode( $obj_input), 3, "./app.log");
# Return the result of the request.
echo ( json_encode( $obj_input));
Lo mismo podría ser una aplicación Web
3) Registrar el unique_id en MySql
Igual que registramos este unique_id en los logs para identificar una petición podemos relacionar también los logs de MySql para saber que consultas están relacionadas con una petición dada.Lo primero para esto es activar los logs de MySql porque por lo general no vienen activados.
Para hacerlo de forma temporal lanzar este comando desde el terminal.
mysql -u root -proot -e "set global general_log=1; set global general_log_file='/var/log/mysql/mysql.log'"
Y con un tail se pueden ver los mensajes que van al MySql, esto registra todo lo que va al MySql así que cuidado en producción porque el log tiende al infinito.tail -f /var/log/mysql/mysql.log
Ahora vamos a añadir el unique_id en la consulta para que quede reflejado en los logs.Se añade en /* unique_id */ delante de la sentencia SQL
Desde PHP lo haremos así:
$unique_id = $_SERVER['UNIQUE_ID'];
$conn->query(" /* " . $unique_id . " */ SELECT * FROM usuarios");
Y en el log se veran asi los registros:
2025-11-06T13:55:32.686756Z 162 Quit
2025-11-06T13:56:14.007907Z 163 Connect root@localhost on testdb using TCP/IP
2025-11-06T13:56:14.008280Z 163 Query /* aQyo_hQoGatvW0S1-rmyRQAAAAY */ SELECT * FROM usuarios
2025-11-06T13:56:14.008722Z 163 Quit
4) Conclusiones
De esta forma podemos hacer un seguimiento a una determinada petición y ver por donde va pasando en los logs:- Logs de Apache2
- Logs de aplicación
- Logs de MySql
Cuanta mas información tengamos mejor, y mejores decisiones tomaremos.
También podemos hacer este seguimiento en otros entornos nginx, Python, PostgreSQL, SQL Server, la idea es sencilla al recibir una petición se ha de generar un unique_id y ir pasandolo.
Repo del artículo https://github.com/depruebas/follow-the-request
Y esto es todo, feliz programming!!!
Saludos
Alex
:-)
/
















