python-peps/pep-0337/index.html

282 lines
16 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="light dark">
<title>PEP 337 Logging Usage in the Standard Library | peps.python.org</title>
<link rel="shortcut icon" href="../_static/py.png">
<link rel="canonical" href="https://peps.python.org/pep-0337/">
<link rel="stylesheet" href="../_static/style.css" type="text/css">
<link rel="stylesheet" href="../_static/mq.css" type="text/css">
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" media="(prefers-color-scheme: light)" id="pyg-light">
<link rel="stylesheet" href="../_static/pygments_dark.css" type="text/css" media="(prefers-color-scheme: dark)" id="pyg-dark">
<link rel="alternate" type="application/rss+xml" title="Latest PEPs" href="https://peps.python.org/peps.rss">
<meta property="og:title" content='PEP 337 Logging Usage in the Standard Library | peps.python.org'>
<meta property="og:description" content="This PEP defines a standard for using the logging system (PEP 282) in the standard library.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://peps.python.org/pep-0337/">
<meta property="og:site_name" content="Python Enhancement Proposals (PEPs)">
<meta property="og:image" content="https://peps.python.org/_static/og-image.png">
<meta property="og:image:alt" content="Python PEPs">
<meta property="og:image:width" content="200">
<meta property="og:image:height" content="200">
<meta name="description" content="This PEP defines a standard for using the logging system (PEP 282) in the standard library.">
<meta name="theme-color" content="#3776ab">
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-sun-half" viewBox="0 0 24 24" pointer-events="all">
<title>Following system colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="9"></circle>
<path d="M12 3v18m0-12l4.65-4.65M12 14.3l7.37-7.37M12 19.6l8.85-8.85"></path>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24" pointer-events="all">
<title>Selected dark colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z"></path>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24" pointer-events="all">
<title>Selected light colour scheme</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
</svg>
<script>
document.documentElement.dataset.colour_scheme = localStorage.getItem("colour_scheme") || "auto"
</script>
<section id="pep-page-section">
<header>
<h1>Python Enhancement Proposals</h1>
<ul class="breadcrumbs">
<li><a href="https://www.python.org/" title="The Python Programming Language">Python</a> &raquo; </li>
<li><a href="../pep-0000/">PEP Index</a> &raquo; </li>
<li>PEP 337</li>
</ul>
<button id="colour-scheme-cycler" onClick="setColourScheme(nextColourScheme())">
<svg aria-hidden="true" class="colour-scheme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg aria-hidden="true" class="colour-scheme-icon-when-light"><use href="#svg-sun"></use></svg>
<span class="visually-hidden">Toggle light / dark / auto colour theme</span>
</button>
</header>
<article>
<section id="pep-content">
<h1 class="page-title">PEP 337 Logging Usage in the Standard Library</h1>
<dl class="rfc2822 field-list simple">
<dt class="field-odd">Author<span class="colon">:</span></dt>
<dd class="field-odd">Michael P. Dubner &lt;dubnerm&#32;&#97;t&#32;mindless.com&gt;</dd>
<dt class="field-even">Status<span class="colon">:</span></dt>
<dd class="field-even"><abbr title="Inactive draft that may be taken up again at a later time">Deferred</abbr></dd>
<dt class="field-odd">Type<span class="colon">:</span></dt>
<dd class="field-odd"><abbr title="Normative PEP with a new feature for Python, implementation change for CPython or interoperability standard for the ecosystem">Standards Track</abbr></dd>
<dt class="field-even">Created<span class="colon">:</span></dt>
<dd class="field-even">02-Oct-2004</dd>
<dt class="field-odd">Python-Version<span class="colon">:</span></dt>
<dd class="field-odd">2.5</dd>
<dt class="field-even">Post-History<span class="colon">:</span></dt>
<dd class="field-even">10-Nov-2004</dd>
</dl>
<hr class="docutils" />
<section id="contents">
<details><summary>Table of Contents</summary><ul class="simple">
<li><a class="reference internal" href="#abstract">Abstract</a></li>
<li><a class="reference internal" href="#pep-deferral">PEP Deferral</a></li>
<li><a class="reference internal" href="#rationale">Rationale</a></li>
<li><a class="reference internal" href="#proposal">Proposal</a></li>
<li><a class="reference internal" href="#module-list">Module List</a></li>
<li><a class="reference internal" href="#doubtful-modules">Doubtful Modules</a></li>
<li><a class="reference internal" href="#guidelines-for-logging-usage">Guidelines for Logging Usage</a></li>
<li><a class="reference internal" href="#references">References</a></li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
</details></section>
<section id="abstract">
<h2><a class="toc-backref" href="#abstract" role="doc-backlink">Abstract</a></h2>
<p>This PEP defines a standard for using the logging system (<a class="pep reference internal" href="../pep-0282/" title="PEP 282 A Logging System">PEP 282</a>) in the
standard library.</p>
<p>Implementing this PEP will simplify development of daemon
applications. As a downside this PEP requires slight
modifications (however in a back-portable way) to a large number
of standard modules.</p>
<p>After implementing this PEP one can use following filtering
scheme:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;py.BaseHTTPServer&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">FATAL</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="pep-deferral">
<h2><a class="toc-backref" href="#pep-deferral" role="doc-backlink">PEP Deferral</a></h2>
<p>Further exploration of the concepts covered in this PEP has been deferred
for lack of a current champion interested in promoting the goals of the
PEP and collecting and incorporating feedback, and with sufficient
available time to do so effectively.</p>
</section>
<section id="rationale">
<h2><a class="toc-backref" href="#rationale" role="doc-backlink">Rationale</a></h2>
<p>There are a couple of situations when output to stdout or stderr
is impractical:</p>
<ul class="simple">
<li>Daemon applications where the framework doesnt allow the
redirection of standard output to some file, but assumes use of
some other form of logging. Examples are syslog under *nixes
and EventLog under WinNT+.</li>
<li>GUI applications which want to output every new log entry in
separate pop-up window (i.e. fading OSD).</li>
</ul>
<p>Also sometimes applications want to filter output entries based on
their source or severity. This requirement cant be implemented
using simple redirection.</p>
<p>Finally sometimes output needs to be marked with event timestamps,
which can be accomplished with ease using the logging system.</p>
</section>
<section id="proposal">
<h2><a class="toc-backref" href="#proposal" role="doc-backlink">Proposal</a></h2>
<p>Every module usable for daemon and GUI applications should be
rewritten to use the logging system instead of <code class="docutils literal notranslate"><span class="pre">print</span></code> or
<code class="docutils literal notranslate"><span class="pre">sys.stdout.write</span></code>.</p>
<p>There should be code like this included in the beginning of every
modified module:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">logging</span>
<span class="n">_log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;py.&lt;module-name&gt;&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>A prefix of <code class="docutils literal notranslate"><span class="pre">py.</span></code> <a class="footnote-reference brackets" href="#id2" id="id1">[2]</a> must be used by all modules included in the
standard library distributed along with Python, and only by such
modules (unverifiable). The use of <code class="docutils literal notranslate"><span class="pre">_log</span></code> is intentional as we
dont want to auto-export it. For modules that use log only in
one class a logger can be created inside the class definition as
follows:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">XXX</span><span class="p">:</span>
<span class="n">__log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;py.&lt;module-name&gt;&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>Then this class can create access methods to log to this private
logger.</p>
<p>So <code class="docutils literal notranslate"><span class="pre">print</span></code> and <code class="docutils literal notranslate"><span class="pre">sys.std{out|err}.write</span></code> statements should be
replaced with <code class="docutils literal notranslate"><span class="pre">_log.{debug|info}</span></code>, and <code class="docutils literal notranslate"><span class="pre">traceback.print_exception</span></code>
with <code class="docutils literal notranslate"><span class="pre">_log.exception</span></code> or sometimes <code class="docutils literal notranslate"><span class="pre">_log.debug('...',</span> <span class="pre">exc_info=1)</span></code>.</p>
</section>
<section id="module-list">
<h2><a class="toc-backref" href="#module-list" role="doc-backlink">Module List</a></h2>
<p>Here is a (possibly incomplete) list of modules to be reworked:</p>
<ul class="simple">
<li>asyncore (dispatcher.log, dispatcher.log_info)</li>
<li>BaseHTTPServer (BaseHTTPRequestHandler.log_request,
BaseHTTPRequestHandler.log_error,
BaseHTTPRequestHandler.log_message)</li>
<li>cgi (possibly - is cgi.log used by somebody?)</li>
<li>ftplib (if FTP.debugging)</li>
<li>gopherlib (get_directory)</li>
<li>httplib (HTTPResponse, HTTPConnection)</li>
<li>ihooks (_Verbose)</li>
<li>imaplib (IMAP4._mesg)</li>
<li>mhlib (MH.error)</li>
<li>nntplib (NNTP)</li>
<li>pipes (Template.makepipeline)</li>
<li>pkgutil (extend_path)</li>
<li>platform (_syscmd_ver)</li>
<li>poplib (if POP3._debugging)</li>
<li>profile (if Profile.verbose)</li>
<li>robotparser (_debug)</li>
<li>smtplib (if SGMLParser.verbose)</li>
<li>shlex (if shlex.debug)</li>
<li>smtpd (SMTPChannel/PureProxy where print &gt;&gt; DEBUGSTREAM)</li>
<li>smtplib (if SMTP.debuglevel)</li>
<li>SocketServer (BaseServer.handle_error)</li>
<li>telnetlib (if Telnet.debuglevel)</li>
<li>threading? (_Verbose._note, Thread.__bootstrap)</li>
<li>timeit (Timer.print_exc)</li>
<li>trace</li>
<li>uu (decode)</li>
</ul>
<p>Additionally there are a couple of modules with commented debug
output or modules where debug output should be added. For
example:</p>
<ul class="simple">
<li>urllib</li>
</ul>
<p>Finally possibly some modules should be extended to provide more
debug information.</p>
</section>
<section id="doubtful-modules">
<h2><a class="toc-backref" href="#doubtful-modules" role="doc-backlink">Doubtful Modules</a></h2>
<p>Listed here are modules that the community will propose for
addition to the module list and modules that the community say
should be removed from the module list.</p>
<ul class="simple">
<li>tabnanny (check)</li>
</ul>
</section>
<section id="guidelines-for-logging-usage">
<h2><a class="toc-backref" href="#guidelines-for-logging-usage" role="doc-backlink">Guidelines for Logging Usage</a></h2>
<p>Also we can provide some recommendation to authors of library
modules so they all follow the same format of naming loggers. I
propose that non-standard library modules should use loggers named
after their full names, so a module “spam” in sub-package “junk”
of package “dummy” will be named “dummy.junk.spam” and, of course,
the <code class="docutils literal notranslate"><span class="pre">__init__</span></code> module of the same sub-package will have the logger
name “dummy.junk”.</p>
</section>
<section id="references">
<h2><a class="toc-backref" href="#references" role="doc-backlink">References</a></h2>
<aside class="footnote-list brackets">
<aside class="footnote brackets" id="id2" role="doc-footnote">
<dt class="label" id="id2">[<a href="#id1">2</a>]</dt>
<dd><a class="reference external" href="https://mail.python.org/pipermail/python-dev/2004-October/049282.html">https://mail.python.org/pipermail/python-dev/2004-October/049282.html</a></aside>
</aside>
</section>
<section id="copyright">
<h2><a class="toc-backref" href="#copyright" role="doc-backlink">Copyright</a></h2>
<p>This document has been placed in the public domain.</p>
</section>
</section>
<hr class="docutils" />
<p>Source: <a class="reference external" href="https://github.com/python/peps/blob/main/peps/pep-0337.rst">https://github.com/python/peps/blob/main/peps/pep-0337.rst</a></p>
<p>Last modified: <a class="reference external" href="https://github.com/python/peps/commits/main/peps/pep-0337.rst">2023-09-09 17:39:29 GMT</a></p>
</article>
<nav id="pep-sidebar">
<h2>Contents</h2>
<ul>
<li><a class="reference internal" href="#abstract">Abstract</a></li>
<li><a class="reference internal" href="#pep-deferral">PEP Deferral</a></li>
<li><a class="reference internal" href="#rationale">Rationale</a></li>
<li><a class="reference internal" href="#proposal">Proposal</a></li>
<li><a class="reference internal" href="#module-list">Module List</a></li>
<li><a class="reference internal" href="#doubtful-modules">Doubtful Modules</a></li>
<li><a class="reference internal" href="#guidelines-for-logging-usage">Guidelines for Logging Usage</a></li>
<li><a class="reference internal" href="#references">References</a></li>
<li><a class="reference internal" href="#copyright">Copyright</a></li>
</ul>
<br>
<a id="source" href="https://github.com/python/peps/blob/main/peps/pep-0337.rst">Page Source (GitHub)</a>
</nav>
</section>
<script src="../_static/colour_scheme.js"></script>
<script src="../_static/wrap_tables.js"></script>
<script src="../_static/sticky_banner.js"></script>
</body>
</html>