Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

LoggerPro for Delphi

An modern and pluggable logging framework for Delphi

Compatibility

LoggerPro is compatibile with

  • Delphi XE2
  • Delphi XE3
  • Delphi XE4
  • Delphi XE5
  • Delphi XE6
  • Delphi XE7
  • Delphi XE8
  • Delphi 10 Seattle
  • Delphi 10.1 Berlin
  • Delphi 10.2 Tokyo (Linux compatibility)

What's new in 1.3.0

  • Replace TThreadedList<T> a custom implementation (TThreadSafeQueue<T>) because of a bug and this in TMonitor.
    • ``TThreadSafeQueueis not a drop-in replacement for theTThreadedQueue` 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)
  • 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
  • New NSQ appender (Thanks to Fulgan)
  • New logger filter decorator (Thanks to 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 Log appender (Thanks to Salvatore Sparacino)

Getting started

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.begintry//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

program getting_started_console_appenders;
{$APPTYPE CONSOLE}uses
System.SysUtils,
LoggerPro, //LoggerPro core
LoggerPro.FileAppender, //File appender
LoggerPro.OutputDebugStringAppender; //OutputDebugString appendervar
Log: ILogWriter;
begin
Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProOutputDebugStringAppender.Create]);
try
Log.Debug('Debug message', 'main');
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check ');
WriteLn(' "getting_started_console.00.main.log"');
WriteLn(' "getting_started_console.00.errors.log"');
if DebugHook <> 0then//inform the user where his/her logs arebegin
WriteLn('also, you logs have been sent to the current debugger, check the Delphi''s EventLog window to see them.');
endelsebegin
WriteLn('..seems that no debugger is present. The logs can be seen using DebugView.');
WriteLn('Download it from here https://technet.microsoft.com/en-us/sysinternals/debugview.aspx');
WriteLn('Learn how to use http://tedgustaf.com/blog/2011/5/use-debugview-to-view-debug-output-from-asp-net-web-application/');
end;
ReadLn;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

Built-in log appenders

The framework contains the following built-in log appenders

  • File appender (TLoggerProFileAppender) (v1.0.0+)
  • Console appender (TLoggerProConsoleAppender) (v1.0.0+)
  • OutputDebugString appender (TLoggerProOutputDebugStringAppender) (v1.0.0+)
  • VCL Memo appender (TVCLMemoLogAppender) (v1.0.0+)
  • VCL ListView appender (TVCLMemoLogAppender) -- thanks to https://github.com/he3p94uu (v1.3.0+)
  • Redis Appender with LogsViewer(to aggregate logs from different instances on a single Redis instance) (v1.2.0+)
  • Email appender (to send email as log, very useful for fatal errors) (v1.2.0+)
  • SysLog appender RFC 5424 compliant -- thanks to https://github.com/nurettin (v1.3.0+)
  • NSQ appender (Thanks to Fulgan) (v1.3.0+)
  • Decorator appender (Thanks to 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 and install LoggerPro as a package there. (Delphinus-Support)

About

An modern and pluggable logging framework for Delphi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

LoggerPro for Delphi

An modern and pluggable logging framework for Delphi

Compatibility

LoggerPro is compatibile with

  • Delphi XE2
  • Delphi XE3
  • Delphi XE4
  • Delphi XE5
  • Delphi XE6
  • Delphi XE7
  • Delphi XE8
  • Delphi 10 Seattle
  • Delphi 10.1 Berlin
  • Delphi 10.2 Tokyo (Linux compatibility)

What's new in 1.3.0

  • Replace TThreadedList<T> a custom implementation (TThreadSafeQueue<T>) because of a bug and this in TMonitor.
    • ``TThreadSafeQueueis not a drop-in replacement for theTThreadedQueue` 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)
  • 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
  • New NSQ appender (Thanks to Fulgan)
  • New logger filter decorator (Thanks to 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 Log appender (Thanks to Salvatore Sparacino)

Getting started

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.begintry//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

program getting_started_console_appenders;
{$APPTYPE CONSOLE}uses
System.SysUtils,
LoggerPro, //LoggerPro core
LoggerPro.FileAppender, //File appender
LoggerPro.OutputDebugStringAppender; //OutputDebugString appendervar
Log: ILogWriter;
begin
Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProOutputDebugStringAppender.Create]);
try
Log.Debug('Debug message', 'main');
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check ');
WriteLn(' "getting_started_console.00.main.log"');
WriteLn(' "getting_started_console.00.errors.log"');
if DebugHook <> 0then//inform the user where his/her logs arebegin
WriteLn('also, you logs have been sent to the current debugger, check the Delphi''s EventLog window to see them.');
endelsebegin
WriteLn('..seems that no debugger is present. The logs can be seen using DebugView.');
WriteLn('Download it from here https://technet.microsoft.com/en-us/sysinternals/debugview.aspx');
WriteLn('Learn how to use http://tedgustaf.com/blog/2011/5/use-debugview-to-view-debug-output-from-asp-net-web-application/');
end;
ReadLn;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

