Desactivar la salida de la consola de registro de hibernación

84

Estoy usando hibernate 3 y quiero evitar que descargue todos los mensajes de inicio en la consola. Intenté comentar las líneas stdout en log4j.properties pero no tuve suerte. He pegado mi archivo de registro a continuación. También estoy usando eclipse con la estructura de proyecto estándar y tengo una copia de log4j.properties tanto en la raíz de la carpeta del proyecto como en la carpeta bin.

### mensajes de registro directos a stdout ###
# log4j.appender.stdout = org.apache.log4j.ConsoleAppender
# log4j.appender.stdout.Target = System.out
# log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
# log4j.appender.stdout.layout.ConversionPattern =% d {ABSOLUTE}% 5p% c {1}:% L -% m% n

### mensajes directos al archivo hibernate.log ###
log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.File = hibernate.log
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern =% d {ABSOLUTE}% 5p% c {1}:% L -% m% n

### establecer niveles de registro: para un registro más detallado, cambie 'info' a 'depurar' ###

log4j.rootLogger = advertir, stdout

# log4j.logger.org.hibernate = info
log4j.logger.org.hibernate = depurar

### registrar la actividad del analizador de consultas HQL
# log4j.logger.org.hibernate.hql.ast.AST = debug

### registra solo el SQL
# log4j.logger.org.hibernate.SQL = depurar

### registrar parámetros de vinculación JDBC ###
log4j.logger.org.hibernate.type = info
# log4j.logger.org.hibernate.type = debug

### Exportación / actualización del esquema de registro ###
log4j.logger.org.hibernate.tool.hbm2ddl = depurar

### log árboles de análisis HQL
# log4j.logger.org.hibernate.hql = debug

### registro de actividad de caché ###
# log4j.logger.org.hibernate.cache = depurar

### registrar actividad de transacciones
# log4j.logger.org.hibernate.transaction = debug

### registro de adquisición de recursos JDBC
# log4j.logger.org.hibernate.jdbc = depurar

### habilita la siguiente línea si quieres rastrear la conexión ###
### fugas al usar DriverManagerConnectionProvider ###
# log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider = trac5
Jared
fuente
2
Vale la pena mencionar que Hibernate 4+ usa el registro JBOSS.
Ojo

Respuestas:

77

Intente establecer un nivel de registro más razonable. Establecer el nivel de registro en infosignifica que solo se registran los eventos de registro en infoun nivel superior ( warn, errory fatal), es decir debug, se ignoran los eventos de registro.

log4j.logger.org.hibernate=info

o en la versión XML del archivo de configuración log4j:

<logger name="org.hibernate">
  <level value="info"/> 
</logger>

Consulte también el manual de log4j .

Juha Syrjälä
fuente
1
¿Cómo se hace esto en la versión XML?
James McMahon
Puede aplicar esto a todos los paquetes en org.hibernate haciendo lo anterior, o si desea diferentes niveles para diferentes paquetes dentro de hibernate, puede especificar esos paquetes de la misma manera.
Matthew Brubaker
3
Esto parece lógico, pero todavía no me funciona (Spring 3.0.5, Hibernate 3.5.6, sf4j-log4j bridge). Todavía recibo alrededor de 100 líneas de comentarios 'INFO' sobre el inicio de Hibernate cada vez. Entonces, esto podría no funcionar para todos.
Joseph Lust
1
@Twisted Pear: establezca su nivel de registro en WARN. Entonces no recibirás mensajes INFO.
Juha Syrjälä
5
Seguimiento, ya que esto nunca se resolvió adecuadamente: Hibernate, incluso en 4.3.0.Final, tiene muchas System.out.println()llamadas codificadas .
chrylis -cautelyoptimistic-
85

Aviso importante: la propiedad (¡parte de la configuración de hibernación, NO parte de la configuración del marco de registro!)

hibernate.show_sql

controla el registro directamente en STDOUT sin pasar por cualquier marco de registro (que puede reconocer por el formato de salida faltante de los mensajes). Si usa un marco de registro como log4j, siempre debe establecer esa propiedad en falso porque no le brinda ningún beneficio.

Esa circunstancia me irritó durante bastante tiempo porque nunca me preocupé realmente hasta que traté de escribir un punto de referencia sobre Hibernate.

usuario1050755
fuente
2
Tuve que establecer esta propiedad en mi hibernate.xmlconfiguración de Hibernate (es decir, ), a diferencia de mi configuración de registro. ¡Gracias por la anotación!
JJ Zabkar
¿Hay alguna manera de tener este registro para no pasar por alto mi marco de registro, sino para usarlo realmente? Veo algunas excepciones enviadas a la salida estándar que me gustaría registrar.
Legna
1
Con mi proyecto de arranque de Spring agregué esto en un archivo de configuración YML de perfil. Pero no funcionó, al igual que las otras publicaciones en este hilo ... Los registros de Hibernate se siguen escribiendo sin importar lo que especifique. ¿Se puede manejar en otro lugar que no sea la configuración de Logback, el archivo yaml de la aplicación y pom.xml?
Alex
33

Ejecutando:

java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.OFF);

antes de que la inicialización de hibernate funcionara para mí.


Nota: la línea de arriba desactivará todos los registros ( Level.OFF). Si quieres ser menos estricto, puedes usar

java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);

eso es lo suficientemente silencioso. (O consulte la java.util.logging.Levelclase para más niveles).

acdcjunior
fuente
1
Esto funcionó para mí:java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
RafiAlhamd
16

Puede deshabilitar muchas de las salidas de hibernación configurando estos accesorios de hibernación (configuración de hb) en falso:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

Pero si desea deshabilitar toda la información de la consola, debe establecer el nivel del registrador en NINGUNO de FATAL de clase org.hibernatecomo dice Juha.

