<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pravin Chenthilkumar</title>
    <description>The latest articles on DEV Community by Pravin Chenthilkumar (@pravinc).</description>
    <link>https://dev.to/pravinc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4026725%2F6e91a47a-bfd6-4372-8c6b-3af347911d1e.png</url>
      <title>DEV Community: Pravin Chenthilkumar</title>
      <link>https://dev.to/pravinc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pravinc"/>
    <language>en</language>
    <item>
      <title>log4cplus user manual</title>
      <dc:creator>Pravin Chenthilkumar</dc:creator>
      <pubDate>Mon, 13 Jul 2026 06:22:59 +0000</pubDate>
      <link>https://dev.to/pravinc/log4cplus-user-manual-hde</link>
      <guid>https://dev.to/pravinc/log4cplus-user-manual-hde</guid>
      <description>&lt;h1&gt;
  
  
  log4cplus — Short User Manual
&lt;/h1&gt;

&lt;p&gt;log4cplus is a C++ logging library modeled on log4j, providing thread-safe,&lt;br&gt;
configurable logging with levels, appenders (output destinations), and&lt;br&gt;
layouts (formatting).&lt;/p&gt;
&lt;h2&gt;
  
  
  1. How to Use It
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1.1 Install / Link
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Ubuntu / Debian
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;liblog4cplus-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Link against the library in your build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;g++ myapp.cpp -llog4cplus -o myapp
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  From Source
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/log4cplus/log4cplus.git
&lt;span class="nb"&gt;cd &lt;/span&gt;log4cplus
&lt;span class="nb"&gt;mkdir &lt;/span&gt;build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;build
cmake ..
make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Link against the library in your build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;g++ myapp.cpp -llog4cplus -o myapp
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For cross-compilation (e.g. embedded ARM/MIPS targets), build with your&lt;br&gt;
toolchain's &lt;code&gt;cmake&lt;/code&gt; toolchain file and point &lt;code&gt;CMAKE_INSTALL_PREFIX&lt;/code&gt; to&lt;br&gt;
your sysroot, the same way you would for any other cross-compiled&lt;br&gt;
C/C++ library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compiler requirements:&lt;/strong&gt; the 2.x series (including the &lt;code&gt;2.1.2&lt;/code&gt; Conan&lt;br&gt;
release above) requires C++11. The 3.x series (current &lt;code&gt;master&lt;/code&gt;)&lt;br&gt;
requires C++23 — check your toolchain before building from the latest&lt;br&gt;
source.&lt;/p&gt;
&lt;h4&gt;
  
  
  Conan
&lt;/h4&gt;

&lt;p&gt;ConanCenter has an up-to-date recipe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# conanfile.txt
&lt;/span&gt;&lt;span class="nn"&gt;[requires]&lt;/span&gt;
&lt;span class="err"&gt;log4cplus/2.1.2&lt;/span&gt;

&lt;span class="nn"&gt;[generators]&lt;/span&gt;
&lt;span class="err"&gt;CMakeDeps&lt;/span&gt;
&lt;span class="err"&gt;CMakeToolchain&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conan &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--output-folder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;build &lt;span class="nt"&gt;--build&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;missing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;find_package(log4cplus REQUIRED)&lt;/code&gt; and link &lt;code&gt;log4cplus::log4cplus&lt;/code&gt;&lt;br&gt;
in your &lt;code&gt;CMakeLists.txt&lt;/code&gt; as usual.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2 Quick Reference (minimal working example)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/logger.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/loggingmacros.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/configurator.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PropertyConfigurator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;doConfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"log4cplus.properties"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;LOG4CPLUS_INFO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello from log4cplus"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  1.3 Basic Initialization
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/logger.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/loggingmacros.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/configurator.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Simple default setup: logs to console at DEBUG level&lt;/span&gt;
    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;BasicConfigurator&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;LOG4CPLUS_INFO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Application started"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;LOG4CPLUS_DEBUG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Debug value: "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;LOG4CPLUS_ERROR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Something failed"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Key pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logger&lt;/strong&gt; — named handle you log through (hierarchical, e.g.