Built-in log appenders

The framework contains the following built-in log appenders

  • File appender (TLoggerProFileAppender) (v1.0.0+)
  • Console appender (TLoggerProConsoleAppender) (v1.0.0+)
  • OutputDebugString appender (TLoggerProOutputDebugStringAppender) (v1.0.0+)
  • VCL Memo appender (TVCLMemoLogAppender) (v1.0.0+)
  • VCL ListView appender (TVCLMemoLogAppender) -- thanks to https://github.com/he3p94uu (v1.3.0+)
  • Redis Appender with LogsViewer(to aggregate logs from different instances on a single Redis instance) (v1.2.0+)
  • Email appender (to send email as log, very useful for fatal errors) (v1.2.0+)
  • SysLog appender RFC 5424 compliant -- thanks to https://github.com/nurettin (v1.3.0+)
  • NSQ appender (Thanks to Fulgan) (v1.3.0+)
  • Decorator appender (Thanks to 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 and install LoggerPro as a package there. (Delphinus-Support)

About

An modern and pluggable logging framework for Delphi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

LoggerPro for Delphi

An modern and pluggable logging framework for Delphi

Compatibility

LoggerPro is compatibile with

  • Delphi XE2
  • Delphi XE3
  • Delphi XE4
  • Delphi XE5
  • Delphi XE6
  • Delphi XE7
  • Delphi XE8
  • Delphi 10 Seattle
  • Delphi 10.1 Berlin
  • Delphi 10.2 Tokyo (Linux compatibility)

What's new in 1.3.0

  • Replace TThreadedList<T> a custom implementation (TThreadSafeQueue<T>) because of a bug and this in TMonitor.
    • ``TThreadSafeQueueis not a drop-in replacement for theTThreadedQueue` 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)
  • 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
  • New NSQ appender (Thanks to Fulgan)
  • New logger filter decorator (Thanks to 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 Log appender (Thanks to Salvatore Sparacino)

Getting started

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.begintry//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

program getting_started_console_appenders;
{$APPTYPE CONSOLE}uses
System.SysUtils,
LoggerPro, //LoggerPro core
LoggerPro.FileAppender, //File appender
LoggerPro.OutputDebugStringAppender; //OutputDebugString appendervar
Log: ILogWriter;
begin
Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProOutputDebugStringAppender.Create]);
try
Log.Debug('Debug message', 'main');
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check ');
WriteLn(' "getting_started_console.00.main.log"');
WriteLn(' "getting_started_console.00.errors.log"');
if DebugHook <> 0then//inform the user where his/her logs arebegin
WriteLn('also, you logs have been sent to the current debugger, check the Delphi''s EventLog window to see them.');
endelsebegin
WriteLn('..seems that no debugger is present. The logs can be seen using DebugView.');
WriteLn('Download it from here https://technet.microsoft.com/en-us/sysinternals/debugview.aspx');
WriteLn('Learn how to use http://tedgustaf.com/blog/2011/5/use-debugview-to-view-debug-output-from-asp-net-web-application/');
end;
ReadLn;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

Built-in log appenders

The framework contains the following built-in log appenders

  • File appender (TLoggerProFileAppender) (v1.0.0+)
  • Console appender (TLoggerProConsoleAppender) (v1.0.0+)
  • OutputDebugString appender (TLoggerProOutputDebugStringAppender) (v1.0.0+)
  • VCL Memo appender (TVCLMemoLogAppender) (v1.0.0+)
  • VCL ListView appender (TVCLMemoLogAppender) -- thanks to https://github.com/he3p94uu (v1.3.0+)
  • Redis Appender with LogsViewer(to aggregate logs from different instances on a single Redis instance) (v1.2.0+)
  • Email appender (to send email as log, very useful for fatal errors) (v1.2.0+)
  • SysLog appender RFC 5424 compliant -- thanks to https://github.com/nurettin (v1.3.0+)
  • NSQ appender (Thanks to Fulgan) (v1.3.0+)
  • Decorator appender (Thanks to 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 and install LoggerPro as a package there. (Delphinus-Support)

About

An modern and pluggable logging framework for Delphi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

LoggerPro for Delphi

An modern and pluggable logging framework for Delphi

Compatibility

LoggerPro is compatibile with

  • Delphi XE2
  • Delphi XE3
  • Delphi XE4
  • Delphi XE5
  • Delphi XE6
  • Delphi XE7
  • Delphi XE8
  • Delphi 10 Seattle
  • Delphi 10.1 Berlin
  • Delphi 10.2 Tokyo (Linux compatibility)

What's new in 1.3.0

  • Replace TThreadedList<T> a custom implementation (TThreadSafeQueue<T>) because of a bug and this in TMonitor.
    • ``TThreadSafeQueueis not a drop-in replacement for theTThreadedQueue` 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)
  • 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
  • New NSQ appender (Thanks to Fulgan)
  • New logger filter decorator (Thanks to 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 Log appender (Thanks to Salvatore Sparacino)

Getting started

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.begintry//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

program getting_started_console_appenders;
{$APPTYPE CONSOLE}uses
System.SysUtils,
LoggerPro, //LoggerPro core
LoggerPro.FileAppender, //File appender
LoggerPro.OutputDebugStringAppender; //OutputDebugString appendervar
Log: ILogWriter;
begin
Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProOutputDebugStringAppender.Create]);
try
Log.Debug('Debug message', 'main');
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check ');
WriteLn(' "getting_started_console.00.main.log"');
WriteLn(' "getting_started_console.00.errors.log"');
if DebugHook <> 0then//inform the user where his/her logs arebegin
WriteLn('also, you logs have been sent to the current debugger, check the Delphi''s EventLog window to see them.');
endelsebegin
WriteLn('..seems that no debugger is present. The logs can be seen using DebugView.');
WriteLn('Download it from here https://technet.microsoft.com/en-us/sysinternals/debugview.aspx');
WriteLn('Learn how to use http://tedgustaf.com/blog/2011/5/use-debugview-to-view-debug-output-from-asp-net-web-application/');
end;
ReadLn;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

