目前,我正在使用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反复记录。 我有解释这些调试日志困难。 除了解决具体问题,我感兴趣的策略来调试碧玉报告。 那么,你如何调试报告?
您可以使用log4j.properties
摆脱iReport的一些额外的信息。 下面的步骤是提供给我的碧玉支持,帮我看看正在与几个子报告,并在它们之间传递的动态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 #############################################
利用上述,输出日志将在iReport.log
在c:/tmp
文件夹。
编辑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的安装你自己的特定目录中。
iReport的重新启动并执行报告,生成的SQL届时将在输出iReport.log
。
您可以使用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;
}
}