如何调试Jasper报表?

12

目前我正在使用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 的调试吗? - Alex K
你可以尝试使用Java应用程序测试报告(例如,你可以使用JasperReports API)。你可以下载JR API的源代码,这样你就可以轻松地调试这种应用程序。 - Alex K
@Alex K #1:不,我想调试一个带有多个子报表的Jasper报表。#2:好吧,我已经在使用源代码和Eclipse逐步执行代码,但我想知道是否有更好的替代方案。 - GLA
你好,我正在使用Odoo 7中的Jasper(我没有安装它们,只是使用它们),我使用iReport编辑我的Jasper报告。你能告诉我如何让jasper/iReport更加详细吗?因为我只收到一个不太明确的错误消息:[1]填充报告时出错。你可以帮助我吗? - Kishiro
在JasperReports服务器上,您可以通过GUI更改日志级别。作为超级用户登录,使用菜单:管理->服务器设置->日志设置。将SQL查询执行器日志级别从Error更改为Debug。完成。 - FCA69
3个回答

6
您可以使用 log4j.properties 来从 iReport 获取一些附加信息。以下步骤是由 Jasper 支持团队提供给我的,以帮助我查看一个包含多个子报表和动态 SQL 之间传递的报表所生成的 SQL。
  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.


2

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

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

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

在报表中,创建一个新的参数log,类型如下所示。现在,当您需要评估表达式(例如“打印时表达式”)时,请将其包装起来:
$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;
    }
}

0

对于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接