Es común ver esto: estás desarrollando una API en Spring Boot, usas Hibernate, y quieres ver las sentencias SQL que se ejecutan. Pones spring.jpa.properties.hibernate.show_sql=true en tu application.properties y ¡voilà!, aparecen en la consola. El problema es cuando quieres que esas queries vayan al archivo de log, al famoso app.log, y ahí no hay rastro. La clave no es show_sql, sino los niveles de logging de Hibernate.
Controlando el logging de Hibernate en tus archivos
Para que tus sentencias SQL de Hibernate aparezcan en el archivo de log (y no solo en la consola), necesitas decirle a tu framework de logging (Logback o Log4j2, que Spring Boot usa por defecto) que capture los mensajes del logger interno de Hibernate. Esto se hace ajustando los niveles de log directamente en application.properties:
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Con logging.level.org.hibernate.SQL=DEBUG, verás todas las sentencias SQL que Hibernate genera. Esto es súper útil para entender qué está pasando a nivel de base de datos. Si además quieres ver los valores de los parámetros que se están bindando a esas queries —algo que yo, de hecho, uso mucho en desarrollo local—, entonces subes el nivel a TRACE para org.hibernate.type.descriptor.sql.BasicBinder.
Aquí es donde muchos se confunden. spring.jpa.properties.hibernate.show_sql=true solo imprime por consola, usando System.out. No se integra con tu sistema de logging como Logback, por eso no termina en el archivo. El approach de logging.level es el camino correcto si quieres tus logs centralizados.
Cuando el TRACE se vuelve un dolor de cabeza
Ojo con usar TRACE en ambientes productivos. Loggear todos los parámetros de cada query puede generar un volumen de log gigantesco y, además, impactar el rendimiento. En un proyecto hace unos años, un cliente se quejaba de que los logs de su aplicación estaban llenando los discos en horas. Resultó que tenían el BasicBinder en TRACE en producción. Un dolor de cabeza innecesario. Además, puede exponer datos sensibles en los logs, lo cual no es ideal.
Mi recomendación es usar DEBUG para org.hibernate.SQL en entornos de staging o incluso producción (si es realmente necesario para el monitoreo), y reservar TRACE para el desarrollo local o para depurar problemas muy específicos donde necesitas ver exactamente qué valores se están enviando a la base de datos.
En definitiva, si buscas que tus sentencias SQL y sus parámetros lleguen a tu archivo de log de Spring Boot, olvídate del show_sql y ve directo a configurar los niveles de logging de Hibernate. Es la forma más limpia y controlada de hacerlo. Funciona perfecto para depurar, pero sé inteligente con los niveles en producción: a veces, menos es más, y un TRACE excesivo puede costarte tiempo y espacio en disco que no tienes.