Project Awesome project awesome

slf4p

A simple logging facade with support for LazLogger, Log4D, and other logging frameworks.

Package 42 stars GitHub

slf4p - Simple Logging Facade for Pascal

License Pascal Stars Last Commit

Delphi Lazarus FPC Log4D LazLogger Workflow Status

The Simple Logging Facade for Pascal serves as a simple facade or abstraction for various logging frameworks (e.g. Log4D, LazLogger) allowing the end user to plug in the desired logging framework at build time.

Developed with Dephi 2009 and Lazarus 2.0, tested with DUnit and FPCUnit.

To register a specific logging framework, just add one of the djLogOver... units to the project.

  • djLogOverNOPLogger for logging over NOPLogger (included)
  • djLogOverSimpleLogger for logging over SimpleLogger (included)
  • djLogOverLog4D for logging over Log4D
  • djLogOverLazLogger for logging over LazLogger

Examples

The examples use the helper unit slf4p, which is located in the src/main folder, and provides the LOGGER method. (New in 1.0.5) Note:

  • the unit which specifies (registers) a logger factory must appear in the uses list before unit slf4p.
  • when no unit is added, a NOPLogger factory will be used as fallback, and a message indicating the fallback will be printed.
  • the last logger factory unit found will be used to create logger instances.

NOPLogger

Since no unit for registering a logger factory is used, a factory for NOP loggers will be registered.

program HelloWorld;

uses
  slf4p;

procedure RunDemo;
begin
  LOGGER.Debug('Using slf4p %s', [SLF4P_VERSION]);
  LOGGER.Info('Hello, World!');
  LOGGER.Debug('Hit any key');
  ReadLn;
end;

begin
  RunDemo;
end.

Program output

SLF4P: Logger factory is not assigned
SLF4P: Defaulting to no-operation (NOP) logger implementation

SimpleLogger

The first unit used, djLogOverSimpleLogger, registers a factory for console loggers.

program HelloWorld;

uses
  djLogOverSimpleLogger,
  slf4p;

procedure RunDemo;
begin
  LOGGER.Debug('Using slf4p %s', [SLF4P_VERSION]);
  LOGGER.Info('Hello, World!');
  LOGGER.Debug('Hit any key');
  ReadLn;
end;

begin
  RunDemo;
end.

Program output

[09:58:46.491] DEBUG - Using slf4p 1.0.6
[09:58:46.491] INFO - Hello, World!
[09:58:46.491] DEBUG - Hit any key

Log4D

The first unit used, djLogOverLog4D, registers a logger factory which created Log4D loggers.

program HelloWorld;

uses
  djLogOverLog4D, LogConsoleAppender, Log4d,
  slf4p;

procedure RunDemo;
var
  LogLayout: ILogLayout;
  ConsoleAppender: ILogAppender;
begin
  LogLayout := TLogPatternLayout.Create(TTCCPattern);
  ConsoleAppender := TLogConsoleAppender.Create('console');
  ConsoleAppender.Layout := LogLayout;
  TLogBasicConfigurator.Configure(ConsoleAppender);

  TLogLogger.GetRootLogger.Level := Debug;
  WriteLn('Logging with Log4D version ' + Log4DVersion);

  LOGGER.Debug('Using slf4p %s', [SLF4P_VERSION]);
  LOGGER.Info('Hello, World!');
  LOGGER.Debug('Hit any key');
  ReadLn;
end;

begin
  RunDemo;
end.

Program output

Logging with Log4D version 1.2.12
0 [13620] debug   - Using slf4p 1.0.6-SNAPSHOT
0 [13620] info   - Hello, World!
0 [13620] debug   - Hit any key

LazLogger

The first unit used, djLogOverLazLogger, registers a logger factory which created LazLogger loggers.

program HelloWorld;

uses
  djLogOverLazLogger,
  slf4p;

procedure RunDemo;
begin
  LOGGER.Debug('Using slf4p %s', [SLF4P_VERSION]);
  LOGGER.Info('Hello, World!');
  LOGGER.Debug('Hit any key');
  ReadLn;
end;

begin
  RunDemo;
end.

Program output

3 DEBUG  - Using slf4p 1.0.6
3 INFO  - Hello, World!
3 DEBUG  - Hit any key
Back to Pascal