Debugging 如何调试jasper报告?

Debugging 如何调试jasper报告?,debugging,jasper-reports,ireport,Debugging,Jasper Reports,Ireport,目前,我正在使用iReport for design编写我的第一份报告。在某些情况下,jasper会陷入某种infinte循环/递归调用中。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 1207280

目前,我正在使用iReport for design编写我的第一份报告。在某些情况下,jasper会陷入某种infinte循环/递归调用中。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报告的策略感兴趣。那么,如何调试报告呢?

您可以使用log4j.properties从iReport获取一些附加信息。Jasper support向我提供了以下步骤,以帮助我查看一个包含多个子报表的报表生成的SQL以及在它们之间传递的动态SQL

创建一个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
#############################################
根据上述内容,输出日志将位于c:/tmp中的iReport.log中 文件夹

编辑ireport/etc/ireportpro.conf并在 默认选项参数:

-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安装目录

重新启动iReport并执行报告,然后将生成SQL 在iReport.log中输出


您可以使用下面的te类创建一个表达式记录器,然后在报告中使用该记录器查看变量值,以及何时计算或使用变量值

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

String loggerName = "jasper.report." + reportName;
Logger logger = LoggerFactory.getLogger(loggerName);
reportParameters.put("log", new JasperLogger(logger));
在报告中,使用下面的类类型创建一个新的参数日志。现在,当您必须计算表达式(如打印时表达式)时,请将其换行:

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

您正在谈论iReport调试吗?您可以尝试使用Java应用程序测试您的报表,例如,您可以使用JasperReports API。您可以下载JRAPI的源代码,这样您就可以轻松地调试这样的程序application@AlexK1:不,我想调试一个jasper报告和几个子报告。2:嗯,我已经在使用源代码和eclipse来逐步完成代码,但我想知道是否有更好的替代方案您好,我正在使用Jasper和Odoo 7我没有安装它们,我只使用它们我用iReport编辑我的Jasper报告Jasper/iReport怎么会更详细?我只收到一条不准确的消息:[1]填写报告时出错,您能帮我吗?