Commit 8c538fba authored by Gabi Melman's avatar Gabi Melman

Create gh-pages branch via GitHub

parent ba3c94af
<!doctype html> <!DOCTYPE html>
<html> <html lang="en-us">
<head> <head>
<meta charset="utf-8"> <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<title>Spdlog by gabime</title> <title>Spdlog by gabime</title>
<link rel="stylesheet" href="stylesheets/styles.css"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="stylesheets/pygment_trac.css"> <link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <link href='http://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
<script src="javascripts/respond.js"></script> <link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
<!--[if lt IE 9]> <link rel="stylesheet" type="text/css" href="stylesheets/github-light.css" media="screen">
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!--[if lt IE 8]>
<link rel="stylesheet" href="stylesheets/ie.css">
<![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
</head> </head>
<body> <body>
<div id="header"> <section class="page-header">
<nav> <h1 class="project-name">Spdlog</h1>
<li class="fork"><a href="https://github.com/gabime/spdlog">View On GitHub</a></li> <h2 class="project-tagline">Super fast C++ logging library.</h2>
<li class="downloads"><a href="https://github.com/gabime/spdlog/zipball/master">ZIP</a></li> <a href="https://github.com/gabime/spdlog" class="btn">View on GitHub</a>
<li class="downloads"><a href="https://github.com/gabime/spdlog/tarball/master">TAR</a></li> <a href="https://github.com/gabime/spdlog/zipball/master" class="btn">Download .zip</a>
<li class="title">DOWNLOADS</li> <a href="https://github.com/gabime/spdlog/tarball/master" class="btn">Download .tar.gz</a>
</nav> </section>
</div><!-- end header -->
<div class="wrapper">
<section>
<div id="title">
<h1>Spdlog</h1>
<p>Super fast C++ logging library.</p>
<hr>
<span class="credits left">Project maintained by <a href="https://github.com/gabime">gabime</a></span>
<span class="credits right">Hosted on GitHub Pages &mdash; Theme by <a href="https://twitter.com/michigangraham">mattgraham</a></span>
</div>
<section class="main-content">
<h1> <h1>
<a name="spdlog" class="anchor" href="#spdlog"><span class="octicon octicon-link"></span></a>spdlog</h1> <a id="spdlog" class="anchor" href="#spdlog" aria-hidden="true"><span class="octicon octicon-link"></span></a>spdlog</h1>
<p>Very fast, header only, C++ logging library.</p> <p>Very fast, header only, C++ logging library.</p>
<h2> <h2>
<a name="install" class="anchor" href="#install"><span class="octicon octicon-link"></span></a>Install</h2> <a id="install" class="anchor" href="#install" aria-hidden="true"><span class="octicon octicon-link"></span></a>Install</h2>
<p>Just copy the files to your build tree and use a C++11 compiler</p> <p>Just copy the files to your build tree and use a C++11 compiler</p>
<h2> <h2>
<a name="tested-on" class="anchor" href="#tested-on"><span class="octicon octicon-link"></span></a>Tested on:</h2> <a id="tested-on" class="anchor" href="#tested-on" aria-hidden="true"><span class="octicon octicon-link"></span></a>Tested on:</h2>
<ul> <ul>
<li>gcc 4.8.1 and above</li> <li>gcc 4.8.1 and above</li>
<li>clang 3.5</li> <li>clang 3.5 (Linux and OSX)</li>
<li>visual studio 2013</li> <li>visual studio 2013</li>
<li>mingw with g++ 4.9.x</li>
</ul> </ul>
<h2> <h2>
<a name="features" class="anchor" href="#features"><span class="octicon octicon-link"></span></a>Features</h2> <a id="features" class="anchor" href="#features" aria-hidden="true"><span class="octicon octicon-link"></span></a>Features</h2>
<ul>
<li>Very fast - performance is the primary goal (see <a href="#benchmarks">benchmarks</a> below).</li>
<li>Headers only.</li>
<li>No dependencies - just copy and use.</li>
<li>Cross platform - Linux / Windows on 32/64 bits.</li>
<li>
<strong>new!</strong> Feature rich <a href="#usage-example">call style</a> using the excellent <a href="http://cppformat.github.io/">cppformat</a> library.</li>
<li>ostream call style is supported too.</li>
<li>Extremely fast asynchronous mode (optional) - using lockfree queues and other tricks to reach millions of calls/sec.</li>
<li>
<a href="https://github.com/gabime/spdlog/wiki/Custom-formatting">Custom</a> formatting.</li>
<li>Multi/Single threaded loggers.</li>
<li>Various log targets:
<ul> <ul>
<li>Very low overhead</li> <li>Rotating log files.</li>
<li>Stream like, easy to use interface</li> <li>Daily log files.</li>
<li>Logging levels</li> <li>Console logging.</li>
<li>Rotating log files</li> <li>Linux syslog.</li>
<li>Daily log files</li> <li>Easily extendable with custom log targets (just implement a single function in the <a href="include/spdlog/sinks/sink.h">sink</a> interface).</li>
<li>Async logging</li> </ul>
<li>Thread safety</li> </li>
<li>Custom formatting</li> <li>Severity based filtering - threshold levels can be modified in runtime as well as in compile time.</li>
</ul> </ul>
<h2> <h2>
<a name="performance" class="anchor" href="#performance"><span class="octicon octicon-link"></span></a>Performance</h2> <a id="benchmarks" class="anchor" href="#benchmarks" aria-hidden="true"><span class="octicon octicon-link"></span></a>Benchmarks</h2>
<p>Below are some <a href="bench">benchmarks</a> comparing popular log libraries under Ubuntu 64 bit, Intel i7-4770 CPU @ 3.40GHz </p>
<h4>
<a id="synchronous-mode" class="anchor" href="#synchronous-mode" aria-hidden="true"><span class="octicon octicon-link"></span></a>Synchronous mode</h4>
<p>Time needed to log 1,000,000 lines in synchronous mode (in seconds, the best of 3 runs):</p>
<p>The library is very fast. <table>
Here are some benchmarks (Ubuntu, Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz)</p> <thead>
<tr>
<th>threads</th>
<th align="center">boost log</th>
<th align="center">glog</th>
<th align="right">easylogging</th>
<th align="right">spdlog</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td align="center">4.169s</td>
<td align="center">1.066s</td>
<td align="right">0.975s</td>
<td align="right">0.302s</td>
</tr>
<tr>
<td>10</td>
<td align="center">16.029</td>
<td align="center">3.032s</td>
<td align="right">2.857s</td>
<td align="right">0.968s</td>
</tr>
<tr>
<td>100</td>
<td align="center">15.008</td>
<td align="center">1.139s</td>
<td align="right">4.512s</td>
<td align="right">0.497s</td>
</tr>
</tbody>
</table>
<pre><code>******************************************************************************* <h4>
Single thread, 250,000 iterations, flush every 1000 lines <a id="asynchronous-mode" class="anchor" href="#asynchronous-mode" aria-hidden="true"><span class="octicon octicon-link"></span></a>Asynchronous mode</h4>
*******************************************************************************
rotating_st... 817,860 lines/sec
daily_st... 827,820 lines /sec
******************************************************************************* <p>Time needed to log 1,000,000 lines in asynchronous mode, i.e. the time it takes to put them in the async queue (in seconds, the best of 3 runs):</p>
4 threads sharing same logger, 250,000 iterations, flush every 1000 lines
******************************************************************************* <table>
rotating_mt... 1,476,013 lines/sec <thead>
daily_mt... 1,477,619 lines/sec <tr>
</code></pre> <th align="left">threads</th>
<th align="center">g2log <sup>async logger</sup>
</th>
<th align="right">spdlog <sup>async mode</sup>
</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">1</td>
<td align="center">1.850s</td>
<td align="right">0.216s</td>
</tr>
<tr>
<td align="left">10</td>
<td align="center">0.943s</td>
<td align="right">0.173s</td>
</tr>
<tr>
<td align="left">100</td>
<td align="center">0.959s</td>
<td align="right">0.202s</td>
</tr>
</tbody>
</table>
<h2> <h2>
<a name="usage-example" class="anchor" href="#usage-example"><span class="octicon octicon-link"></span></a>Usage Example</h2> <a id="usage-example" class="anchor" href="#usage-example" aria-hidden="true"><span class="octicon octicon-link"></span></a>Usage Example</h2>
<pre><code>#include &lt;iostream&gt; <div class="highlight highlight-c++"><pre>#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>iostream<span class="pl-pds">&gt;</span></span>
#include "spdlog/spdlog.h" #<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">"</span>spdlog/spdlog.h<span class="pl-pds">"</span></span>
int main(int, char* []) <span class="pl-k">int</span> <span class="pl-en">main</span>(<span class="pl-k">int</span>, <span class="pl-k">char</span>* [])
{ {
namespace spd = spdlog; <span class="pl-k">namespace</span> <span class="pl-en">spd</span> <span class="pl-k">=</span> spdlog;
<span class="pl-k">try</span>
try
{ {
std::string filename = "spdlog_example"; <span class="pl-c">//Create console, multithreaded logger</span>
auto console = spd::stderr_logger_mt("console"); <span class="pl-k">auto</span> console = <span class="pl-c1">spd::stdout_logger_mt</span>(<span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>);
console-&gt;info("Welcome to spdlog!") ; console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Welcome to spdlog!<span class="pl-pds">"</span></span>) ;
console-&gt;info() &lt;&lt; "Creating file " &lt;&lt; filename &lt;&lt; ".."; console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>An info message example {}..<span class="pl-pds">"</span></span>, <span class="pl-c1">1</span>);
console-&gt;<span class="pl-c1">info</span>() &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>Streams are supported too <span class="pl-pds">"</span></span> &lt;&lt; <span class="pl-c1">1</span>;
auto file_logger = spd::rotating_logger_mt("file_logger", filename, 1024 * 1024 * 5, 3); <span class="pl-c">//Formatting examples</span>
file_logger-&gt;info("Log file message number", 1); console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Easy padding in numbers like {:08d}<span class="pl-pds">"</span></span>, <span class="pl-c1">12</span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}<span class="pl-pds">"</span></span>, <span class="pl-c1">42</span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Support for floats {:03.2f}<span class="pl-pds">"</span></span>, <span class="pl-c1">1.23456</span>);
console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>Positional args are {1} {0}..<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>too<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>supported<span class="pl-pds">"</span></span>);
for (int i = 0; i &lt; 100; ++i) console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>{:&lt;30}<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>left aligned<span class="pl-pds">"</span></span>);
{ console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>{:&gt;30}<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>right aligned<span class="pl-pds">"</span></span>);
auto square = i*i; console-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>{:^30}<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>centered<span class="pl-pds">"</span></span>);
file_logger-&gt;info() &lt;&lt; i &lt;&lt; '*' &lt;&lt; i &lt;&lt; '=' &lt;&lt; square &lt;&lt; " (" &lt;&lt; "0x" &lt;&lt; std::hex &lt;&lt; square &lt;&lt; ")";
} <span class="pl-c">//</span>
<span class="pl-c">// Runtime log levels</span>
<span class="pl-c">//</span>
<span class="pl-c1">spd::set_level</span>(spd::level::info); <span class="pl-c">//Set global log level to info</span>
console-&gt;<span class="pl-c1">debug</span>(<span class="pl-s"><span class="pl-pds">"</span>This message shold not be displayed!<span class="pl-pds">"</span></span>);
console-&gt;<span class="pl-c1">set_level</span>(spd::level::debug); <span class="pl-c">// Set specific logger's log level</span>
console-&gt;<span class="pl-c1">debug</span>(<span class="pl-s"><span class="pl-pds">"</span>Now it should..<span class="pl-pds">"</span></span>);
<span class="pl-c">//</span>
<span class="pl-c">// Create a file rotating logger with 5mb size max and 3 rotated files</span>
<span class="pl-c">//</span>
<span class="pl-k">auto</span> file_logger = <span class="pl-c1">spd::rotating_logger_mt</span>(<span class="pl-s"><span class="pl-pds">"</span>file_logger<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>logs/mylogfile<span class="pl-pds">"</span></span>, <span class="pl-c1">1048576</span> * <span class="pl-c1">5</span>, <span class="pl-c1">3</span>);
<span class="pl-k">for</span>(<span class="pl-k">int</span> i = <span class="pl-c1">0</span>; i &lt; <span class="pl-c1">10</span>; ++i)
file_logger-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>{} * {} equals {:&gt;10}<span class="pl-pds">"</span></span>, i, i, i*i);
<span class="pl-c">//</span>
<span class="pl-c">// Create a daily logger - a new file is created every day on 2:30am</span>
<span class="pl-c">//</span>
<span class="pl-k">auto</span> daily_logger = <span class="pl-c1">spd::daily_logger_mt</span>(<span class="pl-s"><span class="pl-pds">"</span>daily_logger<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>logs/daily<span class="pl-pds">"</span></span>, <span class="pl-c1">2</span>, <span class="pl-c1">30</span>);
// Change log level to all loggers to warning and above <span class="pl-c">// </span>
spd::set_level(spd::level::WARN); <span class="pl-c">// Customize msg format for all messages</span>
console-&gt;info("This should not be displayed"); <span class="pl-c">//</span>
console-&gt;warn("This should!"); <span class="pl-c1">spd::set_pattern</span>(<span class="pl-s"><span class="pl-pds">"</span>*** [<span class="pl-ii">%</span>H:<span class="pl-ii">%</span>M:<span class="pl-c1">%S</span> <span class="pl-ii">%</span>z] [thread <span class="pl-ii">%</span>t] <span class="pl-ii">%</span>v ***<span class="pl-pds">"</span></span>);
spd::set_level(spd::level::INFO); file_logger-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>This is another message with custom format<span class="pl-pds">"</span></span>);
// Change format pattern to all loggers <span class="pl-c1">spd::get</span>(<span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>)-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>loggers can be retrieved from a global registry using the spdlog::get(logger_name) function<span class="pl-pds">"</span></span>);
spd::set_pattern(" **** %Y-%m-%d %H:%M:%S.%e %l **** %v");
spd::get("console")-&gt;info("This is another message with different format"); <span class="pl-c">//</span>
<span class="pl-c">// Compile time debug or trace macros.</span>
<span class="pl-c">// Enabled #ifdef SPDLOG_DEBUG_ON or #ifdef SPDLOG_TRACE_ON</span>
<span class="pl-c">//</span>
<span class="pl-c1">SPDLOG_TRACE</span>(console, <span class="pl-s"><span class="pl-pds">"</span>Enabled only #ifdef SPDLOG_TRACE_ON..{} ,{}<span class="pl-pds">"</span></span>, <span class="pl-c1">1</span>, <span class="pl-c1">3.23</span>);
<span class="pl-c1">SPDLOG_DEBUG</span>(console, <span class="pl-s"><span class="pl-pds">"</span>Enabled only #ifdef SPDLOG_DEBUG_ON.. {} ,{}<span class="pl-pds">"</span></span>, <span class="pl-c1">1</span>, <span class="pl-c1">3.23</span>);
<span class="pl-c">//</span>
<span class="pl-c">// Asynchronous logging is very fast..</span>
<span class="pl-c">// Just call spdlog::set_async_mode(q_size) and all created loggers from now on will be asynchronous..</span>
<span class="pl-c">//</span>
<span class="pl-c1">size_t</span> q_size = <span class="pl-c1">1048576</span>; <span class="pl-c">//queue size must be power of 2</span>
<span class="pl-c1">spdlog::set_async_mode</span>(q_size);
<span class="pl-k">auto</span> async_file= <span class="pl-c1">spd::daily_logger_st</span>(<span class="pl-s"><span class="pl-pds">"</span>async_file_logger<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>logs/async_log.txt<span class="pl-pds">"</span></span>);
async_file-&gt;<span class="pl-c1">info</span>() &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>This is async log..<span class="pl-pds">"</span></span> &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>Should be very fast!<span class="pl-pds">"</span></span>;
<span class="pl-c">// </span>
<span class="pl-c">// syslog example. linux only..</span>
<span class="pl-c">//</span>
#<span class="pl-k">ifdef</span> __linux__
std::string ident = <span class="pl-s"><span class="pl-pds">"</span>spdlog-example<span class="pl-pds">"</span></span>;
<span class="pl-k">auto</span> syslog_logger = <span class="pl-c1">spd::syslog_logger</span>(<span class="pl-s"><span class="pl-pds">"</span>syslog<span class="pl-pds">"</span></span>, ident, LOG_PID);
syslog_logger-&gt;<span class="pl-c1">warn</span>(<span class="pl-s"><span class="pl-pds">"</span>This is warning that will end up in syslog. This is Linux only!<span class="pl-pds">"</span></span>);
#<span class="pl-k">endif</span>
} }
catch (const spd::spdlog_ex&amp; ex) <span class="pl-k">catch</span> (<span class="pl-k">const</span> spd::spdlog_ex&amp; ex)
{ {
std::cout &lt;&lt; "Log failed: " &lt;&lt; ex.what() &lt;&lt; std::endl; std::cout &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>Log failed: <span class="pl-pds">"</span></span> &lt;&lt; ex.<span class="pl-c1">what</span>() &lt;&lt; std::endl;
} }
return 0;
} }
</code></pre>
<span class="pl-c">// Example of user defined class with operator&lt;&lt;</span>
<span class="pl-k">class</span> <span class="pl-en">some_class</span> {};
std::ostream&amp; <span class="pl-k">operator</span>&lt;&lt;(std::ostream&amp; os, <span class="pl-k">const</span> some_class&amp; c) { <span class="pl-k">return</span> os &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>some_class<span class="pl-pds">"</span></span>; }
<span class="pl-k">void</span> <span class="pl-en">custom_class_example</span>()
{
some_class c;
<span class="pl-c1">spdlog::get</span>(<span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>)-&gt;<span class="pl-c1">info</span>(<span class="pl-s"><span class="pl-pds">"</span>custom class with operator&lt;&lt;: {}..<span class="pl-pds">"</span></span>, c);
<span class="pl-c1">spdlog::get</span>(<span class="pl-s"><span class="pl-pds">"</span>console<span class="pl-pds">"</span></span>)-&gt;<span class="pl-c1">info</span>() &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>custom class with operator&lt;&lt;: <span class="pl-pds">"</span></span> &lt;&lt; c &lt;&lt; <span class="pl-s"><span class="pl-pds">"</span>..<span class="pl-pds">"</span></span>;
}</pre></div>
<h2>
<a id="tweaking" class="anchor" href="#tweaking" aria-hidden="true"><span class="octicon octicon-link"></span></a>Tweaking</h2>
<p>spdlog can be tweaked to improve performance even more.</p>
<p>Edit <a href="include/spdlog/tweakme.h">this</a> file to disable at compile time unneeded features.</p>
<footer class="site-footer">
<span class="site-footer-owner"><a href="https://github.com/gabime/spdlog">Spdlog</a> is maintained by <a href="https://github.com/gabime">gabime</a>.</span>
<span class="site-footer-credits">This page was generated by <a href="https://pages.github.com">GitHub Pages</a> using the <a href="https://github.com/jasonlong/cayman-theme">Cayman theme</a> by <a href="https://twitter.com/jasonlong">Jason Long</a>.</span>
</footer>
</section> </section>
</div>
<!--[if !IE]><script>fixScale(document);</script><![endif]-->
</body> </body>
</html> </html>
{"name":"Spdlog","tagline":"Super fast C++ logging library.","body":"# spdlog\r\n\r\nVery fast, header only, C++ logging library.\r\n\r\n\r\n## Install\r\nJust copy the files to your build tree and use a C++11 compiler\r\n\r\n\r\n## Tested on:\r\n* gcc 4.8.1 and above\r\n* clang 3.5\r\n* visual studio 2013\r\n\r\n##Features\r\n* Very low overhead\r\n* Stream like, easy to use interface\r\n* Logging levels\r\n* Rotating log files\r\n* Daily log files\r\n* Async logging\r\n* Thread safety\r\n* Custom formatting\r\n\r\n\r\n## Performance\r\nThe library is very fast. \r\nHere are some benchmarks (Ubuntu, Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz)\r\n```\r\n*******************************************************************************\r\nSingle thread, 250,000 iterations, flush every 1000 lines\r\n*******************************************************************************\r\nrotating_st...\t817,860 lines/sec\r\ndaily_st...\t\t827,820 lines /sec\r\n\r\n*******************************************************************************\r\n4 threads sharing same logger, 250,000 iterations, flush every 1000 lines\r\n*******************************************************************************\r\nrotating_mt...\t1,476,013 lines/sec\r\ndaily_mt...\t\t1,477,619 lines/sec\r\n```\r\n\r\n## Usage Example\r\n```\r\n#include <iostream>\r\n#include \"spdlog/spdlog.h\"\r\n\r\nint main(int, char* [])\r\n{\r\n namespace spd = spdlog;\r\n\r\n try\r\n {\r\n std::string filename = \"spdlog_example\";\r\n auto console = spd::stderr_logger_mt(\"console\");\r\n console->info(\"Welcome to spdlog!\") ;\r\n console->info() << \"Creating file \" << filename << \"..\";\r\n\r\n auto file_logger = spd::rotating_logger_mt(\"file_logger\", filename, 1024 * 1024 * 5, 3);\r\n file_logger->info(\"Log file message number\", 1);\r\n\r\n for (int i = 0; i < 100; ++i)\r\n {\r\n auto square = i*i;\r\n file_logger->info() << i << '*' << i << '=' << square << \" (\" << \"0x\" << std::hex << square << \")\";\r\n }\r\n\r\n // Change log level to all loggers to warning and above\r\n spd::set_level(spd::level::WARN);\r\n console->info(\"This should not be displayed\");\r\n console->warn(\"This should!\");\r\n spd::set_level(spd::level::INFO);\r\n\r\n // Change format pattern to all loggers\r\n spd::set_pattern(\" **** %Y-%m-%d %H:%M:%S.%e %l **** %v\");\r\n spd::get(\"console\")->info(\"This is another message with different format\");\r\n }\r\n catch (const spd::spdlog_ex& ex)\r\n {\r\n std::cout << \"Log failed: \" << ex.what() << std::endl;\r\n }\r\n return 0;\r\n}\r\n```","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} {"name":"Spdlog","tagline":"Super fast C++ logging library.","body":"# spdlog\r\n\r\nVery fast, header only, C++ logging library.\r\n\r\n## Install\r\nJust copy the files to your build tree and use a C++11 compiler\r\n\r\n## Tested on:\r\n* gcc 4.8.1 and above\r\n* clang 3.5 (Linux and OSX)\r\n* visual studio 2013\r\n* mingw with g++ 4.9.x\r\n\r\n##Features\r\n* Very fast - performance is the primary goal (see [benchmarks](#benchmarks) below).\r\n* Headers only.\r\n* No dependencies - just copy and use.\r\n* Cross platform - Linux / Windows on 32/64 bits.\r\n* **new!** Feature rich [call style](#usage-example) using the excellent [cppformat](http://cppformat.github.io/) library.\r\n* ostream call style is supported too.\r\n* Extremely fast asynchronous mode (optional) - using lockfree queues and other tricks to reach millions of calls/sec.\r\n* [Custom](https://github.com/gabime/spdlog/wiki/Custom-formatting) formatting.\r\n* Multi/Single threaded loggers.\r\n* Various log targets:\r\n * Rotating log files.\r\n * Daily log files.\r\n * Console logging.\r\n * Linux syslog.\r\n * Easily extendable with custom log targets (just implement a single function in the [sink](include/spdlog/sinks/sink.h) interface).\r\n* Severity based filtering - threshold levels can be modified in runtime as well as in compile time.\r\n\r\n\r\n\r\n## Benchmarks\r\n\r\nBelow are some [benchmarks](bench) comparing popular log libraries under Ubuntu 64 bit, Intel i7-4770 CPU @ 3.40GHz \r\n\r\n#### Synchronous mode\r\nTime needed to log 1,000,000 lines in synchronous mode (in seconds, the best of 3 runs):\r\n\r\n|threads|boost log|glog |easylogging |spdlog|\r\n|-------|:-------:|:-----:|----------:|------:|\r\n|1| 4.169s |1.066s |0.975s |0.302s|\r\n|10| 16.029 |3.032s |2.857s |0.968s|\r\n|100| 15.008 |1.139s |4.512s |0.497s|\r\n\r\n\r\n#### Asynchronous mode \r\nTime needed to log 1,000,000 lines in asynchronous mode, i.e. the time it takes to put them in the async queue (in seconds, the best of 3 runs):\r\n\r\n|threads|g2log <sup>async logger</sup> |spdlog <sup>async mode</sup>|\r\n|:-------|:-----:|-------------------------:|\r\n|1| 1.850s |0.216s |\r\n|10| 0.943s |0.173s|\r\n|100| 0.959s |0.202s|\r\n\r\n\r\n\r\n\r\n## Usage Example\r\n```c++\r\n#include <iostream>\r\n#include \"spdlog/spdlog.h\"\r\n\r\nint main(int, char* [])\r\n{\r\n namespace spd = spdlog;\r\n try\r\n {\r\n //Create console, multithreaded logger\r\n auto console = spd::stdout_logger_mt(\"console\");\r\n console->info(\"Welcome to spdlog!\") ;\r\n console->info(\"An info message example {}..\", 1);\r\n console->info() << \"Streams are supported too \" << 1;\r\n\t\r\n //Formatting examples\r\n console->info(\"Easy padding in numbers like {:08d}\", 12);\r\n console->info(\"Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}\", 42);\r\n console->info(\"Support for floats {:03.2f}\", 1.23456);\r\n console->info(\"Positional args are {1} {0}..\", \"too\", \"supported\");\r\n\r\n console->info(\"{:<30}\", \"left aligned\");\r\n console->info(\"{:>30}\", \"right aligned\");\r\n console->info(\"{:^30}\", \"centered\");\r\n \r\n //\r\n // Runtime log levels\r\n //\r\n spd::set_level(spd::level::info); //Set global log level to info\r\n console->debug(\"This message shold not be displayed!\");\r\n console->set_level(spd::level::debug); // Set specific logger's log level\r\n console->debug(\"Now it should..\");\r\n \r\n //\r\n // Create a file rotating logger with 5mb size max and 3 rotated files\r\n //\r\n auto file_logger = spd::rotating_logger_mt(\"file_logger\", \"logs/mylogfile\", 1048576 * 5, 3);\r\n for(int i = 0; i < 10; ++i)\r\n\t\t file_logger->info(\"{} * {} equals {:>10}\", i, i, i*i);\r\n\r\n //\r\n // Create a daily logger - a new file is created every day on 2:30am\r\n //\r\n auto daily_logger = spd::daily_logger_mt(\"daily_logger\", \"logs/daily\", 2, 30);\r\n \r\n // \r\n // Customize msg format for all messages\r\n //\r\n spd::set_pattern(\"*** [%H:%M:%S %z] [thread %t] %v ***\");\r\n file_logger->info(\"This is another message with custom format\");\r\n\r\n spd::get(\"console\")->info(\"loggers can be retrieved from a global registry using the spdlog::get(logger_name) function\");\r\n\r\n //\r\n // Compile time debug or trace macros.\r\n // Enabled #ifdef SPDLOG_DEBUG_ON or #ifdef SPDLOG_TRACE_ON\r\n //\r\n SPDLOG_TRACE(console, \"Enabled only #ifdef SPDLOG_TRACE_ON..{} ,{}\", 1, 3.23);\r\n SPDLOG_DEBUG(console, \"Enabled only #ifdef SPDLOG_DEBUG_ON.. {} ,{}\", 1, 3.23);\r\n \r\n //\r\n // Asynchronous logging is very fast..\r\n // Just call spdlog::set_async_mode(q_size) and all created loggers from now on will be asynchronous..\r\n //\r\n size_t q_size = 1048576; //queue size must be power of 2\r\n spdlog::set_async_mode(q_size);\r\n auto async_file= spd::daily_logger_st(\"async_file_logger\", \"logs/async_log.txt\");\r\n async_file->info() << \"This is async log..\" << \"Should be very fast!\";\r\n \r\n // \r\n // syslog example. linux only..\r\n //\r\n #ifdef __linux__\r\n std::string ident = \"spdlog-example\";\r\n auto syslog_logger = spd::syslog_logger(\"syslog\", ident, LOG_PID);\r\n syslog_logger->warn(\"This is warning that will end up in syslog. This is Linux only!\"); \r\n #endif\r\n }\r\n catch (const spd::spdlog_ex& ex)\r\n {\r\n std::cout << \"Log failed: \" << ex.what() << std::endl;\r\n }\r\n}\r\n\r\n\r\n// Example of user defined class with operator<<\r\nclass some_class {};\r\nstd::ostream& operator<<(std::ostream& os, const some_class& c) { return os << \"some_class\"; }\r\n\r\nvoid custom_class_example()\r\n{\r\n some_class c;\r\n spdlog::get(\"console\")->info(\"custom class with operator<<: {}..\", c);\r\n spdlog::get(\"console\")->info() << \"custom class with operator<<: \" << c << \"..\";\r\n}\r\n```\r\n\r\n## Tweaking\r\nspdlog can be tweaked to improve performance even more.\r\n\r\nEdit [this](include/spdlog/tweakme.h) file to disable at compile time unneeded features.\r\n\r\n\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."}
\ No newline at end of file \ No newline at end of file
/*
Copyright 2014 GitHub Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
.pl-c /* comment */ {
color: #969896;
}
.pl-c1 /* constant, markup.raw, meta.diff.header, meta.module-reference, meta.property-name, support, support.constant, support.variable, variable.other.constant */,
.pl-s .pl-v /* string variable */ {
color: #0086b3;
}
.pl-e /* entity */,
.pl-en /* entity.name */ {
color: #795da3;
}
.pl-s .pl-s1 /* string source */,
.pl-smi /* storage.modifier.import, storage.modifier.package, storage.type.java, variable.other, variable.parameter.function */ {
color: #333;
}
.pl-ent /* entity.name.tag */ {
color: #63a35c;
}
.pl-k /* keyword, storage, storage.type */ {
color: #a71d5d;
}
.pl-pds /* punctuation.definition.string, string.regexp.character-class */,
.pl-s /* string */,
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
.pl-sr /* string.regexp */,
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */,
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */ {
color: #183691;
}
.pl-v /* variable */ {
color: #ed6a43;
}
.pl-id /* invalid.deprecated */ {
color: #b52a1d;
}
.pl-ii /* invalid.illegal */ {
background-color: #b52a1d;
color: #f8f8f8;
}
.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
color: #63a35c;
font-weight: bold;
}
.pl-ml /* markup.list */ {
color: #693a17;
}
.pl-mh /* markup.heading */,
.pl-mh .pl-en /* markup.heading entity.name */,
.pl-ms /* meta.separator */ {
color: #1d3e81;
font-weight: bold;
}
.pl-mq /* markup.quote */ {
color: #008080;
}
.pl-mi /* markup.italic */ {
color: #333;
font-style: italic;
}
.pl-mb /* markup.bold */ {
color: #333;
font-weight: bold;
}
.pl-md /* markup.deleted, meta.diff.header.from-file */ {
background-color: #ffecec;
color: #bd2c00;
}
.pl-mi1 /* markup.inserted, meta.diff.header.to-file */ {
background-color: #eaffea;
color: #55a532;
}
.pl-mdr /* meta.diff.range */ {
color: #795da3;
font-weight: bold;
}
.pl-mo /* meta.output */ {
color: #1d3e81;
}
/* normalize.css 2012-02-07T12:37 UTC - http://github.com/necolas/normalize.css */ /*! normalize.css v3.0.2 | MIT License | git.io/normalize */
/* =============================================================================
HTML5 display definitions /**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */ ========================================================================== */
/*
* Corrects block display not defined in IE6/7/8/9 & FF3 /**
* Correct `block` display not defined for any HTML5 element in IE 8/9.
* Correct `block` display not defined for `details` or `summary` in IE 10/11
* and Firefox.
* Correct `block` display not defined for `main` in IE 11.
*/ */
article, article,
aside, aside,
details, details,
...@@ -13,209 +38,126 @@ figure, ...@@ -13,209 +38,126 @@ figure,
footer, footer,
header, header,
hgroup, hgroup,
main,
menu,
nav, nav,
section, section,
summary { summary {
display: block; display: block;
} }
/* /**
* Corrects inline-block display not defined in IE6/7/8/9 & FF3 * 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/ */
audio, audio,
canvas, canvas,
progress,
video { video {
display: inline-block; display: inline-block; /* 1 */
*display: inline; vertical-align: baseline; /* 2 */
*zoom: 1;
} }
/* /**
* Prevents modern browsers from displaying 'audio' without controls * Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/ */
audio:not([controls]) { audio:not([controls]) {
display: none; display: none;
height: 0;
} }
/* /**
* Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4 * Address `[hidden]` styling not present in IE 8/9/10.
* Known issue: no IE6 support * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
*/ */
[hidden] {
[hidden],
template {
display: none; display: none;
} }
/* ============================================================================= /* Links
Base
========================================================================== */ ========================================================================== */
/*
* 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units
* http://clagnut.com/blog/348/#c790
* 2. Prevents iOS text size adjust after orientation change, without disabling user zoom
* www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/
*/
html {
font-size: 100%;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
-ms-text-size-adjust: 100%;
/* 2 */
}
/* /**
* Addresses font-family inconsistency between 'textarea' and other form elements. * Remove the gray background color from active links in IE 10.
*/ */
html,
button,
input,
select,
textarea {
font-family: sans-serif;
}
/* a {
* Addresses margins handled incorrectly in IE6/7 background-color: transparent;
*/
body {
margin: 0;
} }
/* ============================================================================= /**
Links * Improve readability when focused and also mouse hovered in all browsers.
========================================================================== */
/*
* Addresses outline displayed oddly in Chrome
*/ */
a:focus {
outline: thin dotted;
}
/* a:active,
* Improves readability when focused and also mouse hovered in all browsers a:hover {
* people.opera.com/patrickl/experiments/keyboard/test
*/
a:hover,
a:active {
outline: 0; outline: 0;
} }
/* ============================================================================= /* Text-level semantics
Typography
========================================================================== */ ========================================================================== */
/*
* Addresses font sizes and margins set differently in IE6/7
* Addresses font sizes within 'section' and 'article' in FF4+, Chrome, S5
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
h2 { /**
font-size: 1.5em; * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
margin: 0.83em 0;
}
h3 {
font-size: 1.17em;
margin: 1em 0;
}
h4 {
font-size: 1em;
margin: 1.33em 0;
}
h5 {
font-size: 0.83em;
margin: 1.67em 0;
}
h6 {
font-size: 0.75em;
margin: 2.33em 0;
}
/*
* Addresses styling not present in IE7/8/9, S5, Chrome
*/ */
abbr[title] { abbr[title] {
border-bottom: 1px dotted; border-bottom: 1px dotted;
} }
/* /**
* Addresses style set to 'bolder' in FF3+, S4/5, Chrome * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
*/ */
b, b,
strong { strong {
font-weight: bold; font-weight: bold;
} }
blockquote { /**
margin: 1em 40px; * Address styling not present in Safari and Chrome.
}
/*
* Addresses styling not present in S5, Chrome
*/ */
dfn { dfn {
font-style: italic; font-style: italic;
} }
/* /**
* Addresses styling not present in IE6/7/8/9 * Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari, and Chrome.
*/ */
mark {
background: #ff0;
color: #000;
}
/* h1 {
* Addresses margins set differently in IE6/7 font-size: 2em;
*/ margin: 0.67em 0;
p,
pre {
margin: 1em 0;
} }
/* /**
* Corrects font family set oddly in IE6, S4/5, Chrome * Address styling not present in IE 8/9.
* en.wikipedia.org/wiki/User:Davidgothberg/Test59
*/ */
pre,
code,
kbd,
samp {
font-family: monospace, serif;
_font-family: 'courier new', monospace;
font-size: 1em;
}
/* mark {
* 1. Addresses CSS quotes not supported in IE6/7 background: #ff0;
* 2. Addresses quote property not supported in S4 color: #000;
*/
/* 1 */
q {
quotes: none;
} }
/* 2 */ /**
q:before, * Address inconsistent and variable font size in all browsers.
q:after { */
content: '';
content: none;
}
small { small {
font-size: 75%; font-size: 80%;
} }
/* /**
* Prevents sub and sup affecting line-height in all browsers * Prevent `sub` and `sup` affecting `line-height` in all browsers.
* gist.github.com/413930
*/ */
sub, sub,
sup { sup {
font-size: 75%; font-size: 75%;
...@@ -232,228 +174,251 @@ sub { ...@@ -232,228 +174,251 @@ sub {
bottom: -0.25em; bottom: -0.25em;
} }
/* ============================================================================= /* Embedded content
Lists
========================================================================== */ ========================================================================== */
/*
* Addresses margins set differently in IE6/7
*/
dl,
menu,
ol,
ul {
margin: 1em 0;
}
dd { /**
margin: 0 0 0 40px; * Remove border when inside `a` element in IE 8/9/10.
}
/*
* Addresses paddings set differently in IE6/7
*/ */
menu,
ol,
ul {
padding: 0 0 0 40px;
}
/*
* Corrects list images handled incorrectly in IE7
*/
nav ul,
nav ol {
list-style: none;
list-style-image: none;
}
/* =============================================================================
Embedded content
========================================================================== */
/*
* 1. Removes border when inside 'a' element in IE6/7/8/9, FF3
* 2. Improves image quality when scaled in IE7
* code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/
*/
img { img {
border: 0; border: 0;
/* 1 */
-ms-interpolation-mode: bicubic;
/* 2 */
} }
/* /**
* Corrects overflow displayed oddly in IE9 * Correct overflow not hidden in IE 9/10/11.
*/ */
svg:not(:root) { svg:not(:root) {
overflow: hidden; overflow: hidden;
} }
/* ============================================================================= /* Grouping content
Figures
========================================================================== */ ========================================================================== */
/*
* Addresses margin not present in IE6/7/8/9, S5, O11 /**
* Address margin not present in IE 8/9 and Safari.
*/ */
figure { figure {
margin: 0; margin: 1em 40px;
} }
/* ============================================================================= /**
Forms * Address differences between Firefox and other browsers.
========================================================================== */
/*
* Corrects margin displayed oddly in IE6/7
*/ */
form {
margin: 0; hr {
box-sizing: content-box;
height: 0;
} }
/* /**
* Define consistent border, margin, and padding * Contain overflow in all browsers.
*/ */
fieldset {
border: 1px solid #c0c0c0; pre {
margin: 0 2px; overflow: auto;
padding: 0.35em 0.625em 0.75em;
} }
/* /**
* 1. Corrects color not being inherited in IE6/7/8/9 * Address odd `em`-unit font size rendering in all browsers.
* 2. Corrects text not wrapping in FF3
* 3. Corrects alignment displayed oddly in IE6/7
*/ */
legend {
border: 0; code,
/* 1 */ kbd,
padding: 0; pre,
white-space: normal; samp {
/* 2 */ font-family: monospace, monospace;
*margin-left: -7px; font-size: 1em;
/* 3 */
} }
/* /* Forms
* 1. Corrects font size not being inherited in all browsers ========================================================================== */
* 2. Addresses margins set differently in IE6/7, FF3+, S5, Chrome
* 3. Improves appearance and consistency in all browsers /**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/ */
/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
*/
button, button,
input, input,
optgroup,
select, select,
textarea { textarea {
font-size: 100%; color: inherit; /* 1 */
/* 1 */ font: inherit; /* 2 */
margin: 0; margin: 0; /* 3 */
/* 2 */ }
vertical-align: baseline;
/* 3 */ /**
*vertical-align: middle; * Address `overflow` set to `hidden` in IE 8/9/10/11.
/* 3 */ */
button {
overflow: visible;
} }
/* /**
* Addresses FF3/4 setting line-height on 'input' using !important in the UA stylesheet * Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
* Correct `select` style inheritance in Firefox.
*/ */
button, button,
input { select {
line-height: normal; text-transform: none;
/* 1 */
} }
/* /**
* 1. Improves usability and consistency of cursor style between image-type 'input' and others * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* 2. Corrects inability to style clickable 'input' types in iOS * and `video` controls.
* 3. Removes inner spacing in IE7 without affecting normal text inputs * 2. Correct inability to style clickable `input` types in iOS.
* Known issue: inner spacing remains in IE6 * 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/ */
button, button,
input[type="button"], html input[type="button"], /* 1 */
input[type="reset"], input[type="reset"],
input[type="submit"] { input[type="submit"] {
cursor: pointer; -webkit-appearance: button; /* 2 */
/* 1 */ cursor: pointer; /* 3 */
-webkit-appearance: button;
/* 2 */
*overflow: visible;
/* 3 */
} }
/* /**
* Re-set default cursor for disabled elements * Re-set default cursor for disabled elements.
*/ */
button[disabled], button[disabled],
input[disabled] { html input[disabled] {
cursor: default; cursor: default;
} }
/* /**
* 1. Addresses box sizing set to content-box in IE8/9 * Remove inner padding and border in Firefox 4+.
* 2. Removes excess padding in IE8/9
* 3. Removes excess padding in IE7
Known issue: excess padding remains in IE6
*/ */
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
input {
line-height: normal;
}
/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/
input[type="checkbox"], input[type="checkbox"],
input[type="radio"] { input[type="radio"] {
box-sizing: border-box; box-sizing: border-box; /* 1 */
/* 1 */ padding: 0; /* 2 */
padding: 0; }
/* 2 */
*height: 13px; /**
/* 3 */ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
*width: 13px; * `font-size` values of the `input`, it causes the cursor style of the
/* 3 */ * decrement button to change from `default` to `text`.
*/
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
} }
/* /**
* 1. Addresses appearance set to searchfield in S5, Chrome * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
* 2. Addresses box-sizing set to border-box in S5, Chrome (include -moz to future-proof) * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
* (include `-moz` to future-proof).
*/ */
input[type="search"] { input[type="search"] {
-webkit-appearance: textfield; -webkit-appearance: textfield; /* 1 */ /* 2 */
/* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
/* 2 */
box-sizing: content-box; box-sizing: content-box;
} }
/* /**
* Removes inner padding and search cancel button in S5, Chrome on OS X * Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/ */
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button { input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none; -webkit-appearance: none;
} }
/* /**
* Removes inner padding and border in FF3+ * Define consistent border, margin, and padding.
* www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/
*/ */
button::-moz-focus-inner,
input::-moz-focus-inner { fieldset {
border: 0; border: 1px solid #c0c0c0;
padding: 0; margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9/10/11.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
} }
/* /**
* 1. Removes default vertical scrollbar in IE6/7/8/9 * Remove default vertical scrollbar in IE 8/9/10/11.
* 2. Improves readability and alignment in all browsers
*/ */
textarea { textarea {
overflow: auto; overflow: auto;
/* 1 */
vertical-align: top;
/* 2 */
} }
/* ============================================================================= /**
Tables * Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */ ========================================================================== */
/*
* Remove most spacing between table cells /**
* Remove most spacing between table cells.
*/ */
table { table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
} }
td,
th {
padding: 0;
}
* {
box-sizing: border-box; }
body {
padding: 0;
margin: 0;
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 1.5;
color: #606c71; }
a {
color: #1e6bb8;
text-decoration: none; }
a:hover {
text-decoration: underline; }
.btn {
display: inline-block;
margin-bottom: 1rem;
color: rgba(255, 255, 255, 0.7);
background-color: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
border-style: solid;
border-width: 1px;
border-radius: 0.3rem;
transition: color 0.2s, background-color 0.2s, border-color 0.2s; }
.btn + .btn {
margin-left: 1rem; }
.btn:hover {
color: rgba(255, 255, 255, 0.8);
text-decoration: none;
background-color: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.3); }
@media screen and (min-width: 64em) {
.btn {
padding: 0.75rem 1rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.btn {
padding: 0.6rem 0.9rem;
font-size: 0.9rem; } }
@media screen and (max-width: 42em) {
.btn {
display: block;
width: 100%;
padding: 0.75rem;
font-size: 0.9rem; }
.btn + .btn {
margin-top: 1rem;
margin-left: 0; } }
.page-header {
color: #fff;
text-align: center;
background-color: #159957;
background-image: linear-gradient(120deg, #155799, #159957); }
@media screen and (min-width: 64em) {
.page-header {
padding: 5rem 6rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.page-header {
padding: 3rem 4rem; } }
@media screen and (max-width: 42em) {
.page-header {
padding: 2rem 1rem; } }
.project-name {
margin-top: 0;
margin-bottom: 0.1rem; }
@media screen and (min-width: 64em) {
.project-name {
font-size: 3.25rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.project-name {
font-size: 2.25rem; } }
@media screen and (max-width: 42em) {
.project-name {
font-size: 1.75rem; } }
.project-tagline {
margin-bottom: 2rem;
font-weight: normal;
opacity: 0.7; }
@media screen and (min-width: 64em) {
.project-tagline {
font-size: 1.25rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.project-tagline {
font-size: 1.15rem; } }
@media screen and (max-width: 42em) {
.project-tagline {
font-size: 1rem; } }
.main-content :first-child {
margin-top: 0; }
.main-content img {
max-width: 100%; }
.main-content h1, .main-content h2, .main-content h3, .main-content h4, .main-content h5, .main-content h6 {
margin-top: 2rem;
margin-bottom: 1rem;
font-weight: normal;
color: #159957; }
.main-content p {
margin-bottom: 1em; }
.main-content code {
padding: 2px 4px;
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
font-size: 0.9rem;
color: #383e41;
background-color: #f3f6fa;
border-radius: 0.3rem; }
.main-content pre {
padding: 0.8rem;
margin-top: 0;
margin-bottom: 1rem;
font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace;
color: #567482;
word-wrap: normal;
background-color: #f3f6fa;
border: solid 1px #dce6f0;
border-radius: 0.3rem; }
.main-content pre > code {
padding: 0;
margin: 0;
font-size: 0.9rem;
color: #567482;
word-break: normal;
white-space: pre;
background: transparent;
border: 0; }
.main-content .highlight {
margin-bottom: 1rem; }
.main-content .highlight pre {
margin-bottom: 0;
word-break: normal; }
.main-content .highlight pre, .main-content pre {
padding: 0.8rem;
overflow: auto;
font-size: 0.9rem;
line-height: 1.45;
border-radius: 0.3rem; }
.main-content pre code, .main-content pre tt {
display: inline;
max-width: initial;
padding: 0;
margin: 0;
overflow: initial;
line-height: inherit;
word-wrap: normal;
background-color: transparent;
border: 0; }
.main-content pre code:before, .main-content pre code:after, .main-content pre tt:before, .main-content pre tt:after {
content: normal; }
.main-content ul, .main-content ol {
margin-top: 0; }
.main-content blockquote {
padding: 0 1rem;
margin-left: 0;
color: #819198;
border-left: 0.3rem solid #dce6f0; }
.main-content blockquote > :first-child {
margin-top: 0; }
.main-content blockquote > :last-child {
margin-bottom: 0; }
.main-content table {
display: block;
width: 100%;
overflow: auto;
word-break: normal;
word-break: keep-all; }
.main-content table th {
font-weight: bold; }
.main-content table th, .main-content table td {
padding: 0.5rem 1rem;
border: 1px solid #e9ebec; }
.main-content dl {
padding: 0; }
.main-content dl dt {
padding: 0;
margin-top: 1rem;
font-size: 1rem;
font-weight: bold; }
.main-content dl dd {
padding: 0;
margin-bottom: 1rem; }
.main-content hr {
height: 2px;
padding: 0;
margin: 1rem 0;
background-color: #eff0f1;
border: 0; }
@media screen and (min-width: 64em) {
.main-content {
max-width: 64rem;
padding: 2rem 6rem;
margin: 0 auto;
font-size: 1.1rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.main-content {
padding: 2rem 4rem;
font-size: 1.1rem; } }
@media screen and (max-width: 42em) {
.main-content {
padding: 2rem 1rem;
font-size: 1rem; } }
.site-footer {
padding-top: 2rem;
margin-top: 2rem;
border-top: solid 1px #eff0f1; }
.site-footer-owner {
display: block;
font-weight: bold; }
.site-footer-credits {
color: #819198; }
@media screen and (min-width: 64em) {
.site-footer {
font-size: 1rem; } }
@media screen and (min-width: 42em) and (max-width: 64em) {
.site-footer {
font-size: 1rem; } }
@media screen and (max-width: 42em) {
.site-footer {
font-size: 0.9rem; } }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment