How to debug jasper reports?

后端 未结 2 1438
轮回少年
轮回少年 2020-12-16 00:22

Currently i am working on my first reports using iReport for design. Under certain conditions jasper gets stuck in some kind of infinte loop / recursive call. Jasper\'s logs

相关标签:
2条回答
  • 2020-12-16 01:09

    You can use te class below to create an "expression logger" which you can then use in the report to see variable values, and when they are evaluated or used.

    First, you need to create a logger and put it in the report parameters map in your Java code which starts the report:

    String loggerName = "jasper.report." + reportName;
    Logger logger = LoggerFactory.getLogger(loggerName);
    reportParameters.put("log", new JasperLogger(logger));
    

    In the report, create a new parameter log with the type of the class below. Now, when you have to evaluate an expression (like a "Print When Expression"), wrap it:

    $P{log}.debug("printWhen for text field ...: {}", ...original expression...)
    

    Here is the code for the class:

    import org.slf4j.Logger;
    
    /** A wrapper for a SLF4J logger which allows to log expressions as they are evaluated. */
    public class JasperLogger {
    
        private Logger delegate;
    
        public JasperLogger(Logger delegate) {
            this.delegate = delegate;
        }
    
        public <T> T debug(String message, T value) {
            delegate.debug(message, value);
            return value;
        }
    
        public <T> T info(String message, T value) {
            delegate.info(message, value);
            return value;
        }
    
        public <T> T error(String message, T value) {
            delegate.error(message, value);
            return value;
        }
    }
    
    0 讨论(0)
  • 2020-12-16 01:27

    You can use the log4j.properties to get some additional information from iReport. The below steps were provided to me by Jasper support to help me see what SQL was being generated by a report with several sub reports and dynamic SQL being passed between them.

    1. Create a log4j.properties file (place it under ireport/etc), with the contents as follows:

      #############################################
      log4j.appender.fileout=org.apache.log4j.RollingFileAppender
      log4j.appender.fileout.File=C:/tmp/iReport.log
      log4j.appender.fileout.MaxFileSize=1024KB
      log4j.appender.fileout.MaxBackupIndex=1
      log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
      log4j.appender.fileout.layout.conversionPattern=%d{ABSOLUTE} %5p
      %c{1},%t:%L - %m%n
      log4j.rootLogger=warn, fileout
      log4j.logger.net.sf.jasperreports.engine.query=debug
      #############################################
      

      With the above, the output log will be in the iReport.log in the c:/tmp folder.

    2. Edit ireport/etc/ireportpro.conf and add the following contents in the default_options parameter:

      -J-Dlog4j.configuration=file:/E:/Server/Server451/ireport/etc/log4j.properties
      

      So it becomes:

      default_options="-J-Xms24m -J-Xmx512m
      
      -J-Dorg.netbeans.ProxyClassLoader.level=1000 -J-XX:MaxPermSize=256m
      -J-Dlog4j.configuration=file:/E:/Server/Server451/ireport/etc/log4j.properties"
      

      Please pay attention to the above directory, you will need to adjust it to your own specific directory of iReport installation.

    3. Restart iReport and execute reports, the generated SQL will then be output in iReport.log.

    0 讨论(0)
提交回复
热议问题