Направлять журналы отчетов BIRT в log4j

#spring-mvc #log4j #birt

#spring-mvc #log4j #birt

Вопрос:

У меня есть веб-приложение spring mvc 3.0, и я пытаюсь следовать инструкциям на http://wiki.eclipse.org/BIRT/FAQ/Deployment#Logging перенаправить журналы отчетов birt в log4j, но у меня возникли некоторые проблемы с пониманием того, как это сделать.

Шаг первый для создания класса в порядке.

Шаг второй, чтобы создать конфигурационный файл «logging.properties» и указать вышеуказанный обработчик в качестве обработчиков: handlers=test.Log4jHandler

Каким именно должно быть содержимое logging.properties? Пример был бы отличным.

Шаг третий я тоже не совсем понимаю. Я предполагаю, что это означает поместить файл в путь к классу… но тогда как мне установить позицию по системному свойству?

Если кто-нибудь может помочь с хорошим примером, это было бы здорово.

Спасибо

Ответ №1:

В нашем приложении (не использующем spring) мы делаем это следующим образом:

Содержимое файла c:reportingconfbirtbirt-log4j.properties:

 log4j.rootCategory=INFO, file
# Set to DEBUG to see a lot more messages from BIRT

log4j.logger.org.eclipse=INFO, engine
log4j.additivity.org.eclipse=false

log4j.logger.org.eclipse.birt=INFO, engine
log4j.additivity.org.eclipse.birt=false

log4j.logger.org.eclipse.birt.data=WARN, engine
log4j.additivity.org.eclipse.birt.data

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:/reporting/log/birt/birt.log
log4j.appender.file.MaxFileSize=5000KB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d{ISO8601}] %-5p [%t] J:%X{jobId} - (%F:%L) - %m%n

log4j.appender.engine=org.apache.log4j.RollingFileAppender
log4j.appender.engine.File=C:/reporting/log/birt/engine.log
log4j.appender.engine.MaxFileSize=2000KB
log4j.appender.engine.MaxBackupIndex=10
log4j.appender.engine.layout=org.apache.log4j.PatternLayout
log4j.appender.engine.layout.ConversionPattern=[%d{ISO8601}] %-5p [%t] J:%X{jobId} - %c - %m%n
 

И при запуске приложения мы устанавливаем свойство SystemProperty следующим образом:

 -Dlog4j.configuration=file:///C:/reporting/conf/birt/birt-log4j.properties
 

И внутри приложения мы используем org.yajul.log.JuliToLog4JService (см. http://yajul.sourceforge.net /) и настройте его следующим образом:

 private JuliToLog4JService logHelper;


/**
 * Initialize the BIRT and logging libraries.
 * 
 * @throws Exception
 */
private void initLogging() throws Exception {
    logHelper = new JuliToLog4JService();
    logHelper.start();
}


private void initBIRT() throws ConfigurationError {

    String birtFontDirs = System.getProperty("birt.font.dirs");
    fontPath = birtFontDirs.split(File.pathSeparator);
    // Check that the report directory exists
    File f = new File(reportDir);
    boolean dirOk = false;
    dirOk = (f.isDirectory());
    if (!dirOk) {
        log.fatal("Specified report directory "   String.valueOf(reportDir)
                  " is not a directory or not accessible!");
        throw new ConfigurationError("Invalid report directory "
                  String.valueOf(reportDir));
    }
    log.info("Creating BIRT EngineConfig...");
    engineConfig = new EngineConfig();

    engineConfig.setLogger(java.util.logging.Logger
            .getLogger("org.eclipse.BIRTengine"));

    dbUrl = System.getProperty("lisa.birt.db.url");
    log.info("DB URL="   dbUrl);

    try {
        log.info("Platform startup...");
        Platform.startup(engineConfig);
        log.info("Creating report engine factory...");
        factory = (IReportEngineFactory) Platform
                .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);

        log.info("Creating report engine...");
        engine = factory.createReportEngine(engineConfig);
        engine.setLogger(engineConfig.getLogger());
        // reportEngine.changeLogLevel(Level.parse(logLevel));
    } catch (Exception e) {
        log.fatal("Error during BIRT startup!", e);
        throw new ConfigurationError("Error during BIRT platform startup");
    }
    log.info("BIRT EngineManager initialization completed.");
}

/**
 * Shut down the engine manager. Before destroying the BIRT report engine,
 * interrupt the generator threads.
 */
public void shutdownBIRT() {
    // Interrupt the still running threads
    log.info("Shutting down BIRT engine...");

    // destroy the engine
    if (engine != null) {
        try {
            log.info("Destroying BIRT ReportEngine...");
            engine.destroy();
            engine = null;
        } catch (Exception e) {
            log.warn("Error calling reportEngine.destroy:", e);
        }
    }
    // shut down BIRT OSGI platform
    try {
        log.info("Shutting down BIRT OSGI platform...");
        Platform.shutdown(); // FIMXE This seems to hang.
    } catch (Exception e) {
        log.warn("Error calling Platform.shutdown:", e);
    }
    log.info("BIRT EngineManager shutdown completed.");
}

/**
 * Uninitialize the BIRT and logging libraries.
 */
private void uninitialize() {
    shutdownBIRT();
    try {
        logHelper.stop();
    } catch (Throwable t) {
        try {
            t.printStackTrace(System.err);
        } catch (Throwable t1) {
            ; // ignore if we cannot log the error
        }
    }
}
 

В качестве приятного побочного эффекта вы можете использовать MDC с log4j. Например, наше приложение использует многопоточный BIRT, и log4j может автоматически добавлять значимый идентификатор для потока в строку журнала.

Для IDE мы не используем log4j. Чтобы направлять сообщения журнала BIRT в не очень глубоко вложенный файл журнала, мы просто запускаем IDE следующим образом (в Windows):

 start /D%~dp0birt %BIRT_EXE% -clean -vmargs -Djava.util.logging.config.file=%~dp0logging.properties
 

с файлом logging.properties, подобным этому:

 handlers= java.util.logging.FileHandler

.level= INFO

org.eclipse.birt.report.data.oda.jdbc.level = FINE

java.util.logging.FileHandler.pattern = ../log/birt-designer.log
java.util.logging.FileHandler.limit = 5000000
java.util.logging.FileHandler.count = 1
#java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = ALL
 

Комментарии:

1. спасибо за ваш вклад. Я буду иметь это в виду, если не смогу заставить инструкции, опубликованные в моем исходном сообщении, работать.

Ответ №2:

Если вы хотите сделать это с помощью собственного пользовательского обработчика java.util.logging, вам необходимо создать logger с помощью «org.eclipse.birt.report»

 ...    
engineConfig.setLogger(java.util.logging.Logger.getLogger("org.eclipse.birt.report"));
...