Built-in log appenders

The framework contains the following built-in log appenders

  • File appender (TLoggerProFileAppender) (v1.0.0+)
  • Console appender (TLoggerProConsoleAppender) (v1.0.0+)
  • OutputDebugString appender (TLoggerProOutputDebugStringAppender) (v1.0.0+)
  • VCL Memo appender (TVCLMemoLogAppender) (v1.0.0+)
  • VCL ListView appender (TVCLMemoLogAppender) -- thanks to https://github.com/he3p94uu (v1.3.0+)
  • Redis Appender with LogsViewer(to aggregate logs from different instances on a single Redis instance) (v1.2.0+)
  • Email appender (to send email as log, very useful for fatal errors) (v1.2.0+)
  • SysLog appender RFC 5424 compliant -- thanks to https://github.com/nurettin (v1.3.0+)
  • NSQ appender (Thanks to Fulgan) (v1.3.0+)
  • Decorator appender (Thanks to 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 and install LoggerPro as a package there. (Delphinus-Support)

About

An modern and pluggable logging framework for Delphi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

LoggerPro for Delphi

An modern and pluggable logging framework for Delphi

Compatibility

LoggerPro is compatibile with

  • Delphi XE2
  • Delphi XE3
  • Delphi XE4
  • Delphi XE5
  • Delphi XE6
  • Delphi XE7
  • Delphi XE8
  • Delphi 10 Seattle
  • Delphi 10.1 Berlin
  • Delphi 10.2 Tokyo (Linux compatibility)

What's new in 1.3.0

  • Replace TThreadedList<T> a custom implementation (TThreadSafeQueue<T>) because of a bug and this in TMonitor.
    • ``TThreadSafeQueueis not a drop-in replacement for theTThreadedQueue` 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)
  • 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
  • New NSQ appender (Thanks to Fulgan)
  • New logger filter decorator (Thanks to 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 Log appender (Thanks to Salvatore Sparacino)

Getting started

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.begintry//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

program getting_started_console_appenders;
{$APPTYPE CONSOLE}uses
System.SysUtils,
LoggerPro, //LoggerPro core
LoggerPro.FileAppender, //File appender
LoggerPro.OutputDebugStringAppender; //OutputDebugString appendervar
Log: ILogWriter;
begin
Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProOutputDebugStringAppender.Create]);
try
Log.Debug('Debug message', 'main');
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check ');
WriteLn(' "getting_started_console.00.main.log"');
WriteLn(' "getting_started_console.00.errors.log"');
if DebugHook <> 0then//inform the user where his/her logs arebegin
WriteLn('also, you logs have been sent to the current debugger, check the Delphi''s EventLog window to see them.');
endelsebegin
WriteLn('..seems that no debugger is present. The logs can be seen using DebugView.');
WriteLn('Download it from here https://technet.microsoft.com/en-us/sysinternals/debugview.aspx');
WriteLn('Learn how to use http://tedgustaf.com/blog/2011/5/use-debugview-to-view-debug-output-from-asp-net-web-application/');
end;
ReadLn;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

Built-in log appenders

The framework contains the following built-in log appenders

  • File appender (TLoggerProFileAppender) (v1.0.0+)
  • Console appender (TLoggerProConsoleAppender) (v1.0.0+)
  • OutputDebugString appender (TLoggerProOutputDebugStringAppender) (v1.0.0+)
  • VCL Memo appender (TVCLMemoLogAppender) (v1.0.0+)
  • VCL ListView appender (TVCLMemoLogAppender) -- thanks to https://github.com/he3p94uu (v1.3.0+)
  • Redis Appender with LogsViewer(to aggregate logs from different instances on a single Redis instance) (v1.2.0+)
  • Email appender (to send email as log, very useful for fatal errors) (v1.2.0+)
  • SysLog appender RFC 5424 compliant -- thanks to https://github.com/nurettin (v1.3.0+)
  • NSQ appender (Thanks to Fulgan) (v1.3.0+)
  • Decorator appender (Thanks to 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 and install LoggerPro as a package there. (Delphinus-Support)

About

An modern and pluggable logging framework for Delphi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

LoggerPro for Delphi

An modern and pluggable logging framework for Delphi

Compatibility

LoggerPro is compatibile with

  • Delphi XE2
  • Delphi XE3
  • Delphi XE4
  • Delphi XE5
  • Delphi XE6
  • Delphi XE7
  • Delphi XE8
  • Delphi 10 Seattle
  • Delphi 10.1 Berlin
  • Delphi 10.2 Tokyo (Linux compatibility)

What's new in 1.3.0

  • Replace TThreadedList<T> a custom implementation (TThreadSafeQueue<T>) because of a bug and this in TMonitor.
    • ``TThreadSafeQueueis not a drop-in replacement for theTThreadedQueue` 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)
  • 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
  • New NSQ appender (Thanks to Fulgan)
  • New logger filter decorator (Thanks to 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 Log appender (Thanks to Salvatore Sparacino)

Getting started

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.begintry//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

program getting_started_console_appenders;
{$APPTYPE CONSOLE}uses
System.SysUtils,
LoggerPro, //LoggerPro core
LoggerPro.FileAppender, //File appender
LoggerPro.OutputDebugStringAppender; //OutputDebugString appendervar
Log: ILogWriter;
begin
Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProOutputDebugStringAppender.Create]);
try
Log.Debug('Debug message', 'main');
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check ');
WriteLn(' "getting_started_console.00.main.log"');
WriteLn(' "getting_started_console.00.errors.log"');
if DebugHook <> 0then//inform the user where his/her logs arebegin
WriteLn('also, you logs have been sent to the current debugger, check the Delphi''s EventLog window to see them.');
endelsebegin
WriteLn('..seems that no debugger is present. The logs can be seen using DebugView.');
WriteLn('Download it from here https://technet.microsoft.com/en-us/sysinternals/debugview.aspx');
WriteLn('Learn how to use http://tedgustaf.com/blog/2011/5/use-debugview-to-view-debug-output-from-asp-net-web-application/');
end;
ReadLn;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