&lt;code&gt;"main.video.decoder"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurator&lt;/strong&gt; — sets up appenders/levels either in code
(&lt;code&gt;BasicConfigurator&lt;/code&gt;) or from a properties file (&lt;code&gt;PropertyConfigurator&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Macros&lt;/strong&gt; (&lt;code&gt;LOG4CPLUS_INFO&lt;/code&gt;, &lt;code&gt;LOG4CPLUS_DEBUG&lt;/code&gt;, etc.) — stream-style
logging, only evaluate arguments if the level is enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  1.4 Configure via Properties File (recommended for real projects)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;log4cplus.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;log4cplus.rootLogger&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;DEBUG, STDOUT, FILE&lt;/span&gt;

&lt;span class="py"&gt;log4cplus.appender.STDOUT&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;log4cplus::ConsoleAppender&lt;/span&gt;
&lt;span class="py"&gt;log4cplus.appender.STDOUT.layout&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;log4cplus::PatternLayout&lt;/span&gt;
&lt;span class="py"&gt;log4cplus.appender.STDOUT.layout.ConversionPattern&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;%d{%H:%M:%S} [%t] %-5p %c - %m%n&lt;/span&gt;

&lt;span class="py"&gt;log4cplus.appender.FILE&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;log4cplus::RollingFileAppender&lt;/span&gt;
&lt;span class="py"&gt;log4cplus.appender.FILE.File&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;app.log&lt;/span&gt;
&lt;span class="py"&gt;log4cplus.appender.FILE.MaxFileSize&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;5MB&lt;/span&gt;
&lt;span class="py"&gt;log4cplus.appender.FILE.MaxBackupIndex&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;
&lt;span class="py"&gt;log4cplus.appender.FILE.layout&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;log4cplus::PatternLayout&lt;/span&gt;
&lt;span class="py"&gt;log4cplus.appender.FILE.layout.ConversionPattern&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;%d %-5p %c [%t] - %m%n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Load it in code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/configurator.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;PropertyConfigurator&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;doConfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"log4cplus.properties"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets you change log levels/destinations without recompiling — useful&lt;br&gt;
for field debugging on embedded targets.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.5 Log Levels (lowest → highest severity)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;TRACE &amp;lt; DEBUG &amp;lt; INFO &amp;lt; WARN &amp;lt; ERROR &amp;lt; FATAL&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Plus two special pseudo-levels used only for filtering (not real events):&lt;br&gt;
&lt;code&gt;ALL&lt;/code&gt; (enables everything) and &lt;code&gt;OFF&lt;/code&gt; (disables everything).&lt;/p&gt;

&lt;p&gt;Set per-logger level to control verbosity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLogLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WARN_LOG_LEVEL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Is there a built-in &lt;code&gt;MILESTONE&lt;/code&gt; level?&lt;/strong&gt; No — there's no such level shipped&lt;br&gt;
with log4cplus. It does support registering custom log levels (via&lt;br&gt;
&lt;code&gt;LogLevelManager::pushToStringMethod&lt;/code&gt;/&lt;code&gt;pushFromStringMethod&lt;/code&gt;), so you could&lt;br&gt;
in theory define a &lt;code&gt;MILESTONE&lt;/code&gt; level between &lt;code&gt;INFO&lt;/code&gt; and &lt;code&gt;WARN&lt;/code&gt;. In practice&lt;br&gt;
this is a fragile corner of the library — there are known issues where&lt;br&gt;
custom levels set via a property file crash configuration, and levels set&lt;br&gt;
at runtime can show up as &lt;code&gt;UNKNOWN&lt;/code&gt; in log output. Most projects avoid this&lt;br&gt;
by just using &lt;code&gt;INFO&lt;/code&gt; with a distinct logger name or message prefix (e.g. a&lt;br&gt;
dedicated &lt;code&gt;"milestone"&lt;/code&gt; logger) instead of a real custom level.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.6 Common Appenders
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Appender&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ConsoleAppender&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;stdout/stderr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FileAppender&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;plain file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RollingFileAppender&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;size-based log rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DailyRollingFileAppender&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;date-based rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SocketAppender&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;send logs over TCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SysLogAppender&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;forward to syslog (handy on embedded Linux)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CallbackAppender&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;invoke your own C-style function per log event&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Routing logs into your own function: &lt;code&gt;CallbackAppender&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;If you want log events delivered straight into your own code (e.g. push to&lt;br&gt;
a UI, telemetry pipe, ring buffer) rather than to a file/console/socket,&lt;br&gt;
use &lt;code&gt;CallbackAppender&lt;/code&gt; (&lt;code&gt;log4cplus/callbackappender.h&lt;/code&gt;). It takes a plain&lt;br&gt;
function pointer plus a &lt;code&gt;void*&lt;/code&gt; "cookie" for your own context — no&lt;br&gt;
subclassing required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/callbackappender.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;log4cplus/loggingmacros.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;myLogCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tchar&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tchar&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;loggerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tchar&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kr"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tchar&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;thread2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;timestampSec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;timestampUsec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tchar&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;tchar&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Route into your own function — e.g. push to a UI, telemetry, etc.&lt;/span&gt;
    &lt;span class="n"&gt;MyOwnSink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SharedAppenderPtr&lt;/span&gt; &lt;span class="n"&gt;appender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CallbackAppender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myLogCallback&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/*cookie=*/&lt;/span&gt;&lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;appender&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"myCallback"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getRoot&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;addAppender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;appender&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;LOG4CPLUS_INFO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOG4CPLUS_TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"This goes through my function"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Threading note: appenders run synchronously by default
&lt;/h4&gt;

&lt;p&gt;By default, an appender's I/O runs on whichever thread called the log&lt;br&gt;
macro — there's no dedicated logging thread. &lt;code&gt;ConsoleAppender&lt;/code&gt; in&lt;br&gt;
particular locks a single, process-wide mutex before writing (shared by&lt;br&gt;
all &lt;code&gt;ConsoleAppender&lt;/code&gt; instances), so heavy or frequent console logging&lt;br&gt;
from a latency-sensitive thread can become a real serialization point.&lt;/p&gt;

&lt;p&gt;If an appender's I/O cost is showing up as jitter on a thread you're&lt;br&gt;
analyzing, set &lt;code&gt;async=true&lt;/code&gt; on that appender (in code, or via&lt;br&gt;
&lt;code&gt;log4cplus.appender.X.async=true&lt;/code&gt; in the properties file). This offloads&lt;br&gt;
the actual write to log4cplus's internal thread pool (size configurable&lt;br&gt;
via &lt;code&gt;log4cplus.threadPoolSize&lt;/code&gt;) instead of blocking the calling thread.&lt;/p&gt;

&lt;p&gt;If you need more control (internal state, filtering logic, batching),&lt;br&gt;
subclass &lt;code&gt;log4cplus::Appender&lt;/code&gt; directly and implement &lt;code&gt;append()&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;close()&lt;/code&gt; instead.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.7 Shutdown
&lt;/h3&gt;

&lt;p&gt;Call at program exit to flush/close appenders cleanly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;log4cplus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Ordered roughly by relevance/usefulness for day-to-day use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;docs/examples.md — canonical minimal usage walkthrough&lt;br&gt;
&lt;a href="https://github.com/log4cplus/log4cplus/blob/master/docs/examples.md" rel="noopener noreferrer"&gt;https://github.com/log4cplus/log4cplus/blob/master/docs/examples.md&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;log4cplus GitHub repository — README, build options, source&lt;br&gt;
&lt;a href="https://github.com/log4cplus/log4cplus" rel="noopener noreferrer"&gt;https://github.com/log4cplus/log4cplus&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Doxygen API reference (v2.0.8) — full class docs&lt;br&gt;
&lt;a href="https://log4cplus.github.io/log4cplus/docs/log4cplus-2.0.8/doxygen/classlog4cplus_1_1Appender.html" rel="noopener noreferrer"&gt;https://log4cplus.github.io/log4cplus/docs/log4cplus-2.0.8/doxygen/classlog4cplus_1_1Appender.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;callbackappender.cxx — CallbackAppender source&lt;br&gt;
&lt;a href="https://github.com/log4cplus/log4cplus/blob/master/src/callbackappender.cxx" rel="noopener noreferrer"&gt;https://github.com/log4cplus/log4cplus/blob/master/src/callbackappender.cxx&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;appender.h — base Appender class header&lt;br&gt;
&lt;a href="https://github.com/log4cplus/log4cplus/blob/master/include/log4cplus/appender.h" rel="noopener noreferrer"&gt;https://github.com/log4cplus/log4cplus/blob/master/include/log4cplus/appender.h&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configurator.h — PropertyConfigurator, root logger syntax, additivity rule&lt;br&gt;
&lt;a href="https://github.com/log4cplus/log4cplus/blob/master/include/log4cplus/configurator.h" rel="noopener noreferrer"&gt;https://github.com/log4cplus/log4cplus/blob/master/include/log4cplus/configurator.h&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SourceForge wiki — Code Examples (older, supplementary snippets)&lt;br&gt;
&lt;a href="https://sourceforge.net/p/log4cplus/wiki/CodeExamples/" rel="noopener noreferrer"&gt;https://sourceforge.net/p/log4cplus/wiki/CodeExamples/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub Issue #308 — discussion on custom loggers/log level control&lt;br&gt;
&lt;a href="https://github.com/log4cplus/log4cplus/issues/308" rel="noopener noreferrer"&gt;https://github.com/log4cplus/log4cplus/issues/308&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SourceForge Bug #268 — custom log level property-file crash issue&lt;br&gt;
&lt;a href="https://sourceforge.net/p/log4cplus/bugs/268/" rel="noopener noreferrer"&gt;https://sourceforge.net/p/log4cplus/bugs/268/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>cpp</category>
      <category>logging</category>
      <category>log4cplus</category>
    </item>
  </channel>
</rss>