rresino
fuente
¿Qué pasa si quiero generar estadísticas, pero no registrar?
markthegrea
7

Finalmente me di cuenta, es porque Hibernate está usando la fachada de registro slf4j ahora, para hacer un puente a log4j, necesitas poner log4j y slf4j-log4j12 jar en tu lib y luego las propiedades de log4j tomarán el control de los registros de Hibernate.

Mi configuración de pom.xml se ve a continuación:

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.4</version>
    </dependency>
Liqun Chen
fuente
En realidad, puede hacer que Hibernate use slf4j explícitamente agregando -Dorg.jboss.logging.provider=slf4jopciones a su VM. Escribí un artículo sobre el tema: medium.com/@scadge/how-to-enable-hibernate-logging-dc11545efd3d
Scadge
5

Para deshabilitar el Hibernate:selectmensaje en el registro, es posible establecer la propiedad en HibernateJpaVendorAdapter:

<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="false"/>
</bean> 
Systfile
fuente
4

Para aquellos que no quieren soluciones elegantes, solo una forma rápida y sucia de detener esos mensajes, aquí hay una solución que funcionó para mí (uso Hibernate 4.3.6 y Eclipse y no se proporcionan respuestas arriba (o se encuentran en Internet) funcionó; ni los archivos de configuración log4j ni la configuración del nivel de registro mediante programación)

public static void main(String[] args) {
    //magical - do not touch
    @SuppressWarnings("unused")
    org.jboss.logging.Logger logger = org.jboss.logging.Logger.getLogger("org.hibernate");
    java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.WARNING); //or whatever level you need

    ...
}

Lo usé en un programa tutorial descargado de este sitio.

Matej Vargovčík
fuente
3

Lo primero que debe hacer es averiguar qué marco de registro se utiliza realmente.

Muchos marcos ya están cubiertos por otros autores anteriormente. En caso de que esté utilizando Logback, puede resolver el problema agregando este logback.xml a su classpath:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <logger name="org.hibernate" level="WARN"/>
</configuration>

Más información: Logback Manual-Configuration

Christian Hoffmann
fuente
1

Cambié la "depuración" a "información" y funcionó. Aquí esta lo que hice:

Antes de:

log4j.rootLogger=debug, stdout, R

Después:

log4j.rootLogger=info, stdout, R 
user370677
fuente
0

Reemplace slf4j-jdk14-xxx.jar con slf4j-log4j12-xxx.jar. Si tiene ambos, elimine slf4j-jdk14-xxx.jar. Encontré esta solución en https://forum.hibernate.org/viewtopic.php?f=1&t=999623

Balakrishna
fuente
genial, esto funciona. Podría usar la log4j.propertiesconfiguración; log4j.logger.org.hibernate=OFF
Sebastian
0

Para deshacerse de la salida del registrador en la consola, intente esto.

ch.qos.logback.classic.LoggerContext.LoggerContext loggerContext = (LoggerContext) org.slf4j.LoggerFactory.LoggerFactory.getILoggerFactory();

loggerContext.stop();

Estas declaraciones deshabilitaron todas las salidas de la consola del registrador.

Ramesh Gowtham
fuente
0

Hay varias partes del registro de hibernación que puede controlar según la jerarquía del registrador del paquete de hibernación (más información sobre la jerarquía del registrador aquí ).

    <!-- Log everything in hibernate -->
    <Logger name="org.hibernate" level="info" additivity="false">
      <AppenderRef ref="Console" />
    </Logger>

    <!-- Log SQL statements -->
    <Logger name="org.hibernate.SQL" level="debug" additivity="false">
      <AppenderRef ref="Console" />
      <AppenderRef ref="File" />
    </Logger>

    <!-- Log JDBC bind parameters -->
    <Logger name="org.hibernate.type.descriptor.sql" level="trace" additivity="false">
      <AppenderRef ref="Console" />
      <AppenderRef ref="File" />
    </Logger>

Lo anterior fue tomado de aquí .

Además, podría tener la propiedad show-sql:trueen su archivo de configuración, ya que reemplaza la configuración del marco de registro. Más sobre eso aquí .

Chris Meyer
fuente
0

Me las arreglé para detenerme agregando esas 2 líneas

log4j.logger.org.hibernate.orm.deprecation=error

log4j.logger.org.hibernate=error

A continuación se muestra cómo se ve mi log4j.properties , solo dejo algunas líneas comentadas que explican el nivel de registro

# Root logger option
#Level/rules TRACE < DEBUG < INFO < WARN < ERROR < FATAL.
#FATAL: shows messages at a FATAL level only
#ERROR: Shows messages classified as ERROR and FATAL
#WARNING: Shows messages classified as WARNING, ERROR, and FATAL
#INFO: Shows messages classified as INFO, WARNING, ERROR, and FATAL
#DEBUG: Shows messages classified as DEBUG, INFO, WARNING, ERROR, and FATAL
#TRACE : Shows messages classified as TRACE,DEBUG, INFO, WARNING, ERROR, and FATAL
#ALL : Shows messages classified as TRACE,DEBUG, INFO, WARNING, ERROR, and FATAL
#OFF : No log messages display


log4j.rootLogger=INFO, file, console

log4j.logger.main=DEBUG
log4j.logger.org.hibernate.orm.deprecation=error
log4j.logger.org.hibernate=error

#######################################
# Direct log messages to a log file
log4j.appender.file.Threshold=ALL
log4j.appender.file.file=logs/MyProgram.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{1} - %m%n

# set file size limit
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=50


#############################################
# Direct log messages to System Out
log4j.appender.console.Threshold=INFO
log4j.appender.console.Target=System.out
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss} %-5p %c{1} - %m%n
Philippe
fuente