Logging in Berlioz

Logging API

Berlioz uses SLF4J  as a logging API, so the Java code is implemented against that:
  http://www.slf4j.org/docs.html 

To create a logger, you can declare a static variable in the generator

private final static Logger LOGGER = LoggerFactory.getLogger(MyGenerator.class);

Messages can then be logged with:

LOGGER.debug("something happened");
LOGGER.info("something happened...");
LOGGER.warn("something happened!!!");
LOGGER.info("{} happened", "Something");
...

See the API documentation for SLF4J for details:
  http://www.slf4j.org/apidocs/index.html 

Logging Configuration

LogBack

The logging framework (implementation) we recommend is Logback:
  http://logback.qos.ch/ 

At startup, Berlioz will automatically pick up the logging configuration from the config folder (/WEB-INF/config) as logback-[mode].xml

This is where you can configure your log and define where you want them to go. Typically, it is preconfigured to go to jetty/logs/[webappname] as .log files and rollover daily in production.

You can configure it to send it to a location of your choice or change the threshold level for particular packages if you need finer control.

See the manual for details:
   http://logback.qos.ch/manual/configuration.html 

Log4J

Alternatively, Berlioz can also be configured to work with Apache Log4J 1.2. Simply put the log4j-[config].xml in the config folder.

Other frameworks

Berlioz can also be configured to work with other logging frameworks, but the configuration must be done independently.

Berlioz Admin

The Berlioz admin tools should be able to locate the log files from the configuration and display them. 

When using Logback, the Berlioz admin tools will also capture the most recent log messages display them online regardless of the logging configuration.

Sample Logback configurations

Development mode

In development (or dev) mode, it is often useful to have a fine control of where the messages come from and have them send to Beagle  or the console. Here is an example

<configuration debug="false" scan="true" scanPeriod="30 seconds">
  <!-- Sends logs to Logback's Beagle Eclipse plugin -->
  <consolePlugin />

  <!-- Console appender -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>[%thread] %-5level %logger{30} - %msg %n</pattern>
    </encoder>
  </appender>

  <!-- Some libraries can be chatty... -->
  <logger name="net.sf.ehcache"       level="INFO" />
  <logger name="org.weborganic.flint" level="WARN" />

  <!-- Berlioz and Bastille -->
  <logger name="org.weborganic.berlioz" level="WARN" />
  <logger name="org.weborganic.bastille" level="WARN" />
  <logger name="org.weborganic.bastille.flint" level="WARN" />
  <logger name="org.weborganic.bastille.cache" level="INFO" />
  <logger name="org.weborganic.bastille.recaptcha" level="DEBUG" />

  <root level="DEBUG">
    <appender-ref ref="STDOUT"/>
  </root>
</configuration>

Production

In production, it is often preferable to have messages recorded on files:

<configuration debug="false">

  <!-- General Logs (text) -->
  <appender name="GENERAL" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <File>logs/myproject/berlioz.log</File>
    <Append>true</Append>
    <encoder>
      <pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>logs/myproject/berlioz-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- or whenever the file size reaches 100MB -->
        <maxFileSize>10MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
  </appender>

  <root level="INFO">
    <appender-ref ref="GENERAL"/>
  </root>
</configuration>

Note

The Berlioz Admin tools should automatically capture the most recent logs events regardless of the configuration.

Created on , last edited on