package org.slf4j.impl; import org.slf4j.Logger; import alma.acs.logging.AcsLogger; import alma.acs.logging.ClientLogManager; /** * This class creates and administrates loggers for the hibernate framework * on behalf of the slf4j-ACS logger factory {@link ACSLoggerFactory}. * <p> * Simplification of the large number of hibernate loggers: * The hibernate framework tries to use separate loggers with names being those of its java classes, * e.g. "org.hibernate.cfg.Ejb3Column". * ACS maps all of these logger requests to only 2 different loggers, which can be configured separately: * <ul> * <li>The default logger is called "hibernate", * or "hibernate@<process-name>" if a process/container name is known to the ACS logging libs. * See also {@link #HIBERNATE_LOGGER_NAME_PREFIX}.</li> * <li>SQL related hibernate loggers are mapped to "hibernateSQL", * or "hibernateSQL@<process-name>" if a process/container name is known to the ACS logging libs. * See also {@link #HIBERNATE_SQL_LOGGER_NAME_PREFIX}.</li> * </ul> * * @author msekoranja, hsommer */ public class HibernateLoggerHelper { /** * The slf4j adapter for the default hibernate logger. */ private Logger jdkAdapterDefault; /** * The slf4j adapter for the sql hibernate logger. */ private Logger jdkAdapterSql; /** * Mapped to all hibernate loggers except those from {@link #HIBERNATE_SQL_LOGGER_NAME_PREFIX}. */ public static final String HIBERNATE_LOGGER_NAME_PREFIX = "hibernate"; /** * Mapped to hibernate loggers "org.hibernate.SQL" (for SQL statements) * and "org.hibernate.type.xyz" (for SQL binding parameters). * <p> * Hibernate announces that version 4 will rename the SQL logger to "org.hibernate.jdbc.util.SQLStatementLogger" * which is why we already map that currently not existing logger name to the same sql logger. */ public static final String HIBERNATE_SQL_LOGGER_NAME_PREFIX = "hibernateSQL"; /** * @see ACSLoggerFactory#getLogger(String) */ public Logger getLogger(String name) { if (name.equals("org.hibernate.SQL") || name.startsWith("org.hibernate.type") || // there is an inconsistency in hibernate's parameter logging, where first "org.hibernate.type" is checked in NullableType#IS_VALUE_TRACING_ENABLED, but later loggers "org.hibernate.type.XYZ" get used. name.equals("org.hibernate.jdbc.util.SQLStatementLogger")) { if (jdkAdapterSql == null) { AcsLogger acsLoggerDelegateSql = ClientLogManager.getAcsLogManager().getLoggerForCorba(HIBERNATE_SQL_LOGGER_NAME_PREFIX, true); acsLoggerDelegateSql.addLoggerClass(JDK14LoggerAdapter.class); jdkAdapterSql = new JDK14LoggerAdapter(acsLoggerDelegateSql); } return jdkAdapterSql; } else { if (jdkAdapterDefault == null) { AcsLogger acsLoggerDelegateDefault = ClientLogManager.getAcsLogManager().getLoggerForCorba(HIBERNATE_LOGGER_NAME_PREFIX, true); acsLoggerDelegateDefault.addLoggerClass(JDK14LoggerAdapter.class); jdkAdapterDefault = new JDK14LoggerAdapter(acsLoggerDelegateDefault); } return jdkAdapterDefault; } } /** * Should only be called by tests. * For example, JUnit test cases that use different logger names for every test * need to call this in order for hibernate loggers to be re-created. */ public void clearDelegateLoggers() { jdkAdapterDefault = null; jdkAdapterSql = null; } }