Built-in log appenders

The framework contains the following built-in log appenders

  • File appender (TLoggerProFileAppender) (v1.0.0+)
  • Console appender (TLoggerProConsoleAppender) (v1.0.0+)
  • OutputDebugString appender (TLoggerProOutputDebugStringAppender) (v1.0.0+)
  • VCL Memo appender (TVCLMemoLogAppender) (v1.0.0+)
  • VCL ListView appender (TVCLMemoLogAppender) -- thanks to https://github.com/he3p94uu (v1.3.0+)
  • Redis Appender with LogsViewer(to aggregate logs from different instances on a single Redis instance) (v1.2.0+)
  • Email appender (to send email as log, very useful for fatal errors) (v1.2.0+)
  • SysLog appender RFC 5424 compliant -- thanks to https://github.com/nurettin (v1.3.0+)
  • NSQ appender (Thanks to Fulgan) (v1.3.0+)
  • Decorator appender (Thanks to 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 and install LoggerPro as a package there. (Delphinus-Support)

About

An modern and pluggable logging framework for Delphi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

LoggerPro for Delphi

An modern and pluggable logging framework for Delphi

Compatibility

LoggerPro is compatibile with

  • Delphi XE2
  • Delphi XE3
  • Delphi XE4
  • Delphi XE5
  • Delphi XE6
  • Delphi XE7
  • Delphi XE8
  • Delphi 10 Seattle
  • Delphi 10.1 Berlin
  • Delphi 10.2 Tokyo (Linux compatibility)

What's new in 1.3.0

  • Replace TThreadedList<T> a custom implementation (TThreadSafeQueue<T>) because of a bug and this in TMonitor.
    • ``TThreadSafeQueueis not a drop-in replacement for theTThreadedQueue` 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)
  • 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
  • New NSQ appender (Thanks to Fulgan)
  • New logger filter decorator (Thanks to 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 Log appender (Thanks to Salvatore Sparacino)

Getting started

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.begintry//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

program getting_started_console_appenders;
{$APPTYPE CONSOLE}uses
System.SysUtils,
LoggerPro, //LoggerPro core
LoggerPro.FileAppender, //File appender
LoggerPro.OutputDebugStringAppender; //OutputDebugString appendervar
Log: ILogWriter;
begin
Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProOutputDebugStringAppender.Create]);
try
Log.Debug('Debug message', 'main');
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check ');
WriteLn(' "getting_started_console.00.main.log"');
WriteLn(' "getting_started_console.00.errors.log"');
if DebugHook <> 0then//inform the user where his/her logs arebegin
WriteLn('also, you logs have been sent to the current debugger, check the Delphi''s EventLog window to see them.');
endelsebegin
WriteLn('..seems that no debugger is present. The logs can be seen using DebugView.');
WriteLn('Download it from here https://technet.microsoft.com/en-us/sysinternals/debugview.aspx');
WriteLn('Learn how to use http://tedgustaf.com/blog/2011/5/use-debugview-to-view-debug-output-from-asp-net-web-application/');
end;
ReadLn;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

Built-in log appenders

The framework contains the following built-in log appenders

  • File appender (TLoggerProFileAppender) (v1.0.0+)
  • Console appender (TLoggerProConsoleAppender) (v1.0.0+)
  • OutputDebugString appender (TLoggerProOutputDebugStringAppender) (v1.0.0+)
  • VCL Memo appender (TVCLMemoLogAppender) (v1.0.0+)
  • VCL ListView appender (TVCLMemoLogAppender) -- thanks to https://github.com/he3p94uu (v1.3.0+)
  • Redis Appender with LogsViewer(to aggregate logs from different instances on a single Redis instance) (v1.2.0+)
  • Email appender (to send email as log, very useful for fatal errors) (v1.2.0+)
  • SysLog appender RFC 5424 compliant -- thanks to https://github.com/nurettin (v1.3.0+)
  • NSQ appender (Thanks to Fulgan) (v1.3.0+)
  • Decorator appender (Thanks to 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 and install LoggerPro as a package there. (Delphinus-Support)

About

An modern and pluggable logging framework for Delphi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

LoggerPro for Delphi

An modern and pluggable logging framework for Delphi

Compatibility

LoggerPro is compatibile with

  • Delphi XE2
  • Delphi XE3
  • Delphi XE4
  • Delphi XE5
  • Delphi XE6
  • Delphi XE7
  • Delphi XE8
  • Delphi 10 Seattle
  • Delphi 10.1 Berlin
  • Delphi 10.2 Tokyo (Linux compatibility)

What's new in 1.3.0

  • Replace TThreadedList<T> a custom implementation (TThreadSafeQueue<T>) because of a bug and this in TMonitor.
    • ``TThreadSafeQueueis not a drop-in replacement for theTThreadedQueue` 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)
  • 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
  • New NSQ appender (Thanks to Fulgan)
  • New logger filter decorator (Thanks to 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 Log appender (Thanks to Salvatore Sparacino)

Getting started

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.begintry//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

program getting_started_console_appenders;
{$APPTYPE CONSOLE}uses
System.SysUtils,
LoggerPro, //LoggerPro core
LoggerPro.FileAppender, //File appender
LoggerPro.OutputDebugStringAppender; //OutputDebugString appendervar
Log: ILogWriter;
begin
Log := BuildLogWriter([TLoggerProFileAppender.Create,
TLoggerProOutputDebugStringAppender.Create]);
try
Log.Debug('Debug message', 'main');
Log.Info('Info message', 'main');
Log.Warn('Warning message', 'main');
Log.Error('Error message', 'errors');
WriteLn('Check ');
WriteLn(' "getting_started_console.00.main.log"');
WriteLn(' "getting_started_console.00.errors.log"');
if DebugHook <> 0then//inform the user where his/her logs arebegin
WriteLn('also, you logs have been sent to the current debugger, check the Delphi''s EventLog window to see them.');
endelsebegin
WriteLn('..seems that no debugger is present. The logs can be seen using DebugView.');
WriteLn('Download it from here https://technet.microsoft.com/en-us/sysinternals/debugview.aspx');
WriteLn('Learn how to use http://tedgustaf.com/blog/2011/5/use-debugview-to-view-debug-output-from-asp-net-web-application/');
end;
ReadLn;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.

Built-in log appenders

The framework contains the following built-in log appenders

  • File appender (TLoggerProFileAppender) (v1.0.0+)
  • Console appender (TLoggerProConsoleAppender) (v1.0.0+)
  • OutputDebugString appender (TLoggerProOutputDebugStringAppender) (v1.0.0+)
  • VCL Memo appender (TVCLMemoLogAppender) (v1.0.0+)
  • VCL ListView appender (TVCLMemoLogAppender) -- thanks to https://github.com/he3p94uu (v1.3.0+)
  • Redis Appender with LogsViewer(to aggregate logs from different instances on a single Redis instance) (v1.2.0+)
  • Email appender (to send email as log, very useful for fatal errors) (v1.2.0+)
  • SysLog appender RFC 5424 compliant -- thanks to https://github.com/nurettin (v1.3.0+)
  • NSQ appender (Thanks to Fulgan) (v1.3.0+)
  • Decorator appender (Thanks to 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 and install LoggerPro as a package there. (Delphinus-Support)

About

An modern and pluggable logging framework for Delphi

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages