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 报告的策略感兴趣。那么,如何调试报告?

4

3 回答 3

5

您可以使用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.log文件c:/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.

于 2013-04-13T14:38:44.657 回答
1

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

首先,您需要创建一个记录器并将其放入启动报告的 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;
    }
}
于 2018-09-03T11:05:46.900 回答
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
于 2021-09-23T10:28:04.567 回答