Search code examples
hibernateloggingwildflywildfly-8

Hibernate doesn't log SQL in Wildfly when using a logging-profile


I have defined a in Wildfly 8.1 because I need to log SQL statements from Hibernate 4.3.6.

here is the relevant standalone.xml part:

<logging-profiles>
            <logging-profile name="myprofile">
                <console-handler name="CONSOLE">
                    <level name="INFO"/>
                    <formatter>
                        <named-formatter name="COLOR-PATTERN"/>
                    </formatter>
                </console-handler>
                <custom-handler name="DB" class="it.x.y.jbosseapsqllogger.Oracle10SqlLogger" module="it.x.y.jbosseapsqllogger">
                    <level name="DEBUG"/>
                    <properties>
                        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
                        <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xx"/>
                        <property name="username" value="xx"/>
                        <property name="password" value="xx"/>
                    </properties>
                </custom-handler>
                <periodic-rotating-file-handler name="FILE" autoflush="true">
                    <formatter>
                        <named-formatter name="PATTERN"/>
                    </formatter>
                    <file relative-to="jboss.server.log.dir" path="server.log"/>
                    <suffix value=".yyyy-MM-dd"/>
                    <append value="true"/>
                </periodic-rotating-file-handler>
                <logger category="org.hibernate.type.descriptor.sql.BasicBinder" use-parent-handlers="false">
                    <level name="TRACE"/>
                    <handlers>
                        <handler name="DB"/>
                        <handler name="FILE"/>
                    </handlers>
                </logger>
                <logger category="org.hibernate.SQL" use-parent-handlers="false">
                    <level name="DEBUG"/>
                    <handlers>
                        <handler name="CONSOLE"/>
                        <handler name="FILE"/>
                    </handlers>
                </logger>
                <root-logger>
                    <level name="INFO"/>
                    <handlers>
                        <handler name="CONSOLE"/>
                        <handler name="FILE"/>
                    </handlers>
                </root-logger>
                <formatter name="PATTERN">
                    <pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
                </formatter>
                <formatter name="COLOR-PATTERN">
                    <pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
                </formatter>
            </logging-profile>
        </logging-profiles>

I correctly get the binding parameters from the org.hibernate.type.descriptor.sql.BasicBinder category but cannot see SQL statements themselves; this tells me that I am correctly referencing the profile from MANIFEST.MF:

Logging-Profile: myprofile

Notice that if I move the org.hibernate.type.descriptor.sql.BasicBinder and org.hibernate.SQL loggers out of the logging-profile to the main section, everything works as expected (but of course for every deployed app, that is what I need to avoid).

I tried and debug Hibernate and the Wildfly logging subsystem but with little results. The thing I noticed is that, org.hibernate.SQL is not a class but is a hard-coded category in SqlStatementLogger.java:

public class SqlStatementLogger {
private static final Logger LOG = CoreLogging.logger( "org.hibernate.SQL" );

private boolean logToStdout;
private boolean format;
[...]

any ideas? thanks a lot


Solution

  • Dependencies added by the server will not use logging-profiles or per-deployment logging configurations. All server dependencies use the system level (default) logging configuration.

    A logger like this is a perfect example of why this would not work. Since dependencies are shared across all deployments a static logger would be configured based on the first deployment that invoked a log statement with that logger.