如何调试碧玉报告?(How to debug jasper reports?)

2019-06-23 12:33发布

目前,我正在使用iReport的设计我的第一次报告。 在一定条件下碧玉陷在某种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
[...]

此序列与相同填料IDS反复记录。 我有解释这些调试日志困难。 除了解决具体问题,我感兴趣的策略来调试碧玉报告。 那么,你如何调试报告?

Answer 1:

您可以使用log4j.properties摆脱iReport的一些额外的信息。 下面的步骤是提供给我的碧玉支持,帮我看看正在与几个子报告,并在它们之间传递的动态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



Answer 2:

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

首先,你需要创建一个记录器,并把它放在你的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;
    }
}


文章来源: How to debug jasper reports?