- Replace `TThreadedList<T>` with a custom implementation (`TThreadSafeQueue<T>`) because of a [bug](https://forums.embarcadero.com/thread.jspa?messageID=941762) and [this](https://quality.embarcadero.com/browse/RSP-19993) in `TMonitor`.
-`TThreadSafeQueue<T>` is not a drop-in replacement for the `TThreadedQueue<T>` but can be used in other projects if you are fighting with the same bug.
-`TVCLMemoLogAppender.Create` gots new parameter: `aClearOnStartup` which optionally clear the memo at the startup.
- Improvement to the `TLoggerProConsoleAppender` (Thanks to [Fulgan](https://github.com/Fulgan))
- Improvement to the `TLoggerProFileAppender`; now there is a `OnLogRow` callback that can be used to customize log row format.
- New overloaded `Log` methods. The `*Fmt` versions are deprecated and will be removed in a future version [ISSUE #17](https://github.com/danieleteti/loggerpro/issues/17)
- New [NSQ](https://nsq.io) appender (Thanks to [Fulgan](https://github.com/Fulgan))
- New logger filter decorator (Thanks to [Fulgan](https://github.com/Fulgan))
- New REST appender with support for extended information (samples for Windows and Android)
- Extended information are supported in Windows (fully) and Android (partially)
- In the sample folder is provided also the `RESTLogCollector`
- New [Elastic Search](https://www.elastic.co/products/elasticsearch) Log appender (Thanks to Salvatore Sparacino)
## Getting started
```delphi
program getting_started_console;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
LoggerPro.GlobalLogger; //this is the global logger, it is perfect to understand the basic operation of LoggerPro.
begin
try
//the global logger uses a TLoggerProFileAppender, so your logs will be written on a
//set of files with automatic rolling/rotating
Log.Debug('Debug message', 'main'); //TLoggerProFileAppender uses the "tag" to select a different log file
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check "getting_started_console.00.main.log" and "getting_started_console.00.errors.log" to see your logs');
ReadLn;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
```
The most flexible/correct approach is not much complicated than the global logger one. Check how is simple to create a custom instance of logwriter
- [NSQ](https://nsq.io) appender (Thanks to [Fulgan](https://github.com/Fulgan)) (v1.3.0+)
- Decorator appender (Thanks to [Fulgan](https://github.com/Fulgan)) (v1.3.0+)
Next appenders in the development pipeline
- RESTful Appender (to send logs to a rest endpoint using a specific request format, so that you can implement log server in DelphiMVCFramework, PHP, Java, Python, Node etc)
- Twitter Appender (to send logs to a Twitter Account)
- Database appender (to send logs to a database table using FireDAC components -- Thank You Omar Bossoni)
The log writers and all the appenders are asycnhronous.
**Check the samples to see how to use each appender or even combine different appenders.**
## Documentation
Documentation is available in the `docs` folder as HTML.
## Other
You can install [Delphinus package manager](https://github.com/Memnarch/Delphinus/wiki/Installing-Delphinus) and install LoggerPro as a package there. (Delphinus-Support)