【问题标题】:How to debug jasper reports?如何调试碧玉报告?
【发布时间】:2012-04-10 14:00:29
【问题描述】:

目前我正在使用 iReport 设计我的第一份报告。在某些情况下,jasper 会陷入某种无限循环/递归调用。 Jasper 的日志反复跟踪:

[...]
12-04-10 10:29:59,222 DEBUG s.engine.fill.JRVerticalFiller|Fill 1207280802: page footer
12-04-10 10:29:59,222 DEBUG ports.engine.fill.JRBaseFiller|Fill 1207280802: adding page 38849
12-04-10 10:29:59,222 DEBUG ts.engine.fill.JRFillSubreport|Fill 1207280802: resuming 849817670
12-04-10 10:29:59,222 DEBUG e.fill.JRThreadSubreportRunner|Fill 849817670: notifying to continue
12-04-10 10:29:59,222 DEBUG e.fill.JRThreadSubreportRunner|Fill 849817670: waiting for fill result
12-04-10 10:29:59,222 DEBUG e.fill.JRThreadSubreportRunner|Fill 849817670: notified to continue
12-04-10 10:29:59,222 DEBUG ports.engine.fill.JRBaseFiller|Fill 849817670: suspeding subreport runner
12-04-10 10:29:59,222 DEBUG e.fill.JRThreadSubreportRunner|Fill 849817670: notifying on suspend
12-04-10 10:29:59,222 DEBUG e.fill.JRThreadSubreportRunner|Fill 849817670: waiting to continue
12-04-10 10:29:59,222 DEBUG e.fill.JRThreadSubreportRunner|Fill 849817670: notified of fill result
12-04-10 10:29:59,222 DEBUG ts.engine.fill.JRFillSubreport|Fill 1207280802: subreport 849817670 to continue
[...]

使用相同的填充 ID 重复记录此序列。我在解释这些调试日志时遇到了困难。除了解决具体问题之外,我还对调试 jasper 报告的策略感兴趣。那么,如何调试报告?

【问题讨论】:

  • 你说的是iReport调试吗?
  • 您可以尝试使用 Java 应用程序测试您的报告(例如,您可以使用 JasperReports API)。您可以下载JR API的源代码,以便您轻松调试此类应用程序
  • @Alex K #1:不,我想调试一个包含多个子报告的 jasper 报告。 #2:嗯,我已经在使用源代码和 eclipse 来逐步执行代码,但我想知道是否有更好的选择
  • 您好,我正在使用 Jasper 和 Odoo 7(我没有安装它们,我只使用它们)我用 iReport 编辑我的 jasper 报告 jasper/iReport 怎么能更详细?我只收到一条不准确的消息:[1]错误填写报告你能帮我吗?

标签: debugging jasper-reports ireport


【解决方案1】:

您可以使用log4j.properties 从 iReport 获取更多信息。 Jasper 支持人员向我提供了以下步骤,以帮助我查看报表生成的 SQL 以及多个子报表和在它们之间传递的动态 SQL。

  1. 创建一个log4j.properties 文件(将其放在ireport/etc 下),使用 内容如下:

    #############################################
    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
    #############################################
    

    有了上面的,输出日志会在iReport.logc:/tmp 文件夹。

  2. 编辑ireport/etc/ireportpro.conf,在 default_options参数:

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

    这样就变成了:

    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"
    

    请注意以上目录,需要调整为 你自己的 iReport 安装目录。

  3. 重启 iReport 并执行报表,生成的 SQL 将 在iReport.log 中输出。

【讨论】:

    【解决方案2】:

    您可以使用下面的类来创建一个“表达式记录器”,然后您可以在报告中使用它来查看变量值,以及它们何时被评估或使用。

    首先,您需要创建一个记录器并将其放入启动报告的 Java 代码中的报告参数映射中:

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

    在报告中,使用以下类的类型创建一个新参数log。现在,当您必须评估一个表达式(如“Print When Expression”)时,将其包装起来:

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

    这是该类的代码:

    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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      对于 Jasperreports 7.5 版,这是您必须设置的配置文件:

      vim /opt/tomcat/webapps/jasperserver/WEB-INF/log4j2.properties
      
      logger.net_sf_jasperreports_engine_query_JRJdbcQueryExecuter.name=net.sf.jasperreports.engine.query.JRJdbcQueryExecuter
      logger.net_sf_jasperreports_engine_query_JRJdbcQueryExecuter.level=debug
      

      这样您将执行查询并替换参数:

      [...]
      FROM t
      GROUP BY trunc(local_date, 'DD')
      ORDER BY trunc(local_date, 'DD') DESC
      2021-09-23T12:06:57,495 DEBUG JRJdbcQueryExecuter,pool-5-thread-1:586 - Parameter #1 (USU_WEB of type java.lang.String): FOO
      2021-09-23T12:06:57,501 DEBUG JRJdbcQueryExecuter,pool-5-thread-1:586 - Parameter #2 (START_DATETIME of type java.lang.String): 2021-09-13 00:00:00
      2021-09-23T12:06:57,501 DEBUG JRJdbcQueryExecuter,pool-5-thread-1:586 - Parameter #3 (END_DATETIME of type java.lang.String): 2021-09-24 00:00:00
      2021-09-23T12:06:57,501 DEBUG JRJdbcQueryExecuter,pool-5-thread-1:586 - Parameter #4 (USU_WEB of type java.lang.String): FOO
      

      【讨论】:

        猜你喜欢
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多