Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

New Maven dependcy turns on jOOQ logging

Recently I've added new dependency to project for generating .xls file.

pom.xml

    <dependency>
      <groupId>org.jxls</groupId>
      <artifactId>jxls</artifactId>
      <version>2.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.jxls</groupId>
      <artifactId>jxls-poi</artifactId>
      <version>1.0.0</version>
    </dependency>

Code

 public StreamingOutput createStreamedExcelReport(Map<String, Object> params, String templateName, String[] columnsToHide) throws Exception {
        try(InputStream is = ReportGenerator.class.getResourceAsStream(templateName)) {
            assert is != null;
            final Transformer transformer = PoiTransformer.createTransformer(is);
            AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
            List<Area> xlsAreaList = areaBuilder.build();
            Area xlsArea = xlsAreaList.get(0);
            Context context = new PoiContext();
            for(Map.Entry<String, Object> entry : params.entrySet()) {
                context.putVar(entry.getKey(), entry.getValue());
            }
            xlsArea.applyAt(new CellRef("Sheet1!A1"), context);
            xlsArea.processFormulas();
            return new StreamingOutput() {
                @Override
                public void write(OutputStream out) throws IOException {
                    ((PoiTransformer) transformer).getWorkbook().write(out);
                }
            };
        }
    }

Unfortunately it turns on probably jOOQ debug logging which is really bad because it logs all db queries. Application is making big query for .xls, so it shouldn't log that (~1,5GB output in 3min).

Example of logs

08:08:23.094 [http-bio-8080-exec-7] DEBUG org.jooq.tools.LoggerListener - Executing query          : select "XXXXXXXX"."XXX", "XXXXXXX"."XXXXXXX" from "XXXXX" where "XXXXX"."XXX" = ?
08:08:23.095 [http-bio-8080-exec-7] DEBUG org.jooq.tools.LoggerListener - -> with bind values      : select "XXXXXXXX"."XXX", "XXXXXXX"."XXXXXXX" from "XXXXX" where "XXXXX"."XXX" = 'XXXX.XXXXXXXXXXXXXXXXXXX'
08:08:23.098 [http-bio-8080-exec-7] DEBUG org.jooq.tools.StopWatch - Query executed           : Total: 4.17ms
08:08:23.099 [http-bio-8080-exec-7] DEBUG org.jooq.tools.LoggerListener - Fetched result           : +----------------------------------------+-----------+
08:08:23.100 [http-bio-8080-exec-7] DEBUG org.jooq.tools.LoggerListener -                          : |KEY                                     |VALUE      |
08:08:23.100 [http-bio-8080-exec-7] DEBUG org.jooq.tools.LoggerListener -                          : +----------------------------------------+-----------+
08:08:23.100 [http-bio-8080-exec-7] DEBUG org.jooq.tools.LoggerListener -                          : |xxxx.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|0 0 3 * * ?|
08:08:23.100 [http-bio-8080-exec-7] DEBUG org.jooq.tools.LoggerListener -                          : +----------------------------------------+-----------+
08:08:23.100 [http-bio-8080-exec-7] DEBUG org.jooq.tools.StopWatch - Finishing                : Total: 6.756ms, +2.586ms
like image 538
hya Avatar asked Mar 23 '16 07:03

hya


1 Answers

Thorough fix via logging configuration

jOOQ by default uses debug logging via whatever of these three logging frameworks it first discovers on the class path: slf4j, log4j, java.util.logging. The jxls library has a dependency on logback via slf4j as can be seen in its pom.xml:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.12</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.12</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.3</version>
</dependency>

In order to turn off jOOQ debug logging, you should configure your logging frameworks (in this case: logback) accordingly.

Quick fix in jOOQ:

You can also turn off most logging in jOOQ directly by specifying:

Settings.withExecuteLogging(false);

For more info, see: http://www.jooq.org/doc/latest/manual/sql-execution/logging

like image 192
Lukas Eder Avatar answered Oct 11 '22 08:10

Lukas Eder