:::: MENU ::::

Activar log de queries de MySQL en Magento 2

3.20 avg. rating (64% score) - 10 votes

Ahora que todos estamos empezando con Magento 2, nos van surgiendo necesidades varias para investigar posibles problemas o el funcionamiento y organización general del código.

En el marco de estas investigaciones, es habitual que necesitemos ver a nivel de consultas SQL, qué está haciendo Magento en determinadas situaciones. En Magento 1 podíamos activar un log de consultas y por supuesto en Magento 2 también podemos hacerlo.

Para ello deberemos recurrir a la configuración de Dependency Injection por medio del archivo di.xml de nuestro módulo. En dicho archivo deberemos añadir una configuración preference para el logger de consultas SQL.

En primer lugar echemos un vistazo a la configuración por defecto para el logger de consultas. Si abrimos el archivo app/et/di.xml de nuestra instalación de Magento 2, podremos encontrar la siguiente línea:

<preference for="Magento\Framework\DB\LoggerInterface" type="Magento\Framework\DB\Logger\Quiet"/>

Con la línea anterior estamos indicando a Magento que cuando alguien intente instanciar una clase que implemente el interfaz LoggerInterface por Dependency Injection, le asigne automáticamente una instancia de clase Magento\Framework\DB\Logger\Quiet.

Este es el comportamiento por defecto del logger de MySQL y como podemos deducir del nombre de la clase asignada Quiet, por defecto no se realiza ningún tipo de logging de consultas en Magento 2.

Si queremos activar el logging, deberemos cambiar esta configuración en alguno de nuestros módulos. Para ello en un archivo di.xml dentro de la carpeta etc del módulo, añadiremos una línea como la siguiente:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    . . .
    <preference for="Magento\Framework\DB\LoggerInterface" type="Magento\Framework\DB\Logger\File"/>
    . . .
</config>

En este caso estamos indicando a Magento que cuando alguien intente instanciar una clase que implemente el interfaz LoggerInterface por Dependency Injection, le asigne la clase Magento\Framework\DB\Logger\File, que como podemos deducir del nombre File, realiza el log de consultas sobre un archivo de texto.

Si recordáis, configurar todo esto en Magento 1 era mucho más complicado puesto que debíamos extender o sobreescribir una clase para conseguir activar el log de consultas.

En aquel caso, además podíamos configurar el logger con diversos parámetros, como si realizar el log para todas las consultas o únicamente para las que tuviesen una duración determinada.

En Magento 2 por supuesto podemos realizar estas mismas configuraciones, que también deberemos realizar en el mismo archivo di.xml, en este caso con unas líneas como las siguientes:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    . . .
    <type name="Magento\Framework\DB\Logger\File">
        <arguments>
            <argument name="logAllQueries" xsi:type="boolean">true</argument>
            <argument name="debugFile" xsi:type="string">debug/mysql.log</argument>
        </arguments>
    </type>
    . . .
</config>

La lista completa de los parámetros que podemos configurar para el logger, podemos encontrarla en el constructor de la clase Magento\Framework\DB\Logger\File, que se muestra a continuación:

    public function __construct(
        Filesystem $filesystem,
        $debugFile = 'debug/db.log',
        $logAllQueries = false,
        $logQueryTime = 0.05,
        $logCallStack = false
    )

Como puede observarse, tenemos los mismos parámetros que teníamos en Magento 1:

  • $debugFile. Permite indicar el archivo donde se realiza el registro de queries.
  • $logAllQueries. Permite indicar si se registran todas las queries, independientemente de su duración.
  • $logQueryTime. Si indicamos un tiempo, las queries que tengan una duración mayor, quedarán registradas.
  • $logCallStack. Si indicamos true, además de registrar la query, registraremos el stack de llamadas PHP.

En nuestro caso, según la configuración indicada, hemos indicado la ruta del archivo de log y que se registren todas las queries.




One Comment

  • Responder Abraham |

    Hola Daniel,
    Tengo unos fallos a la hora de realizar los pedidos, que no me registra los datos en ciertas tablas de la DDBB y no consigo ver los errores que pueda lanzar.
    He visto este post y al buscar en mi archivo app/etc/di.xml no pone la preferencia como indicas, me pone lo siguiente:

    ¿Esto quiere decir que lo está registrando en algún sitio?

    Por cierto, me puedes ayudar con el fallo que te comento.
    Gracias.

Hey! Qué opinas sobre el artículo?