Hello!
In our project we use BIRT Runtime (with maven, Spring):
<dependency>
<groupId>org.eclipse.birt.runtime</groupId>
<artifactId>org.eclipse.birt.runtime</artifactId>
<version>4.3.1</version>
</dependency>
I want to use log4j. For this I wrote Log4jHandler (extends Handler) which handle java.util.logging.Logger's events. Now I try to set new java.util.logging.Logger(<className>) in EngineConfig, IReportEngine, IRunTask, IRenderTask:
@Service
public class BirtPlatform implements InitializingBean, DisposableBean {
private static final Logger LOGGER = Logger.getLogger(BirtPlatform.class.getName());//Logger.getLogger("org.eclipse.birt");
private EngineConfig engineConfig;
@Autowired
Log4jHandler log4jHandler;
@Override
public void afterPropertiesSet() throws Exception {
RegistryProviderFactory.releaseDefault();
engineConfig = new EngineConfig();
LOGGER.setLevel(Level.ALL);
System.out.println("EngineLogger.isValidLogger(LOGGER) = " + EngineLogger.isValidLogger(LOGGER));
LOGGER.addHandler(log4jHandler);
engineConfig.setLogger(LOGGER);
Platform.startup(engineConfig);
}
public EngineConfig getEngineConfig() {
return engineConfig;
}
@Override
public void destroy() throws Exception {
Platform.shutdown();
RegistryProviderFactory.releaseDefault();
}
}
@Service
public class BirtEngine implements ReportEngine, InitializingBean, DisposableBean {
private static final Logger LOGGER = Logger.getLogger(BirtEngine.class.getName());
@Autowired
Log4jHandler log4jHandler;
@Autowired
BirtPlatform birtPlatform;
@Override
public String getInfo() {
return null;
}
IReportEngine reportEngine;
@Override
public void afterPropertiesSet() throws Exception {
IReportEngineFactory reportEngineFactory = (IReportEngineFactory) Platform.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
reportEngine = reportEngineFactory.createReportEngine(birtPlatform.getEngineConfig());
LOGGER.setLevel(Level.ALL);
LOGGER.addHandler(log4jHandler);
reportEngine.setLogger(LOGGER);
}
@Override
public void generateReport(ReportParameters reportParameters, Connection connection) throws ReportException {
...
IRunTask runTask = reportEngine.createRunTask(reportRunnable);
System.out.println("!EngineLogger.isValidLogger(LOGGER)=" + !EngineLogger.isValidLogger(LOGGER));
runTask.setLogger(LOGGER);
...
IRenderTask renderTask = reportEngine.createRenderTask(reportDocument);
renderTask.setLogger(LOGGER);
...
}
@Override
public void destroy() throws Exception {
reportEngine.destroy();
}
}
But i got warnings for EngineConfig, IReportEngine and errors for IRunTask, IRenderTask:
...
EngineLogger.isValidLogger(LOGGER) = false
20.03.2014 13:44:46 org.eclipse.birt.report.engine.api.impl.EngineLogger startEngineLogging
2014-03-20 13:44:53,161 [RMI TCP Connection(4)-127.0.0.1] WARN [com.sbt.report.reestrbk.report_generator.engine.birt.Log4jHandler.publish(Log4jHandler.java:19)] the logger can't be the child of org.eclipse.birt
WARNING: the logger can't be the child of org.eclipse.birt
2014-03-20 13:44:53,623 [RMI TCP Connection(4)-127.0.0.1] WARN [com.sbt.report.reestrbk.report_generator.engine.birt.Log4jHandler.publish(Log4jHandler.java:19)] the logger can't be the child of org.eclipse.birt
20.03.2014 13:44:53 org.eclipse.birt.report.engine.api.impl.EngineLogger setLogger
WARNING: the logger can't be the child of org.eclipse.birt
...
Exception in thread "Timer-0" java.lang.IllegalArgumentException: the logger can not be NULL or children or in namespace of org.eclipse.birt
at org.eclipse.birt.report.engine.api.impl.EngineTask.setLogger(EngineTask.java:2394)
at com.sbt.report.reestrbk.report_generator.engine.birt.BirtEngine.generateReport(BirtEngine.java:71)
at com.sbt.report.reestrbk.report_generator.ReportGenerator$1.doInConnection(ReportGenerator.java:79)
at com.sbt.report.reestrbk.report_generator.ReportGenerator$1.doInConnection(ReportGenerator.java:75)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:342)
at com.sbt.report.reestrbk.report_generator.ReportGenerator.generateReportInConnection(ReportGenerator.java:75)
at com.sbt.report.reestrbk.report_generator.ReportGenerator.generateReport(ReportGenerator.java:68)
at com.sbt.report.reestrbk.service.ReestrbkRptBuilder.build(ReestrbkRptBuilder.java:72)
at com.sbt.report.reestrbk.service.sched.SchedulableTask.run(SchedulableTask.java:26)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
...
Message "the logger can't be the child of org.eclipse.birt" I found in source code (grepcode.com/file/repo1.maven.org/maven2/org.eclipse.birt.runtime/org.eclipse.birt.runtime/4.3.1/org/eclipse/birt/report/engine/api/impl/EngineLogger.java#EngineLogger:)
85 if ( logger != null )
86 {
87 if ( !isValidLogger( logger ) )
88 {
89 logger.log( Level.WARNING,
90 "the logger can't be the child of org.eclipse.birt" );
91 }
92 else
93 {
94 AdapterHandler adapter = getAdapterHandler( );
95 adapter.setUserLogger( logger );
96 }
97 }
Message "the logger can not be NULL or children or in namespace of org.eclipse.birt" I found in source (grepcode.com/file/repo1.maven.org/maven2/org.eclipse.birt.runtime/org.eclipse.birt.runtime/4.3.1/org/eclipse/birt/report/engine/api/impl/EngineTask.java?av=f:
)
2390 public void More ...setLogger( Logger logger )
2391 {
2392 if ( logger == null || !EngineLogger.isValidLogger( logger ) )
2393 {
2394 throw new IllegalArgumentException(
2395 "the logger can not be NULL or children or in namespace of org.eclipse.birt" );
2396 }
2397 EngineLogger.setThreadLogger( logger );
2398 this.log = logger;
2399 this.executionContext.setLogger( logger );
2400 }
Function isValidLogger:
145 public static boolean More ...isValidLogger( Logger logger )
146 {
147 while ( logger != null )
148 {
149 for ( Logger rootlogger : ROOT_LOGGERS )
150 {
151 if ( logger == rootlogger )
152 {
153 return true;
154 }
155 }
156 logger = logger.getParent( );
157 }
158 return false;
159 }
When I set Logger.getLogger(BirtPlatform.class.getName()), I got "EngineLogger.isValidLogger(LOGGER) = false" and warnings "the logger can't be the child of org.eclipse.birt".
When I set Logger.getLogger("org.eclipse.birt"), I got "EngineLogger.isValidLogger(LOGGER) = true" without warnings.
How to pass java.util.logging.Logger in ngineConfig, IReportEngine, IRunTask, IRenderTask correctly?
Help me please!