<commit_before><!--
  This file is a part of Verbose
  (c) 2013 TymoonNET/NexT http://tymoon.eu (<EMAIL>)
  Author: <NAME> <<EMAIL>>
  !-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta charset="utf-8" />
    <title>Verbose - About</title>
    <style type="text/css">
      code{font-family: Consolas, Inconsolata, monospace;}
      h3{display: inline-block;margin:0;padding:0;}
      #docs{list-style: none;}
      #docs li{margin-bottom: 20px;}
      #docs pre{margin: 0 0 0 10px; white-space: pre-wrap;}
    </style>
  </head>
  <body>
    <header>
      <img src="http://shinmera.tymoon.eu/public/verbose-logo.png" alt="Verbose"/>
      <h1>v0.9.3</h1>
    </header>
    <div id="content">
      <article>
        <header><h2>What is Verbose?</h2></header>
        <p>
          Verbose is a logging framework for Common Lisp that aims to provide a good default setup as well as an extensible back-end to suit all your logging needs.
        </p>
      </article>
      <article>
        <header><h2>How To</h2></header>
        <p>
          Load Verbose with ASDF or Quicklisp.
        </p>
        <code>(ql:quickload :verbose)</code>
        <p>
          By default, a new logging thread is already started and set up with a REPL-Faucet on the INFO level, that simply prints log messages from the INFO level and above to the standard output:
        </p>
        <code>(v:info :TEST "Hello world!")</code>
        <p>
          Each logging statement expects a category and a format string. Optionally you can pass in format arguments:
        </p>
        <code>(v:info :TEST "2+2=~f" (+ 2 2))</code>
        <p>
          You can change the logging level of the REPL-Faucet easily:
        </p>
        <code>(v:set-repl-level :DEBUG)</code>
        <p>
          If you want to add a new Faucet, such as a rotating file log, you can use attach-to:
        </p>
        <code>(v:attach-to :ERROR (make-instance 'rotating-log-faucet))</code>
        <p>
          It should now write all log messages from :ERROR and above to a date-prepended log file in the current working directory. Have a look at the slots for rotating-log-faucet for finer control.
          You can also add a category filter:
        </p>
        <code>(v:attach-to :ERROR (make-instance 'rotating-log-faucet) :category :TEST)</code>
        <p>
          The <code>*global-controller*</code> is in itself a pipeline. You can therefore use all the tools from <a href="http://shinmera.tymoon.eu/public/piping-about.html">piping</a> to customize even more.
        </p>
      </article>
      <article>
        <header><h2>Other Guff</h2></header>
        <p>
          Verbose is a sub-project of TyNETv5 ("Radiance"), licensed under the <a href="http://opensource.org/licenses/Artistic-2.0">Artistic License 2.0</a> and &#169;2013 TymoonNET/NexT, <a href="http://shinmera.com"><NAME></a>.<br />
          This program can be obtained via git on <a href="git://git.tymoon.eu/verbose.git">git://git.tymoon.eu/verbose.git</a>. For questions, patches or suggestions, please contact me via <a href="mailto:<EMAIL>">email</a>.
        </p>
      </article>
      <article>
        <header><h2>Package Function Index</h2></header>
        <ul id="docs">
          <li id="template">
            <a name="" class="anchor"></a>
            <article>
              <header>
                <span class="functype">test</span>
                <code>
                  <h3 class="funcname">Foo</h3>
                  <span class="funcargs">()</span><commit_msg>Rewrote documentation<commit_after><!--
  This file is a part of Verbose
  (c) 2013 TymoonNET/NexT http://tymoon.eu (<EMAIL>)
  Author: <NAME> <<EMAIL>>
  !-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta charset="utf-8" />
    <title>Verbose - About</title>
    <style type="text/css">
      code{font-family: Consolas, Inconsolata, monospace;}
      code.line{margin-left: 20px;}
      code.output{color: #882222;}
      code.output:before{content:"=> ";}
      code a{text-decoration: none; color: blue;}
      h3{display: inline-block;margin:0;padding:0;}
      .docs{list-style: none;}
      .docs li{margin-bottom: 20px;}
      .docs pre{margin: 0 0 0 10px; white-space: pre-wrap;}
    </style>
  </head>
  <body>
    <header>
      <img src="verbose-logo.png" alt="Verbose"/>
      <h1>v1.0.0</h1>
    </header>
    <div id="content">
      <article>
        <header><h2>What is Verbose?</h2></header>
        <p>
          Verbose is a logging framework for Common Lisp that aims to provide a good default setup as well as an extensible back-end to suit all your logging needs.
        </p>
      </article>
      <article>
        <header><h2>How To</h2></header>
        <p>
          Load Verbose with ASDF or Quicklisp.
        </p>
        <code class="line">(ql:quickload :verbose)</code>
        <p>
          By default, a new logging thread is already started and set up with a REPL-Faucet on the INFO level, that simply prints log messages from the INFO level and above to the standard output:
        </p>
        <code class="line">(v:info :TEST "Hello world!")</code><br />
        <code class="line output">LOG: 2014-04-01 13:32:49 [INFO ] &lt;TEST&gt;: Hello world!</code>
        <p>
          Each logging statement expects a category and a format string. Optionally you can pass in format arguments:
        </p>
        <code class="line">(v:info :TEST "2+2=~f" (+ 2 2))</code><br />
        <code class="line output">LOG: 2014-04-01 13:33:20 [INFO ] &lt;TEST&gt;: 2+2=4.0</code>
        <p>
          You can change the logging level of the REPL-Faucet easily. The available levels by default are <code>:FATAL :SEVERE :ERROR :WARN :INFO :DEBUG :TRACE</code>.
        </p>
        <code class="line">(setf (v:repl-level) :DEBUG)</code>
        <p>
          Using the <code>category-tree-filter</code> you can limit what kinds of categories are shown:
        </p>
        <code class="line">(v:add-repl-category :foo.bar.*)</code><br />
        <code class="line">(v:info :foo "Foo")</code><br />
        <code class="line output"> </code><br />
        <code class="line">(v:info :foo.bar.stuff "Foo")</code><br />
        <code class="line output">LOG: 2014-04-01 13:51:03 [INFO ] &lt;FOO.BAR.STUFF&gt;: Foo</code>
        <p>
          To extend Verbose you can use <a href="http://shinmera.github.io/piping">Piping</a> constructs. The <code>*global-controller*</code> in itself is a pipeline and can be used as such.
        </p>
        <p>
          Log message passing through the pipeline happens in a separate thread. If you create new pipe segments for your logging pipeline that need to access some form of shared variable, you can use <code>shared-instance</code>, which is <code>SETF</code>able. One shared-instance that is most likely of interest to everyone is saved under the symbol <code>*standard-output*</code>. Setting this anew is useful if you start a new REPL session and need to redirect logging to it. The <code>*standard-output*</code> and <code>*error-output*</code> shared-instances are handled specially and their values are bound to their respective special variables during message passing.
        </p>
        <code class="line">(setf (v:shared-instance '*standard-output*) *standard-output*)</code>
        <p>
          If you want to log to a file, you can either create your own custom file faucet, or use a preset one like the <code>rotating-log-faucet</code>:
        </p>
        <code class="line">(v:add-pipe (make-instance 'v:rotating-log-faucet :file #p"~/verbose.log" :interval (v:make-cron-interval "* * * * *")))</code>
        <p>
          Which creates a faucet that logs to a file with "verbose.log" suffix in your home directory, rotating every minute as per the CRON interval. In case you want to filter the message to a certain level or category instead, you can precede it by a filter:
        </p>
        <pre><code class="line">(v:add-pipe (make-instance 'piping:predicate-filter :predicate #'(lambda (message) (message-visible message :WARN)))
              (make-instance 'v:rotating-log-faucet :file #p"~/verbose.log" :interval (v:make-cron-interval "* * * * *")))</code></pre>
        <p>
          Using the piping constructs you can create complex logging systems or even change the pipeline on the fly. When you do, be aware that since the message passing happens in a separate thread, you need to acquire access to the pipeline first before modifying it:
        </p>
        <pre><code class="line">(v:with-controller-lock ()
    (piping:pipeline v:*global-controller*))</code></pre>
        <p>
          See the documentation of <a href="http://shinmera.github.io/piping">Piping</a> for more information.
        </p>
      </article>
      <article>
        <header><h2>Other Guff</h2></header>
        <p>
          Verbose is licensed under the <a href="http://opensource.org/licenses/Artistic-2.0">Artistic License 2.0</a> and ©2014 TymoonNET/NexT, <a href="http://shinmera.com"><NAME></a>.<br/>
          This library can be obtained via git on <a href="https://github.com/Shinmera/verbose.git">https://github.com/Shinmera/verbose.git</a>. For questions, patches or suggestions, please contact me via <a href="mailto:<EMAIL>">email</a> or write a <a href="https://github.com/Shinmera/verbose/issues/new">github issue</a>.
        </p>
      </article>
      <article>
        <header><h2><a name="VERBOSE" href="#VERBOSE">Verbose Package Index</a></h2></header>
        <ul id="docs" class="docs">
          <li id="template">
            <article>
              <a name="Foo" class="anchor"></a>
              <header>
                <span class="functype">test</span>
                <code>
                  <h3><a href="#Foo" class="funcname">Foo</a></h3>
                  <span class="funcargs">()</span>
{'fraction_non_alphanumeric': 0.1471953188054883, 'fraction_numerical': 0.01533494753833737, 'mean_word_length': 2.619204089083607, 'pattern_counts': {'":': 0, '<': 267, '<?xml version=': 0, '>': 268, 'https://': 3, 'lorem ipsum': 0, 'www.': 2, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5960562', 'n_tokens_mistral': 3253, 'n_tokens_neox': 3108, 'n_words': 968}