blob: 783aacd2db0f61273df369200b3834ebd5a73bec [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Logging &mdash; Apache Mynewt latest documentation</title>
<link rel="shortcut icon" href="../../../_static/mynewt-logo-only-newt32x32.png"/>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/sphinx_theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/bootstrap-3.0.3.min.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/v2.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/restructuredtext.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/overrides.css" type="text/css" />
<link rel="index" title="Index"
href="../../../genindex.html"/>
<link rel="search" title="Search" href="../../../search.html"/>
<link rel="top" title="Apache Mynewt latest documentation" href="../../../index.html"/>
<link rel="up" title="System Modules" href="../system_modules.html"/>
<link rel="next" title="Statistics Module" href="../stats/stats.html"/>
<link rel="prev" title="Config" href="../config/config.html"/>
<script src="../../../_static/js/modernizr.min.js"></script>
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="not-front page-documentation" role="document" >
<div id="wrapper">
<div class="container">
<div id="banner" class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="../../../_static/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.12.0, Apache NimBLE 1.7.0 </a> released April 4, 2024)
</div>
</div>
</div>
</div>
<header>
<nav id="navbar" class="navbar navbar-inverse" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li class="important">
<a href="/quick-start/">Quick Start</a>
</li>
<li>
<a href="/about/">About</a>
</li>
<li>
<a href="/talks/">Talks</a>
</li>
<li class="active">
<a href="/documentation/">Documentation</a>
</li>
<li>
<a href="/download/">Download</a>
</li>
<li>
<a href="/community/">Community</a>
</li>
<li>
<a href="/events/">Events</a>
</li>
</ul>
<!-- Search, Navigation and Repo links -->
<ul class="nav navbar-nav navbar-right">
</ul>
</div>
</div>
</nav>
</header>
<!-- STARTS MAIN CONTENT -->
<div id="main-content">
<div id="breadcrumb">
<div class="container">
<a href="/documentation/">Docs</a> /
<a href="../../os_user_guide.html">OS User Guide</a> /
<a href="../system_modules.html">System Modules</a> /
Logging
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-core/edit/master/docs/os/modules/logs/logs.rst" class="icon icon-github"
rel="nofollow"> Edit on GitHub</a>
</div>
</div>
</div>
<!-- STARTS CONTAINER -->
<div class="container">
<!-- STARTS .content -->
<div id="content" class="row">
<!-- STARTS .container-sidebar -->
<div class="container-sidebar col-xs-12 col-sm-3">
<div id="docSidebar" class="sticky-container">
<div role="search" class="sphinx-search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search documentation" class="search-documentation" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<!-- Note: only works when deployed -->
<select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest" selected>
Version: latest
</option>
<option value="/v1_12_0" >
Version: 1.12.0
</option>
<option value="/v1_11_0" >
Version: 1.11.0
</option>
<option value="/v1_10_0" >
Version: 1.10.0
</option>
<option value="/v1_9_0" >
Version: 1.9.0
</option>
<option value="/v1_8_0" selected="selected" >
Version: 1.8.0
</option>
<option value="/v1_7_0" >
Version: 1.7.0
</option>
<option value="/v1_6_0" >
Version: 1.6.0
</option>
<option value="/v1_5_0" >
Version: 1.5.0
</option>
<option value="/v1_4_0" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" >
Version: 0.9.0
</option>
</select>
<div class="region region-sidebar">
<div class="docs-menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../get_started/index.html">Setup &amp; Get Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../concepts.html">Concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../tutorials/tutorials.html">Tutorials</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../external_links.html">Third-party Resources</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../os_user_guide.html">OS User Guide</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../core_os/mynewt_os.html">Kernel</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../system_modules.html">System</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../config/config.html">Config</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">Logs</a></li>
<li class="toctree-l3"><a class="reference internal" href="../stats/stats.html">Statistics</a></li>
<li class="toctree-l3"><a class="reference internal" href="../console/console.html">Console</a></li>
<li class="toctree-l3"><a class="reference internal" href="../shell/shell.html">Shell</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../hal/hal.html">Hardware Abstraction</a></li>
<li class="toctree-l2"><a class="reference internal" href="../bootloader/bootloader.html">Secure Bootloader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../split/split.html">Split Images</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../core_os/porting/port_os.html">Porting Guide</a></li>
<li class="toctree-l2"><a class="reference internal" href="../baselibc.html">Baselibc</a></li>
<li class="toctree-l2"><a class="reference internal" href="../drivers/driver.html">Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../devmgmt/newtmgr.html">Device Management with Newt Manager</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mcumgr/mcumgr.html">Device Management with MCUmgr</a></li>
<li class="toctree-l2"><a class="reference internal" href="../imgmgr/imgmgr.html">Image Manager</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sysinitconfig/sysinitconfig.html">Compile-Time Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../fs/fs.html">File System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../fcb/fcb.html">Flash Circular Buffer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sensor_framework/sensor_framework.html">Sensor Framework</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testutil/testutil.html">Test Utilities</a></li>
<li class="toctree-l2"><a class="reference internal" href="../json/json.html">JSON</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mfg/mfg.html">Manufacturing support</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../network/index.html">BLE User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../newt/index.html">Newt Tool Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../newtmgr/index.html">Newt Manager Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../mynewt_faq/index.html">Mynewt FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../misc/index.html">Appendix</a></li>
</ul>
</div>
</div>
</div>
<!-- ENDS STICKY CONTAINER -->
</div>
<!-- ENDS .container-sidebar -->
<div class="col-xs-12 col-sm-9">
<div class="alert alert-warning">
<p>
Version 1.8.0 is not the most recent version of the
Apache Mynewt documentation. Click <a href="/latest">here</a> to
read the latest version.
</p>
</div>
<div class="">
<div class="rst-content">
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="logging">
<h1>Logging<a class="headerlink" href="#logging" title="Permalink to this headline"></a></h1>
<p>Mynewt log package supports logging of information within a Mynewt
application. It allows packages to define their own log streams with
separate names. It also allows an application to control the output
destination of logs.</p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><p><a class="reference internal" href="#description" id="id1">Description</a></p></li>
<li><p><a class="reference internal" href="#syscfg-settings" id="id2">Syscfg Settings</a></p>
<ul>
<li><p><a class="reference internal" href="#log" id="id3">Log</a></p></li>
<li><p><a class="reference internal" href="#log-handler" id="id4">Log Handler</a></p></li>
<li><p><a class="reference internal" href="#configuring-logging-for-packages-that-an-application-uses" id="id5">Configuring Logging for Packages that an Application Uses</a></p></li>
<li><p><a class="reference internal" href="#implementing-a-package-that-uses-logging" id="id6">Implementing a Package that Uses Logging</a></p></li>
<li><p><a class="reference internal" href="#log-api-and-log-levels" id="id7">Log API and Log Levels</a></p></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="description">
<h2><a class="toc-backref" href="#id1">Description</a><a class="headerlink" href="#description" title="Permalink to this headline"></a></h2>
<p>In the Mynewt OS, the log package comes in two versions:</p>
<ul class="simple">
<li><p>The <code class="docutils literal notranslate"><span class="pre">sys/log/full</span></code> package implements the complete log
functionality and API.</p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">sys/log/stub</span></code> package implements stubs for the API.</p></li>
</ul>
<p>Both packages export the <code class="docutils literal notranslate"><span class="pre">log</span></code> API, and any package that uses the log
API must list <code class="docutils literal notranslate"><span class="pre">log</span></code> as a requirement in its <code class="docutils literal notranslate"><span class="pre">pkg.yml</span></code> file as
follows:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">pkg.req_apis:</span>
<span class="go"> - log</span>
</pre></div>
</div>
<p>The application’s <code class="docutils literal notranslate"><span class="pre">pkg.yml</span></code> file specifies the version of the log
package to use. A project that requires the full logging capability must
list the <code class="docutils literal notranslate"><span class="pre">sys/log/full</span></code> package as a dependency in its <code class="docutils literal notranslate"><span class="pre">pkg.yml</span></code>
file:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">pkg.deps:</span>
<span class="go"> - &quot;@apache-mynewt-core/sys/log/full&quot;</span>
</pre></div>
</div>
<p>You can use the <code class="docutils literal notranslate"><span class="pre">sys/log/stub</span></code> package if you want to build your
application without logging to reduce code size.</p>
</div>
<div class="section" id="syscfg-settings">
<h2><a class="toc-backref" href="#id2">Syscfg Settings</a><a class="headerlink" href="#syscfg-settings" title="Permalink to this headline"></a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL</span></code> syscfg setting allows you to specify the level of logs
to enable in your application. Only logs for levels higher or equal to
the value of <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL</span></code> are enabled. The amount of logs you include
affects your application code size. <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL:</span> <span class="pre">0</span></code> specifies
LOG_LEVEL_DEBUG and includes all logs. You set <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL:</span> <span class="pre">255</span></code> to
disable all logging. The <code class="docutils literal notranslate"><span class="pre">#defines</span></code> for the log levels are specified
in the <code class="docutils literal notranslate"><span class="pre">sys/log/full/include/log/log.h</span></code> file. For example the
following setting corresponds to LOG_LEVEL_ERROR:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">syscfg.vals:</span>
<span class="go"> LOG_LEVEL: 3</span>
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL</span></code> setting applies to all modules registered with the log
package.</p>
<div class="section" id="log">
<h3><a class="toc-backref" href="#id3">Log</a><a class="headerlink" href="#log" title="Permalink to this headline"></a></h3>
<p>Each log stream requires a <code class="docutils literal notranslate"><span class="pre">log</span></code> structure to define its logging
properties.</p>
</div>
<div class="section" id="log-handler">
<h3><a class="toc-backref" href="#id4">Log Handler</a><a class="headerlink" href="#log-handler" title="Permalink to this headline"></a></h3>
<p>To use logs, a log handler that handles the I/O from the log is
required. The log package comes with three pre-built log handlers:</p>
<ul class="simple">
<li><p>console – streams log events directly to the console port. Does not
support walking and reading.</p></li>
<li><p>cbmem – writes/reads log events to a circular buffer. Supports
walking and reading for access by newtmgr and shell commands.</p></li>
<li><p>fcb – writes/reads log events to a <span class="xref std std-doc">flash circular
buffer</span>. Supports walking and reading for
access by newtmgr and shell commands.</p></li>
</ul>
<p>In addition, it is possible to create custom log handlers for other
methods. Examples may include</p>
<ul class="simple">
<li><p>Flash file system</p></li>
<li><p>Flat flash buffer</p></li>
<li><p>Streamed over some other interface</p></li>
</ul>
<p>To use logging, you typically do not need to create your own log
handler. You can use one of the pre-built ones.</p>
<p>A package or an application must define a variable of type
<code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">log</span></code> and register a log handler for it with the log package.
It must call the <code class="docutils literal notranslate"><span class="pre">log_register()</span></code> function to specify the log handler
to use:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">log_register</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">log</span><span class="w"> </span><span class="o">*</span><span class="n">log</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">log_handler</span><span class="w"> </span><span class="o">*</span><span class="n">lh</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">arg</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">level</span><span class="p">)</span>
</pre></div>
</div>
<p>The parameters are:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>- Name of the log stream.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code> - Log instance to register,</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">lh</span></code> - Pointer to the log handler. You can specify one of the
pre-built ones:</p>
<ul>
<li><p><code class="docutils literal notranslate"><span class="pre">&amp;log_console_handler</span></code> for console</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">&amp;log_cbm_handler</span></code> for circular buffer</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">&amp;log_fcb_handler</span></code> for flash circular buffer</p></li>
</ul>
</li>
<li><p><code class="docutils literal notranslate"><span class="pre">arg</span></code> - Opaque argument that the specified log handler uses. The
value of this argument depends on the log handler you specify:</p>
<ul>
<li><p>NULL for the <code class="docutils literal notranslate"><span class="pre">log_console_handler</span></code>.</p></li>
<li><p>Pointer to an initialized <code class="docutils literal notranslate"><span class="pre">cbmem</span></code> structure (see <code class="docutils literal notranslate"><span class="pre">util/cbmem</span></code>
package) for the <code class="docutils literal notranslate"><span class="pre">log_cbm_handler</span></code>.</p></li>
<li><p>Pointer to an initialized <code class="docutils literal notranslate"><span class="pre">fcb_log</span></code> structure (see <code class="docutils literal notranslate"><span class="pre">fs/fcb</span></code>
package) for the <code class="docutils literal notranslate"><span class="pre">log_fcb_handler</span></code>.</p></li>
</ul>
</li>
</ul>
<p>Typically, a package that uses logging defines a global variable, such
as <code class="docutils literal notranslate"><span class="pre">my_package_log</span></code>, of type <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">log</span></code>. The package can call the
<code class="docutils literal notranslate"><span class="pre">log_register()</span></code> function with default values, but usually an
application will override the logging properties and where to log to.
There are two ways a package can allow an application to override the
values:</p>
<ul class="simple">
<li><p>Define system configuration settings that an application can set and
the package can then call the <code class="docutils literal notranslate"><span class="pre">log_register()</span></code> function with the
configuration values.</p></li>
<li><p>Make the <code class="docutils literal notranslate"><span class="pre">my_package_log</span></code> variable external and let the application
call the <code class="docutils literal notranslate"><span class="pre">log_register()</span></code> function to specify a log handler for its
specific purpose.</p></li>
</ul>
</div>
<div class="section" id="configuring-logging-for-packages-that-an-application-uses">
<h3><a class="toc-backref" href="#id5">Configuring Logging for Packages that an Application Uses</a><a class="headerlink" href="#configuring-logging-for-packages-that-an-application-uses" title="Permalink to this headline"></a></h3>
<p>Here is an example of how an application can set the log handlers for
the logs of the packages that the application includes.</p>
<p>In this example, the <code class="docutils literal notranslate"><span class="pre">package1</span></code> package defines the variable
<code class="docutils literal notranslate"><span class="pre">package1_log</span></code> of type <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">log</span></code> and externs the variable.
Similarly, the <code class="docutils literal notranslate"><span class="pre">package2</span></code> package defines the variable
<code class="docutils literal notranslate"><span class="pre">package2_log</span></code> and externs the variable. The application sets logs for
<code class="docutils literal notranslate"><span class="pre">package1</span></code> to use console and sets logs for <code class="docutils literal notranslate"><span class="pre">package2</span></code> to use a
circular buffer.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;package1/package1.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;package2/package2.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;util/cbmem.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;log/log.h&gt;</span>
<span class="k">static</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">cbmem_buf</span><span class="p">[</span><span class="n">MAX_CBMEM_BUF</span><span class="p">];</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">cbmem</span><span class="w"> </span><span class="n">cbmem</span><span class="p">;</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">app_log_init</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">log_register</span><span class="p">(</span><span class="s">&quot;package1_log&quot;</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">package1_log</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">log_console_handler</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">LOG_SYSLEVEL</span><span class="p">);</span>
<span class="w"> </span><span class="n">cbmem_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">cbmem</span><span class="p">,</span><span class="w"> </span><span class="n">cbmem_buf</span><span class="p">,</span><span class="w"> </span><span class="n">MAX_CBMEM_BUF</span><span class="p">);</span>
<span class="w"> </span><span class="n">log_register</span><span class="p">(</span><span class="s">&quot;package2_log&quot;</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">package2_log</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">log_cbmem_handler</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">cbmem</span><span class="p">,</span><span class="w"> </span><span class="n">LOG_SYSLEVEL</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="implementing-a-package-that-uses-logging">
<h3><a class="toc-backref" href="#id6">Implementing a Package that Uses Logging</a><a class="headerlink" href="#implementing-a-package-that-uses-logging" title="Permalink to this headline"></a></h3>
<p>This example shows how a package logs to console. The package registers
default logging properties to use the console, but allows an application
to override the values. It defines the <code class="docutils literal notranslate"><span class="pre">my_package_log</span></code> variable and
makes it external so an application can override log handler.</p>
<p>Make the <code class="docutils literal notranslate"><span class="pre">my_package_log</span></code> variable external:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* my_package.h*/</span>
<span class="cm">/* pick a unique name here */</span>
<span class="k">extern</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">log</span><span class="w"> </span><span class="n">my_package_log</span><span class="p">;</span>
</pre></div>
</div>
<p>Define the <code class="docutils literal notranslate"><span class="pre">my_package_log</span></code> variable and register the console log
handler:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cm">/* my_package.c */</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">log</span><span class="w"> </span><span class="n">my_package_log</span><span class="p">;</span>
<span class="p">{</span>
<span class="w"> </span><span class="p">...</span>
<span class="w"> </span><span class="cm">/* register my log with a name to the system */</span>
<span class="w"> </span><span class="n">log_register</span><span class="p">(</span><span class="s">&quot;log&quot;</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">my_package_log</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">log_console_handler</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">LOG_LEVEL_DEBUG</span><span class="p">);</span>
<span class="w"> </span><span class="n">LOG_DEBUG</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_package_log</span><span class="p">,</span><span class="w"> </span><span class="n">LOG_MODULE_DEFAULT</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;bla&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="n">LOG_DEBUG</span><span class="p">(</span><span class="o">&amp;</span><span class="n">my_package_log</span><span class="p">,</span><span class="w"> </span><span class="n">LOG_MODULE_DEFAULT</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;bab&quot;</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="log-api-and-log-levels">
<h3><a class="toc-backref" href="#id7">Log API and Log Levels</a><a class="headerlink" href="#log-api-and-log-levels" title="Permalink to this headline"></a></h3>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-defines">Defines</p>
<dl class="c macro">
<dt id="c.LOG_HDR_SIZE">
<span class="target" id="full_2include_2log_2log_8h_1a64e54b102062fef98cf8d92b7ad9e269"></span><code class="sig-name descname"><span class="pre">LOG_HDR_SIZE</span></code><a class="headerlink" href="#c.LOG_HDR_SIZE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_IMG_HASHLEN">
<span class="target" id="full_2include_2log_2log_8h_1aa026f236495a5ce10061de69c23ffa68"></span><code class="sig-name descname"><span class="pre">LOG_IMG_HASHLEN</span></code><a class="headerlink" href="#c.LOG_IMG_HASHLEN" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_FLAGS_IMG_HASH">
<span class="target" id="full_2include_2log_2log_8h_1a7d566de68cbe9708f9f805387be907e8"></span><code class="sig-name descname"><span class="pre">LOG_FLAGS_IMG_HASH</span></code><a class="headerlink" href="#c.LOG_FLAGS_IMG_HASH" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_BASE_ENTRY_HDR_SIZE">
<span class="target" id="full_2include_2log_2log_8h_1a3c08d94f08ae379f442f79f5f55c6856"></span><code class="sig-name descname"><span class="pre">LOG_BASE_ENTRY_HDR_SIZE</span></code><a class="headerlink" href="#c.LOG_BASE_ENTRY_HDR_SIZE" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_MODULE_STR">
<span class="target" id="full_2include_2log_2log_8h_1aea345a9b707b66dec9fe387d1691941b"></span><code class="sig-name descname"><span class="pre">LOG_MODULE_STR</span></code><span class="sig-paren">(</span><em><span class="pre">module</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.LOG_MODULE_STR" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_DEBUG">
<span class="target" id="full_2include_2log_2log_8h_1ad9197501ccd575fd396cd9f0c54e9910"></span><code class="sig-name descname"><span class="pre">LOG_DEBUG</span></code><span class="sig-paren">(</span><em><span class="pre">__l</span></em>, <em><span class="pre">__mod</span></em>, <span class="pre">...</span><span class="sig-paren">)</span><a class="headerlink" href="#c.LOG_DEBUG" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_INFO">
<span class="target" id="full_2include_2log_2log_8h_1a62a897df1da34bca1af27a1ba7e2bf58"></span><code class="sig-name descname"><span class="pre">LOG_INFO</span></code><span class="sig-paren">(</span><em><span class="pre">__l</span></em>, <em><span class="pre">__mod</span></em>, <span class="pre">...</span><span class="sig-paren">)</span><a class="headerlink" href="#c.LOG_INFO" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_WARN">
<span class="target" id="full_2include_2log_2log_8h_1ac245ad207095c74c20e4e66d5aff0ac3"></span><code class="sig-name descname"><span class="pre">LOG_WARN</span></code><span class="sig-paren">(</span><em><span class="pre">__l</span></em>, <em><span class="pre">__mod</span></em>, <span class="pre">...</span><span class="sig-paren">)</span><a class="headerlink" href="#c.LOG_WARN" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_ERROR">
<span class="target" id="full_2include_2log_2log_8h_1a4585cc32d0af89be2ee4b50a3f097dcf"></span><code class="sig-name descname"><span class="pre">LOG_ERROR</span></code><span class="sig-paren">(</span><em><span class="pre">__l</span></em>, <em><span class="pre">__mod</span></em>, <span class="pre">...</span><span class="sig-paren">)</span><a class="headerlink" href="#c.LOG_ERROR" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_CRITICAL">
<span class="target" id="full_2include_2log_2log_8h_1a511c7df90f30e5e8e104ed336d61084d"></span><code class="sig-name descname"><span class="pre">LOG_CRITICAL</span></code><span class="sig-paren">(</span><em><span class="pre">__l</span></em>, <em><span class="pre">__mod</span></em>, <span class="pre">...</span><span class="sig-paren">)</span><a class="headerlink" href="#c.LOG_CRITICAL" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_STATS_INC">
<span class="target" id="full_2include_2log_2log_8h_1a02b2a70cb67cea8b858207c062a32e4b"></span><code class="sig-name descname"><span class="pre">LOG_STATS_INC</span></code><span class="sig-paren">(</span><em><span class="pre">log</span></em>, <em><span class="pre">name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.LOG_STATS_INC" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c macro">
<dt id="c.LOG_STATS_INCN">
<span class="target" id="full_2include_2log_2log_8h_1a64ee73ba4b34cbd0f5c7d09fc7ed090c"></span><code class="sig-name descname"><span class="pre">LOG_STATS_INCN</span></code><span class="sig-paren">(</span><em><span class="pre">log</span></em>, <em><span class="pre">name</span></em>, <em><span class="pre">cnt</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.LOG_STATS_INCN" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-typedefs">Typedefs</p>
<dl class="c type">
<dt id="c.log_walk_func_t">
<span class="target" id="full_2include_2log_2log_8h_1a47aca07e75e6c773101eb618ce4a0eb3"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">log_walk_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_offset" title="log_offset"><span class="pre">log_offset</span></a> <span class="pre">*</span><span class="pre">log_offset</span>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><span class="pre">dptr</span>, <span class="pre">uint16_t</span> <span class="pre">len</span><span class="sig-paren">)</span><a class="headerlink" href="#c.log_walk_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.log_walk_body_func_t">
<span class="target" id="full_2include_2log_2log_8h_1ab3b1fb102c7f0e5d0366817f9f9a9c78"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">log_walk_body_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a> <span class="pre">*</span><span class="pre">log</span>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_offset" title="log_offset"><span class="pre">log_offset</span></a> <span class="pre">*</span><span class="pre">log_offset</span>, <em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <span class="pre">log_entry_hdr</span> <span class="pre">*</span><span class="pre">hdr</span>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><span class="pre">dptr</span>, <span class="pre">uint16_t</span> <span class="pre">len</span><span class="sig-paren">)</span><a class="headerlink" href="#c.log_walk_body_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_read_func_t">
<span class="target" id="full_2include_2log_2log_8h_1ac2e3fdc392da9e201c90fd468dd337f3"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_read_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><span class="pre">dptr</span>, <span class="pre">void</span> <span class="pre">*</span><span class="pre">buf</span>, <span class="pre">uint16_t</span> <span class="pre">offset</span>, <span class="pre">uint16_t</span> <span class="pre">len</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_read_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_read_mbuf_func_t">
<span class="target" id="full_2include_2log_2log_8h_1a5a4b5017bce3030b72ea7a004174cfcd"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_read_mbuf_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><span class="pre">dptr</span>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><span class="pre">om</span>, <span class="pre">uint16_t</span> <span class="pre">offset</span>, <span class="pre">uint16_t</span> <span class="pre">len</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_read_mbuf_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_append_func_t">
<span class="target" id="full_2include_2log_2log_8h_1a19ee35f77c0d909b360a7704b672f9d1"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_append_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span>, <span class="pre">void</span> <span class="pre">*</span><span class="pre">buf</span>, <span class="pre">int</span> <span class="pre">len</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_append_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_append_body_func_t">
<span class="target" id="full_2include_2log_2log_8h_1afe5365560529ad1532fddc605eb49f6e"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_append_body_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a> <span class="pre">*</span><span class="pre">log</span>, <em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <span class="pre">log_entry_hdr</span> <span class="pre">*</span><span class="pre">hdr</span>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><span class="pre">body</span>, <span class="pre">int</span> <span class="pre">body_len</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_append_body_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_append_mbuf_func_t">
<span class="target" id="full_2include_2log_2log_8h_1a8f68677678144da0641491a8179c7460"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_append_mbuf_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><span class="pre">om</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_append_mbuf_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_append_mbuf_body_func_t">
<span class="target" id="full_2include_2log_2log_8h_1a244f6d8e430e8dd455a13cc93b684192"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_append_mbuf_body_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a> <span class="pre">*</span><span class="pre">log</span>, <em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <span class="pre">log_entry_hdr</span> <span class="pre">*</span><span class="pre">hdr</span>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><span class="pre">om</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_append_mbuf_body_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_walk_func_t">
<span class="target" id="full_2include_2log_2log_8h_1a26ea94f956c083f449619bcaea428eaa"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_walk_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span>, <a class="reference internal" href="#c.log_walk_func_t" title="log_walk_func_t"><span class="pre">log_walk_func_t</span></a> <span class="pre">walk_func</span>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_offset" title="log_offset"><span class="pre">log_offset</span></a> <span class="pre">*</span><span class="pre">log_offset</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_walk_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_flush_func_t">
<span class="target" id="full_2include_2log_2log_8h_1aa56cbe1332f7ea07753f928f094310e6"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_flush_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_flush_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_storage_info_func_t">
<span class="target" id="full_2include_2log_2log_8h_1a26ac2afebbe5b065c8048475991b671d"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_storage_info_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_storage_info" title="log_storage_info"><span class="pre">log_storage_info</span></a><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_storage_info_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_set_watermark_func_t">
<span class="target" id="full_2include_2log_2log_8h_1ab394d60b1d3ada996e26f187db8e10c9"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_set_watermark_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span>, <span class="pre">uint32_t</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_set_watermark_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c type">
<dt id="c.lh_registered_func_t">
<span class="target" id="full_2include_2log_2log_8h_1a0849c4cff323e8747e981672b0ae7142"></span><em class="property"><span class="pre">typedef</span> </em><span class="pre">int</span> <span class="pre">(</span><span class="pre">*</span><code class="sig-name descname"><span class="pre">lh_registered_func_t</span></code><span class="pre">)</span><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.lh_registered_func_t" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-functions">Functions</p>
<dl class="c function">
<dt id="c.log_init">
<span class="target" id="full_2include_2log_2log_8h_1a2508fad025e49f9746b6c178dce6917e"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">log_init</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.log_init" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_list_get_next">
<span class="target" id="full_2include_2log_2log_8h_1ae9320c228e4d555a4778c12dcfeb8bb2"></span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a> <span class="pre">*</span><code class="sig-name descname"><span class="pre">log_list_get_next</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a><span class="pre">*</span><span class="sig-paren">)</span><a class="headerlink" href="#c.log_list_get_next" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_module_register">
<span class="target" id="full_2include_2log_2log_8h_1a67f9a573fee1ceff149242ac1da19c6f"></span><span class="pre">uint8_t</span> <code class="sig-name descname"><span class="pre">log_module_register</span></code><span class="sig-paren">(</span><span class="pre">uint8_t</span> <em><span class="pre">id</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_module_register" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_module_get_name">
<span class="target" id="full_2include_2log_2log_8h_1a52cf7fd7192c68c1b91e7f84b1338dd1"></span><em class="property"><span class="pre">const</span></em> <span class="pre">char</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">log_module_get_name</span></code><span class="sig-paren">(</span><span class="pre">uint8_t</span> <em><span class="pre">id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_module_get_name" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_register">
<span class="target" id="full_2include_2log_2log_8h_1aed7fcd6a580a9f1fd21bf4d5f0ff1b93"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_register</span></code><span class="sig-paren">(</span><span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_register" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_handler" title="log_handler"><span class="pre">log_handler</span></a><span class="pre">*</span>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">arg</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_register" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_set_append_cb">
<span class="target" id="full_2include_2log_2log_8h_1a84222e15ae26580c93835da822192f69"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">log_set_append_cb</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_set_append_cb" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">log_append_cb</span> <span class="pre">*</span><em><span class="pre">cb</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_set_append_cb" title="Permalink to this definition"></a><br /></dt>
<dd><p>Configures the given log with the specified append callback. </p>
<p>A log’s append callback is executed each time an entry is appended to the log.</p>
<p><dl class="simple">
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to configure. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">cb</span></code>: The callback to associate with the log. </p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_find">
<span class="target" id="full_2include_2log_2log_8h_1af24693daf5b1ff0f13ea3a2f52ccad13"></span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a> <span class="pre">*</span><code class="sig-name descname"><span class="pre">log_find</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">const</span></em> <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_find" title="Permalink to this definition"></a><br /></dt>
<dd><p>Searches the list of registered logs for one with the specified name. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>The sought after log if found, NULL otherwise. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">name</span></code>: The name of the log to search for.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_append_typed">
<span class="target" id="full_2include_2log_2log_8h_1a98ea3294a192ada2b141ecafc30fc9c4"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append_typed</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append_typed" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">etype</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">data</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append_typed" title="Permalink to this definition"></a><br /></dt>
<dd><p>Writes the raw contents of a flat buffer to the specified log. </p>
<p>NOTE: The flat buffer must have an initial padding of length <code class="docutils literal notranslate"><span class="pre">LOG_HDR_SIZE</span></code>. This padding is <em>not</em> reflected in the specified length. So, to log the string “abc”, you should pass the following arguments to this function: <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>data: &lt;padding&gt;abc (total of `LOG_HDR_SIZE`+3 bytes.)
len: 3
</pre></div>
</div>
</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The log module of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the log entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">etype</span></code>: The type of data being written; one of the <code class="docutils literal notranslate"><span class="pre">LOG_ETYPE_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">data</span></code>: The flat buffer to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">len</span></code>: The number of bytes in the <em>message body</em>.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_append_mbuf_typed_no_free">
<span class="target" id="full_2include_2log_2log_8h_1adfb6594d3de83f4ab355d3590e3daf65"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append_mbuf_typed_no_free</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append_mbuf_typed_no_free" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">etype</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><span class="pre">*</span><em><span class="pre">om_ptr</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append_mbuf_typed_no_free" title="Permalink to this definition"></a><br /></dt>
<dd><p>Logs the contents of the provided mbuf, only freeing the mbuf on failure. </p>
<p>Logs the contents of the provided mbuf, only freeing the mbuf on failure. On success, the mbuf remains allocated, but its structure may have been modified by pullup operations. The updated mbuf address is passed back to the caller via a write to the supplied mbuf pointer-to-pointer.</p>
<p>NOTE: The mbuf must have an initial padding of length <code class="docutils literal notranslate"><span class="pre">LOG_HDR_SIZE</span></code>. So, to log the string “abc”, you should pass an mbuf with the following characteristics: <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>om_data: &lt;padding&gt;abc
om_len: `LOG_HDR_SIZE` + 3
</pre></div>
</div>
</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The module ID of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the entry to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">etype</span></code>: The type of data to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_ETYPE_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">om_ptr</span></code>: Indirectly points to the mbuf to write. This function updates the mbuf address if it changes.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_append_mbuf_typed">
<span class="target" id="full_2include_2log_2log_8h_1aa26f6262bf42387f253b57cc24f1a343"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append_mbuf_typed</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append_mbuf_typed" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">etype</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><em><span class="pre">om</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append_mbuf_typed" title="Permalink to this definition"></a><br /></dt>
<dd><p>Logs the contents of the provided mbuf. </p>
<p>Logs the contents of the provided mbuf. This function always frees the mbuf regardless of the outcome.</p>
<p>NOTE: The mbuf must have an initial padding of length <code class="docutils literal notranslate"><span class="pre">LOG_HDR_SIZE</span></code>. So, to log the string “abc”, you should pass an mbuf with the following characteristics: <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>om_data: &lt;padding&gt;abc
om_len: `LOG_HDR_SIZE` + 3
</pre></div>
</div>
</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The module ID of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the entry to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">etype</span></code>: The type of data to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_ETYPE_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">om</span></code>: The mbuf to write.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_append_body">
<span class="target" id="full_2include_2log_2log_8h_1add4c8f9c455a9f587cff9dd9a6ab8619"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append_body</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append_body" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">etype</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">body</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">body_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append_body" title="Permalink to this definition"></a><br /></dt>
<dd><p>Writes the contents of a flat buffer to the specified log. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The log module of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the log entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">etype</span></code>: The type of data being written; one of the <code class="docutils literal notranslate"><span class="pre">LOG_ETYPE_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">data</span></code>: The flat buffer to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">len</span></code>: The number of bytes in the message body.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_append_mbuf_body_no_free">
<span class="target" id="full_2include_2log_2log_8h_1a45890da99ae6c556b54d2e335ea6dfde"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append_mbuf_body_no_free</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append_mbuf_body_no_free" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">etype</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><em><span class="pre">om</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append_mbuf_body_no_free" title="Permalink to this definition"></a><br /></dt>
<dd><p>Logs the contents of the provided mbuf, only freeing the mbuf on failure. </p>
<p>Logs the contents of the provided mbuf, only freeing the mbuf on failure. On success, the mbuf remains allocated, but its structure may have been modified by pullup operations. The updated mbuf address is passed back to the caller via a write to the supplied mbuf pointer-to-pointer.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The module ID of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the entry to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">etype</span></code>: The type of data to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_ETYPE_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">om_ptr</span></code>: Indirectly points to the mbuf to write. This function updates the mbuf address if it changes.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_append_mbuf_body">
<span class="target" id="full_2include_2log_2log_8h_1a2272eb80f21c5f7ee4eb84d743030a95"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append_mbuf_body</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append_mbuf_body" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">etype</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><em><span class="pre">om</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append_mbuf_body" title="Permalink to this definition"></a><br /></dt>
<dd><p>Logs the contents of the provided mbuf. </p>
<p>Logs the contents of the provided mbuf. This function always frees the mbuf regardless of the outcome.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The module ID of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the entry to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">etype</span></code>: The type of data to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_ETYPE_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">om</span></code>: The mbuf to write.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_console_get">
<span class="target" id="full_2include_2log_2log_8h_1a57a222f756bcdf4bd52d2b6554ab06b1"></span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log" title="log"><span class="pre">log</span></a> <span class="pre">*</span><code class="sig-name descname"><span class="pre">log_console_get</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.log_console_get" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_console_init">
<span class="target" id="full_2include_2log_2log_8h_1a9d9b2b134e1b6ca4e55fcee6e005c199"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">log_console_init</span></code><span class="sig-paren">(</span><span class="pre">void</span><span class="sig-paren">)</span><a class="headerlink" href="#c.log_console_init" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_append">
<span class="target" id="full_2include_2log_2log_8h_1a10393bc5be19f2b3d125f819577e3971"></span><em class="property"><span class="pre">static</span></em> <em class="property"><span class="pre">inline</span></em> <span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">data</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append" title="Permalink to this definition"></a><br /></dt>
<dd><p>Writes the raw contents of a flat buffer to the specified log. </p>
<p>NOTE: The flat buffer must have an initial padding of length <code class="docutils literal notranslate"><span class="pre">LOG_HDR_SIZE</span></code>. This padding is <em>not</em> reflected in the specified length. So, to log the string “abc”, you should pass the following arguments to this function: <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>data: &lt;padding&gt;abc (total of `LOG_HDR_SIZE`+3 bytes.)
len: 3
</pre></div>
</div>
</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The log module of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the log entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">data</span></code>: The flat buffer to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">len</span></code>: The number of byte in the <em>message body</em>.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_append_mbuf_no_free">
<span class="target" id="full_2include_2log_2log_8h_1ab922a267c207a4b8fa4ef3af4e590e48"></span><em class="property"><span class="pre">static</span></em> <em class="property"><span class="pre">inline</span></em> <span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append_mbuf_no_free</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append_mbuf_no_free" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><span class="pre">*</span><em><span class="pre">om</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append_mbuf_no_free" title="Permalink to this definition"></a><br /></dt>
<dd><p>Logs the contents of the provided mbuf, only freeing the mbuf on failure. </p>
<p>Logs the contents of the provided mbuf, only freeing the mbuf on failure. On success, the mbuf remains allocated, but its structure may have been modified by pullup operations. The updated mbuf address is passed back to the caller via a write to the supplied mbuf pointer-to-pointer.</p>
<p>NOTE: The mbuf must have an initial padding of length <code class="docutils literal notranslate"><span class="pre">LOG_HDR_SIZE</span></code>. So, to log the string “abc”, you should pass an mbuf with the following characteristics: <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>om_data: &lt;padding&gt;abc
om_len: `LOG_HDR_SIZE` + 3
</pre></div>
</div>
</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The module ID of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the entry to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">om_ptr</span></code>: Indirectly points to the mbuf to write. This function updates the mbuf address if it changes.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_append_mbuf">
<span class="target" id="full_2include_2log_2log_8h_1ac6e318ca6cce6eff5ebbd6e83d06b077"></span><em class="property"><span class="pre">static</span></em> <em class="property"><span class="pre">inline</span></em> <span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_append_mbuf</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_append_mbuf" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><em><span class="pre">om</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_append_mbuf" title="Permalink to this definition"></a><br /></dt>
<dd><p>Logs the contents of the provided mbuf. </p>
<p>Logs the contents of the provided mbuf. This function always frees the mbuf regardless of the outcome.</p>
<p>NOTE: The mbuf must have an initial padding of length <code class="docutils literal notranslate"><span class="pre">LOG_HDR_SIZE</span></code>. So, to log the string “abc”, you should pass an mbuf with the following characteristics: <div class="highlight-none notranslate"><div class="highlight"><pre><span></span>om_data: &lt;padding&gt;abc
om_len: `LOG_HDR_SIZE` + 3
</pre></div>
</div>
</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to write to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The module ID of the entry to write. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The severity of the entry to write; one of the <code class="docutils literal notranslate"><span class="pre">LOG_LEVEL_[...]</span></code> constants. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">om</span></code>: The mbuf to write.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_printf">
<span class="target" id="full_2include_2log_2log_8h_1a13dfd7c147ad1fc5b03ee0e7c2c98000"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">log_printf</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_printf" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">char</span> <span class="pre">*</span><em><span class="pre">msg</span></em>, <span class="pre">...</span><span class="sig-paren">)</span><a class="headerlink" href="#c.log_printf" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_read">
<span class="target" id="full_2include_2log_2log_8h_1adbb5770f7cc0e1437fe9669d81885c99"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_read</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_read" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">dptr</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">buf</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">off</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_read" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_read_hdr">
<span class="target" id="full_2include_2log_2log_8h_1a0ee3b4ff49adb2d60b34761b3bc5af5a"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_read_hdr</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_read_hdr" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">dptr</span></em>, <em class="property"><span class="pre">struct</span></em> <span class="pre">log_entry_hdr</span> <span class="pre">*</span><em><span class="pre">hdr</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_read_hdr" title="Permalink to this definition"></a><br /></dt>
<dd><p>Reads a single log entry header. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success; nonzero on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to read from. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">dptr</span></code>: Medium-specific data describing the area to read from; typically obtained by a call to <code class="docutils literal notranslate"><span class="pre">log_walk</span></code>. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">hdr</span></code>: The destination header to read into.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_hdr_len">
<span class="target" id="full_2include_2log_2log_8h_1ae0ef93d582c73d150cbd13c7ff94ebf4"></span><span class="pre">uint16_t</span> <code class="sig-name descname"><span class="pre">log_hdr_len</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <span class="pre">log_entry_hdr</span> <span class="pre">*</span><em><span class="pre">hdr</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_hdr_len" title="Permalink to this definition"></a><br /></dt>
<dd><p>Reads the header length. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>Length of the header </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">hdr</span></code>: Ptr to the header</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_read_body">
<span class="target" id="full_2include_2log_2log_8h_1adec7397430b1eb1969d8af9811441ca9"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_read_body</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_read_body" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">dptr</span></em>, <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">buf</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">off</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_read_body" title="Permalink to this definition"></a><br /></dt>
<dd><p>Reads data from the body of a log entry into a flat buffer. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>The number of bytes actually read on success; -1 on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to read from. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">dptr</span></code>: Medium-specific data describing the area to read from; typically obtained by a call to <code class="docutils literal notranslate"><span class="pre">log_walk</span></code>. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">buf</span></code>: The destination buffer to read into. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">off</span></code>: The offset within the log entry at which to start the read. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">len</span></code>: The number of bytes to read.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_read_mbuf">
<span class="target" id="full_2include_2log_2log_8h_1a6a6fc9134aed07fe1f0ed1d71ee24676"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_read_mbuf</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_read_mbuf" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">dptr</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><em><span class="pre">om</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">off</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_read_mbuf" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_read_mbuf_body">
<span class="target" id="full_2include_2log_2log_8h_1a4905db57f12472ec66226801f44e4318"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_read_mbuf_body</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_read_mbuf_body" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <em class="property"><span class="pre">const</span></em> <span class="pre">void</span> <span class="pre">*</span><em><span class="pre">dptr</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="../../core_os/mbuf/mbuf.html#c.os_mbuf" title="os_mbuf"><span class="pre">os_mbuf</span></a> <span class="pre">*</span><em><span class="pre">om</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">off</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_read_mbuf_body" title="Permalink to this definition"></a><br /></dt>
<dd><p>Reads data from the body of a log entry into an mbuf. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>The number of bytes actually read on success; -1 on failure. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to read from. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">dptr</span></code>: Medium-specific data describing the area to read from; typically obtained by a call to <code class="docutils literal notranslate"><span class="pre">log_walk</span></code>. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">om</span></code>: The destination mbuf to read into. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">off</span></code>: The offset within the log entry at which to start the read. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">len</span></code>: The number of bytes to read.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_walk">
<span class="target" id="full_2include_2log_2log_8h_1a4f49fb75a702ea9b33d716fef212cd79"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_walk</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_walk" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <a class="reference internal" href="#c.log_walk_func_t" title="log_walk_func_t"><span class="pre">log_walk_func_t</span></a> <em><span class="pre">walk_func</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_walk" title="log_offset"><span class="pre">log_offset</span></a> <span class="pre">*</span><em><span class="pre">log_offset</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_walk" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_walk_body">
<span class="target" id="full_2include_2log_2log_8h_1a4339e8e8df0c2a5a36ed8e93b971cef1"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_walk_body</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_walk_body" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <a class="reference internal" href="#c.log_walk_body_func_t" title="log_walk_body_func_t"><span class="pre">log_walk_body_func_t</span></a> <em><span class="pre">walk_body_func</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_walk_body" title="log_offset"><span class="pre">log_offset</span></a> <span class="pre">*</span><em><span class="pre">log_offset</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_walk_body" title="Permalink to this definition"></a><br /></dt>
<dd><p>Applies a callback to each message in the specified log. </p>
<p>Similar to <code class="docutils literal notranslate"><span class="pre">log_walk</span></code>, except it passes the message header and body separately to the callback.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 if the walk completed successfully; nonzero on error or if the walk was aborted. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to iterate. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">walk_body_func</span></code>: The function to apply to each log entry. </p></li>
<li><p><code class="docutils literal notranslate"><a class="reference internal" href="#structlog__offset"><span class="std std-ref"><span class="pre">log_offset</span></span></a></code>: Specifies the range of entries to process. Entries not matching these criteria are skipped during the walk.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_flush">
<span class="target" id="full_2include_2log_2log_8h_1accfb1bc70fe3fa3abe408c712674ec30"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_flush</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_flush" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_flush" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c function">
<dt id="c.log_walk_body_section">
<span class="target" id="full_2include_2log_2log_8h_1a0fc8a8ae81e6546289f39245373c528c"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_walk_body_section</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_walk_body_section" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <a class="reference internal" href="#c.log_walk_body_func_t" title="log_walk_body_func_t"><span class="pre">log_walk_body_func_t</span></a> <em><span class="pre">walk_body_func</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_walk_body_section" title="log_offset"><span class="pre">log_offset</span></a> <span class="pre">*</span><em><span class="pre">log_offset</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_walk_body_section" title="Permalink to this definition"></a><br /></dt>
<dd><p>Walking a section of FCB. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 if the walk completed successfully; nonzero on error or if the walk was aborted. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to iterate. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">walk_body_func</span></code>: The function to apply to each log entry. </p></li>
<li><p><code class="docutils literal notranslate"><a class="reference internal" href="#structlog__offset"><span class="std std-ref"><span class="pre">log_offset</span></span></a></code>: Specifies the range of entries to process. Entries not matching these criteria are skipped during the walk.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_level_get">
<span class="target" id="full_2include_2log_2log_8h_1a6319f1de50eaf79073f38865116cd846"></span><span class="pre">uint8_t</span> <code class="sig-name descname"><span class="pre">log_level_get</span></code><span class="sig-paren">(</span><span class="pre">uint8_t</span> <em><span class="pre">module</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_level_get" title="Permalink to this definition"></a><br /></dt>
<dd><p>Retrieves the globally configured minimum log level for the specified module ID. </p>
<p>Writes with a level less than the module’s minimum level are discarded.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>The configured minimum level, or 0 (LOG_LEVEL_DEBUG) if unconfigured. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The module whose level should be retrieved.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_level_set">
<span class="target" id="full_2include_2log_2log_8h_1a61233ae0ab774efeb1919228a4f2b585"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_level_set</span></code><span class="sig-paren">(</span><span class="pre">uint8_t</span> <em><span class="pre">module</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_level_set" title="Permalink to this definition"></a><br /></dt>
<dd><p>Sets the globally configured minimum log level for the specified module ID. </p>
<p>Writes with a level less than the module’s minimum level are discarded.</p>
<p><dl class="simple">
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">module</span></code>: The module to configure. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: The minimum level to assign to the module (0-15, inclusive). </p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_set_level">
<span class="target" id="full_2include_2log_2log_8h_1a46fd9c9e1b0d143244a10427afa19332"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">log_set_level</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_set_level" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint8_t</span> <em><span class="pre">level</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_set_level" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set log level for a logger. </p>
<p><dl class="simple">
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to set level to. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: New log level </p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_get_level">
<span class="target" id="full_2include_2log_2log_8h_1a675385dfb0c085145bc9b8864d3b29b2"></span><span class="pre">uint8_t</span> <code class="sig-name descname"><span class="pre">log_get_level</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_get_level" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_get_level" title="Permalink to this definition"></a><br /></dt>
<dd><p>Get log level for a logger. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>current value of log level. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to set level to.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_set_max_entry_len">
<span class="target" id="full_2include_2log_2log_8h_1ac34ad74244785aa3bfafc38f69371394"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">log_set_max_entry_len</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_set_max_entry_len" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint16_t</span> <em><span class="pre">max_entry_len</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_set_max_entry_len" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set maximum length of an entry in the log. </p>
<p>If set to 0, no check will be made for maximum write length. Note that this is maximum log body length; the log entry header is not included in the check.</p>
<p><dl class="simple">
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: Log to set max entry length </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">level</span></code>: New max entry length </p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_storage_info">
<span class="target" id="full_2include_2log_2log_8h_1a1eecb86f5b2426e3941319bdb8e9a99d"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_storage_info</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_storage_info" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_storage_info" title="log_storage_info"><span class="pre">log_storage_info</span></a> <span class="pre">*</span><em><span class="pre">info</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_storage_info" title="Permalink to this definition"></a><br /></dt>
<dd><p>Return information about log storage. </p>
<p>This return information about size and usage of storage on top of which log instance is created.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, error code otherwise </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to query. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">info</span></code>: The destination to write information to.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_set_rotate_notify_cb">
<span class="target" id="full_2include_2log_2log_8h_1a49c1e83db281bca217622aa5e1d77c1b"></span><span class="pre">void</span> <code class="sig-name descname"><span class="pre">log_set_rotate_notify_cb</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_set_rotate_notify_cb" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">log_notify_rotate_cb</span> <span class="pre">*</span><em><span class="pre">cb</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_set_rotate_notify_cb" title="Permalink to this definition"></a><br /></dt>
<dd><p>Assign a callback function to be notified when the log is about to be rotated. </p>
<p><dl class="simple">
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">cb</span></code>: The callback function to be executed. </p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_set_watermark">
<span class="target" id="full_2include_2log_2log_8h_1a475fecb446d0e0d93d0acf5512da90c1"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_set_watermark</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_set_watermark" title="log"><span class="pre">log</span></a> <span class="pre">*</span><em><span class="pre">log</span></em>, <span class="pre">uint32_t</span> <em><span class="pre">index</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_set_watermark" title="Permalink to this definition"></a><br /></dt>
<dd><p>Set watermark on log. </p>
<p>This sets watermark on log item with given index. This information is used to calculate size of entries which were logged after watermark item, i.e. unread items. The watermark is stored persistently for each log.</p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, error code otherwise. </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">log</span></code>: The log to set watermark on. </p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">index</span></code>: The index of a watermarked item.</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
<dl class="c function">
<dt id="c.log_fill_current_img_hash">
<span class="target" id="full_2include_2log_2log_8h_1a9d80352c1c9377a106d02caebfb34efc"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_fill_current_img_hash</span></code><span class="sig-paren">(</span><em class="property"><span class="pre">struct</span></em> <span class="pre">log_entry_hdr</span> <span class="pre">*</span><em><span class="pre">hdr</span></em><span class="sig-paren">)</span><a class="headerlink" href="#c.log_fill_current_img_hash" title="Permalink to this definition"></a><br /></dt>
<dd><p>Fill log current image hash. </p>
<p><dl class="simple">
<dt><strong>Return</strong></dt><dd><p>0 on success, non-zero on failure </p>
</dd>
<dt><strong>Parameters</strong></dt><dd><ul class="breatheparameterlist simple">
<li><p><code class="docutils literal notranslate"><span class="pre">hdr</span></code>: Ptr to the header</p></li>
</ul>
</dd>
</dl>
</p>
</dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-variables">Variables</p>
<dl class="c var">
<dt id="c.log_console_handler">
<span class="target" id="full_2include_2log_2log_8h_1a881289dbd9a79c6225239e2b72cec4a8"></span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_handler" title="log_handler"><span class="pre">log_handler</span></a> <code class="sig-name descname"><span class="pre">log_console_handler</span></code><a class="headerlink" href="#c.log_console_handler" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_cbmem_handler">
<span class="target" id="full_2include_2log_2log_8h_1a649ef9595a9a890e38154e54bf243c71"></span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_handler" title="log_handler"><span class="pre">log_handler</span></a> <code class="sig-name descname"><span class="pre">log_cbmem_handler</span></code><a class="headerlink" href="#c.log_cbmem_handler" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_fcb_handler">
<span class="target" id="full_2include_2log_2log_8h_1ae85ac1f42826982b5f0198fd19fc6b46"></span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_handler" title="log_handler"><span class="pre">log_handler</span></a> <code class="sig-name descname"><span class="pre">log_fcb_handler</span></code><a class="headerlink" href="#c.log_fcb_handler" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
<dl class="c struct">
<dt id="c.log_offset">
<span class="target" id="structlog__offset"></span><em class="property"><span class="pre">struct</span> </em><code class="sig-name descname"><span class="pre">log_offset</span></code><a class="headerlink" href="#c.log_offset" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;log.h&gt;</em><p>Used for walks and reads; indicates part of log to access. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt id="c.log_offset.lo_ts">
<span class="target" id="structlog__offset_1abf717145b82aec45493449d150b39cf0"></span><span class="pre">int64_t</span> <code class="sig-name descname"><span class="pre">lo_ts</span></code><a class="headerlink" href="#c.log_offset.lo_ts" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_offset.lo_index">
<span class="target" id="structlog__offset_1a4c8cec5bf5b2ab35d0bce92e09dd5aa5"></span><span class="pre">uint32_t</span> <code class="sig-name descname"><span class="pre">lo_index</span></code><a class="headerlink" href="#c.log_offset.lo_index" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_offset.lo_data_len">
<span class="target" id="structlog__offset_1a158a12500f1125b1e7575fa9856d9894"></span><span class="pre">uint32_t</span> <code class="sig-name descname"><span class="pre">lo_data_len</span></code><a class="headerlink" href="#c.log_offset.lo_data_len" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_offset.lo_arg">
<span class="target" id="structlog__offset_1aba3119779984fc002c80bbbe797ba90f"></span><span class="pre">void</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">lo_arg</span></code><a class="headerlink" href="#c.log_offset.lo_arg" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
</dd></dl>
<dl class="c struct">
<dt>
<span class="target" id="structlog__storage__info"></span><em class="property"><span class="pre">struct</span> </em><code class="sig-name descname"><span class="pre">log_storage_info</span></code><br /></dt>
<dd><em>#include &lt;log.h&gt;</em><p>Log storage information. </p>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt id="c.log_storage_info.size">
<span class="target" id="structlog__storage__info_1a087d5d8877514ec2e890afbca40ba856"></span><span class="pre">uint32_t</span> <code class="sig-name descname"><span class="pre">size</span></code><a class="headerlink" href="#c.log_storage_info.size" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_storage_info.used">
<span class="target" id="structlog__storage__info_1a3669711e5ba1493660521b060a4b963b"></span><span class="pre">uint32_t</span> <code class="sig-name descname"><span class="pre">used</span></code><a class="headerlink" href="#c.log_storage_info.used" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_storage_info.used_unread">
<span class="target" id="structlog__storage__info_1af2c854c7f21ac43b03af1f97f02b9993"></span><span class="pre">uint32_t</span> <code class="sig-name descname"><span class="pre">used_unread</span></code><a class="headerlink" href="#c.log_storage_info.used_unread" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
</dd></dl>
<dl class="c struct">
<dt id="c.log_handler">
<span class="target" id="structlog__handler"></span><em class="property"><span class="pre">struct</span> </em><code class="sig-name descname"><span class="pre">log_handler</span></code><a class="headerlink" href="#c.log_handler" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;log.h&gt;</em><div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt id="c.log_handler.log_type">
<span class="target" id="structlog__handler_1ad65f3c291144c9563af323a410aa6a6d"></span><span class="pre">int</span> <code class="sig-name descname"><span class="pre">log_type</span></code><a class="headerlink" href="#c.log_handler.log_type" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_read">
<span class="target" id="structlog__handler_1ae6b70c2bf453741b0fe1d41d2e866112"></span><a class="reference internal" href="#c.lh_read_func_t" title="lh_read_func_t"><span class="pre">lh_read_func_t</span></a> <code class="sig-name descname"><span class="pre">log_read</span></code><a class="headerlink" href="#c.log_handler.log_read" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_read_mbuf">
<span class="target" id="structlog__handler_1aa2f5adc40b8c4203dcec0990780b915c"></span><a class="reference internal" href="#c.lh_read_mbuf_func_t" title="lh_read_mbuf_func_t"><span class="pre">lh_read_mbuf_func_t</span></a> <code class="sig-name descname"><span class="pre">log_read_mbuf</span></code><a class="headerlink" href="#c.log_handler.log_read_mbuf" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_append">
<span class="target" id="structlog__handler_1a662b191acd442da61df5ddd97c252229"></span><a class="reference internal" href="#c.lh_append_func_t" title="lh_append_func_t"><span class="pre">lh_append_func_t</span></a> <code class="sig-name descname"><span class="pre">log_append</span></code><a class="headerlink" href="#c.log_handler.log_append" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_append_body">
<span class="target" id="structlog__handler_1a56c2abd3d5be4e8b08f55268a443eca1"></span><a class="reference internal" href="#c.lh_append_body_func_t" title="lh_append_body_func_t"><span class="pre">lh_append_body_func_t</span></a> <code class="sig-name descname"><span class="pre">log_append_body</span></code><a class="headerlink" href="#c.log_handler.log_append_body" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_append_mbuf">
<span class="target" id="structlog__handler_1a0a9057b12824b959f6aabaf432f85d0a"></span><a class="reference internal" href="#c.lh_append_mbuf_func_t" title="lh_append_mbuf_func_t"><span class="pre">lh_append_mbuf_func_t</span></a> <code class="sig-name descname"><span class="pre">log_append_mbuf</span></code><a class="headerlink" href="#c.log_handler.log_append_mbuf" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_append_mbuf_body">
<span class="target" id="structlog__handler_1ab665988efee4cda3288a76b3030955e1"></span><a class="reference internal" href="#c.lh_append_mbuf_body_func_t" title="lh_append_mbuf_body_func_t"><span class="pre">lh_append_mbuf_body_func_t</span></a> <code class="sig-name descname"><span class="pre">log_append_mbuf_body</span></code><a class="headerlink" href="#c.log_handler.log_append_mbuf_body" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_walk">
<span class="target" id="structlog__handler_1afaa4f87e34e4ebca54b8fc4f5ec9ca95"></span><a class="reference internal" href="#c.lh_walk_func_t" title="lh_walk_func_t"><span class="pre">lh_walk_func_t</span></a> <code class="sig-name descname"><span class="pre">log_walk</span></code><a class="headerlink" href="#c.log_handler.log_walk" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_walk_sector">
<span class="target" id="structlog__handler_1a64c2f4210632203b3041c973f1ed7dc1"></span><a class="reference internal" href="#c.lh_walk_func_t" title="lh_walk_func_t"><span class="pre">lh_walk_func_t</span></a> <code class="sig-name descname"><span class="pre">log_walk_sector</span></code><a class="headerlink" href="#c.log_handler.log_walk_sector" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_flush">
<span class="target" id="structlog__handler_1a9088643ee5fa07573e9636b6f920085a"></span><a class="reference internal" href="#c.lh_flush_func_t" title="lh_flush_func_t"><span class="pre">lh_flush_func_t</span></a> <code class="sig-name descname"><span class="pre">log_flush</span></code><a class="headerlink" href="#c.log_handler.log_flush" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_storage_info">
<span class="target" id="structlog__handler_1a6eacea99532cc31ceb761ad079232e2d"></span><a class="reference internal" href="#c.lh_storage_info_func_t" title="lh_storage_info_func_t"><span class="pre">lh_storage_info_func_t</span></a> <code class="sig-name descname"><span class="pre">log_storage_info</span></code><a class="headerlink" href="#c.log_handler.log_storage_info" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_set_watermark">
<span class="target" id="structlog__handler_1a0a13093d3dc457c4fb19021018bc5bc9"></span><a class="reference internal" href="#c.lh_set_watermark_func_t" title="lh_set_watermark_func_t"><span class="pre">lh_set_watermark_func_t</span></a> <code class="sig-name descname"><span class="pre">log_set_watermark</span></code><a class="headerlink" href="#c.log_handler.log_set_watermark" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log_handler.log_registered">
<span class="target" id="structlog__handler_1a1e9bff519eaea7728d99be4d62b5da69"></span><a class="reference internal" href="#c.lh_registered_func_t" title="lh_registered_func_t"><span class="pre">lh_registered_func_t</span></a> <code class="sig-name descname"><span class="pre">log_registered</span></code><a class="headerlink" href="#c.log_handler.log_registered" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
</dd></dl>
<dl class="c struct">
<dt id="c.log">
<span class="target" id="structlog"></span><em class="property"><span class="pre">struct</span> </em><code class="sig-name descname"><span class="pre">log</span></code><a class="headerlink" href="#c.log" title="Permalink to this definition"></a><br /></dt>
<dd><em>#include &lt;log.h&gt;</em><div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-functions">Public Functions</p>
<dl class="c function">
<dt>
<span class="target" id="structlog_1a6d07240ed4fa7ac4a0076a255dc61ff5"></span><code class="sig-name descname"><span class="pre">STAILQ_ENTRY</span> <span class="pre">(log)</span> <span class="pre">l_next</span></code></dt>
<dd></dd></dl>
<dl class="c function">
<dt>
<span class="target" id="structlog_1ae9c86a7ac0fc774b4fa55ac88860dcc3"></span><code class="sig-name descname"><span class="pre">STATS_SECT_DECL</span> <span class="pre">(logs)</span> <span class="pre">l_stats</span></code></dt>
<dd></dd></dl>
</div>
<div class="breathe-sectiondef docutils container">
<p class="breathe-sectiondef-title rubric" id="breathe-section-title-public-members">Public Members</p>
<dl class="c var">
<dt id="c.log.l_name">
<span class="target" id="structlog_1a51e12071c1c1b1e792701a60f5bc0299"></span><span class="pre">char</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">l_name</span></code><a class="headerlink" href="#c.log.l_name" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log.l_log">
<span class="target" id="structlog_1ac65e462e8879b0aa7afacdc652bb1836"></span><em class="property"><span class="pre">const</span></em> <em class="property"><span class="pre">struct</span></em> <a class="reference internal" href="#c.log_handler" title="log_handler"><span class="pre">log_handler</span></a> <span class="pre">*</span><code class="sig-name descname"><span class="pre">l_log</span></code><a class="headerlink" href="#c.log.l_log" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log.l_arg">
<span class="target" id="structlog_1a789d9412642d0df93d82cb935ff0e9b1"></span><span class="pre">void</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">l_arg</span></code><a class="headerlink" href="#c.log.l_arg" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log.l_append_cb">
<span class="target" id="structlog_1ad0397d159f6f86544c204bb1c94c3285"></span><span class="pre">log_append_cb</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">l_append_cb</span></code><a class="headerlink" href="#c.log.l_append_cb" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log.l_rotate_notify_cb">
<span class="target" id="structlog_1a7787dd69ab773852d39511ca2342408f"></span><span class="pre">log_notify_rotate_cb</span> <span class="pre">*</span><code class="sig-name descname"><span class="pre">l_rotate_notify_cb</span></code><a class="headerlink" href="#c.log.l_rotate_notify_cb" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log.l_level">
<span class="target" id="structlog_1a79e2701bcf76fccfcf8df56835d8cd2b"></span><span class="pre">uint8_t</span> <code class="sig-name descname"><span class="pre">l_level</span></code><a class="headerlink" href="#c.log.l_level" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
<dl class="c var">
<dt id="c.log.l_max_entry_len">
<span class="target" id="structlog_1a5d876762b298414178a6b0211952900c"></span><span class="pre">uint16_t</span> <code class="sig-name descname"><span class="pre">l_max_entry_len</span></code><a class="headerlink" href="#c.log.l_max_entry_len" title="Permalink to this definition"></a><br /></dt>
<dd></dd></dl>
</div>
</dd></dl>
</div>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="../stats/stats.html" class="btn btn-neutral float-right" title="Statistics Module" accesskey="n">Next: Statistics Module <span class="fa fa-arrow-circle-right"></span></a>
<a href="../config/config.html" class="btn btn-neutral" title="Config" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: Config</a>
</div>
</div>
</div>
</div>
<!-- ENDS CONTENT SECTION -->
</div>
<!-- ENDS .content -->
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<img src="../../../_static/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt project logo are either
registered trademarks or trademarks of the Apache Software Foundation in the United States and other countries.
</small>
<a href="">
<img src="../../../_static/img/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
</div>
</div>
</footer>
</div>
<!-- ENDS #wrapper -->
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../../',
VERSION:'latest',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
LINK_SUFFIX: '.html'
};
</script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/js/bootstrap-3.0.3.min.js"></script>
<script type="text/javascript" src="../../../_static/js/affix.js"></script>
<script type="text/javascript" src="../../../_static/js/main.js"></script>
</body>
</html>