/blog/2012/01/15/django-logging/index.html
HTML | 239 lines | 202 code | 35 blank | 2 comment | 0 complexity | a5700043049a5301dc670b69d0f27cba MD5 | raw file
- <!DOCTYPE html>
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
- <title>Django logging — projectchilli.com</title>
-
- <link rel="stylesheet" href="../../../../../_static/basic.css" type="text/css" />
- <link rel="stylesheet" href="../../../../../_static/pygments.css" type="text/css" />
- <link rel="stylesheet" href="../../../../../_static/my-styles.css" type="text/css" />
- <link rel="stylesheet" href="../../../../../_static/bootswatch-3.3.6/united/bootstrap.min.css" type="text/css" />
- <link rel="stylesheet" href="../../../../../_static/bootstrap-sphinx.css" type="text/css" />
-
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../../../',
- VERSION: '0.4.9',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true
- };
- </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/jquery-1.11.0.min.js"></script>
- <script type="text/javascript" src="../../../../../_static/js/jquery-fix.js"></script>
- <script type="text/javascript" src="../../../../../_static/bootstrap-3.3.6/js/bootstrap.min.js"></script>
- <script type="text/javascript" src="../../../../../_static/bootstrap-sphinx.js"></script>
- <link rel="author" title="About these documents" href="../../../../../about.html" />
- <link rel="top" title="projectchilli.com" href="../../../../../index.html" />
- <meta charset='utf-8'>
- <meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
- <meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
- <meta name="apple-mobile-web-app-capable" content="yes">
- </head>
- <body>
- <div id="navbar" class="navbar navbar-default navbar-fixed-top">
- <div class="container">
- <div class="navbar-header">
- <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
- <a class="navbar-brand" href="../../../../../index.html">
- projectchilli.com</a>
- <!-- <span class="navbar-text navbar-version pull-left"><b>0.4.9</b></span> -->
- </div>
- <div class="collapse navbar-collapse nav-collapse">
- <ul class="nav navbar-nav">
-
-
- <li class="dropdown globaltoc-container">
- <a role="button"
- id="dLabelGlobalToc"
- data-toggle="dropdown"
- data-target="#"
- href="../../../../../index.html">Site <b class="caret"></b></a>
- <ul class="dropdown-menu globaltoc"
- role="menu"
- aria-labelledby="dLabelGlobalToc"></ul>
- </li>
-
- <li class="dropdown">
- <a role="button"
- id="dLabelLocalToc"
- data-toggle="dropdown"
- data-target="#"
- href="#">Page <b class="caret"></b></a>
- <ul class="dropdown-menu localtoc"
- role="menu"
- aria-labelledby="dLabelLocalToc"><ul>
- <li><a class="reference internal" href="#">Django logging</a><ul>
- <li><a class="reference internal" href="#set-debug-to-false-in-your-settings-py-file">1. Set DEBUG to False in your settings.py file:</a></li>
- <li><a class="reference internal" href="#update-the-logging-section-in-settings-py">2. Update the logging section in settings.py:</a></li>
- <li><a class="reference internal" href="#make-sure-you-have-a-500-html-template-in-place">3. Make sure you have a 500.html template in place.</a></li>
- <li><a class="reference internal" href="#the-added-bonus">4. The added bonus....</a></li>
- <li><a class="reference internal" href="#then-use-code-like-this-to-log-messages">5. Then use code like this to log messages:</a></li>
- </ul>
- </li>
- </ul>
- </ul>
- </li>
-
-
-
-
-
-
-
-
-
-
- <li class="hidden-sm">
- <div id="sourcelink">
- <a href="../../../../../_sources/blog/2012/01/15/django-logging/index.txt"
- rel="nofollow">Source</a>
- </div></li>
-
- </ul>
-
-
- <form class="navbar-form navbar-right" action="../../../../../search.html" method="get">
- <div class="form-group">
- <input type="text" name="q" class="form-control" placeholder="Search" />
- </div>
- <input type="hidden" name="check_keywords" value="yes" />
- <input type="hidden" name="area" value="default" />
- </form>
-
- </div>
- </div>
- </div>
- <div class="container">
- <div class="row">
- <div class="col-md-12 content">
-
- <div class="section" id="django-logging">
- <h1>Django logging</h1>
- <p>Date: <strong>2012-01-15</strong></p>
- <div class="admonition note">
- <p class="first admonition-title">Note</p>
- <p class="last"><strong>2016-06-29</strong> - I’ll be writing an updated version of this post very soon.</p>
- </div>
- <p>I frequently write small APIs using a python web framework called django, but when making test calls to the API with curl (or even urllib2) getting the massive DEBUG=True exception page back can be pain. So by using the logging framework you can set DEBUG to False and watch for your exceptions in a log. Here’s how:</p>
- <div class="section" id="set-debug-to-false-in-your-settings-py-file">
- <h2>1. Set DEBUG to False in your settings.py file:</h2>
- <div class="code python highlight-python"><div class="highlight"><pre><span></span><span class="n">DEBUG</span><span class="o">=</span><span class="bp">False</span>
- </pre></div>
- </div>
- </div>
- <div class="section" id="update-the-logging-section-in-settings-py">
- <h2>2. Update the logging section in settings.py:</h2>
- <div class="code python highlight-python"><div class="highlight"><pre><span></span><span class="n">APPHOME</span><span class="o">=</span><span class="s2">"/home/pfarmer/projectname"</span>
- <span class="n">LOGGING</span> <span class="o">=</span> <span class="p">{</span>
- <span class="s1">'version'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
- <span class="s1">'disable_existing_loggers'</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
- <span class="s1">'formatters'</span><span class="p">:</span> <span class="p">{</span>
- <span class="s1">'standard'</span><span class="p">:</span> <span class="p">{</span>
- <span class="s1">'format'</span><span class="p">:</span> <span class="s1">'</span><span class="si">%(asctime)s</span><span class="s1"> [</span><span class="si">%(levelname)s</span><span class="s1">] </span><span class="si">%(name)s</span><span class="s1">: </span><span class="si">%(message)s</span><span class="s1">'</span>
- <span class="p">},</span>
- <span class="p">},</span>
- <span class="s1">'handlers'</span><span class="p">:</span> <span class="p">{</span>
- <span class="s1">'default'</span><span class="p">:</span> <span class="p">{</span>
- <span class="s1">'level'</span><span class="p">:</span><span class="s1">'DEBUG'</span><span class="p">,</span>
- <span class="s1">'class'</span><span class="p">:</span><span class="s1">'logging.handlers.RotatingFileHandler'</span><span class="p">,</span>
- <span class="s1">'filename'</span><span class="p">:</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">/logs/default.log'</span> <span class="o">%</span> <span class="n">APPHOME</span><span class="p">,</span>
- <span class="s1">'maxBytes'</span><span class="p">:</span> <span class="mi">1024</span><span class="o">*</span><span class="mi">1024</span><span class="o">*</span><span class="mi">5</span><span class="p">,</span> <span class="c1"># 5 MB</span>
- <span class="s1">'backupCount'</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
- <span class="s1">'formatter'</span><span class="p">:</span><span class="s1">'standard'</span><span class="p">,</span>
- <span class="p">},</span>
- <span class="s1">'request_handler'</span><span class="p">:</span> <span class="p">{</span>
- <span class="s1">'level'</span><span class="p">:</span><span class="s1">'DEBUG'</span><span class="p">,</span>
- <span class="s1">'class'</span><span class="p">:</span><span class="s1">'logging.handlers.RotatingFileHandler'</span><span class="p">,</span>
- <span class="s1">'filename'</span><span class="p">:</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">/logs/django_request.log'</span> <span class="o">%</span> <span class="n">APPHOME</span><span class="p">,</span>
- <span class="s1">'maxBytes'</span><span class="p">:</span> <span class="mi">1024</span><span class="o">*</span><span class="mi">1024</span><span class="o">*</span><span class="mi">5</span><span class="p">,</span> <span class="c1"># 5 MB</span>
- <span class="s1">'backupCount'</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
- <span class="s1">'formatter'</span><span class="p">:</span><span class="s1">'standard'</span><span class="p">,</span>
- <span class="p">},</span>
- <span class="p">},</span>
- <span class="s1">'loggers'</span><span class="p">:</span> <span class="p">{</span>
- <span class="s1">''</span><span class="p">:</span> <span class="p">{</span>
- <span class="s1">'handlers'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'default'</span><span class="p">],</span>
- <span class="s1">'level'</span><span class="p">:</span> <span class="s1">'DEBUG'</span><span class="p">,</span>
- <span class="s1">'propagate'</span><span class="p">:</span> <span class="bp">True</span>
- <span class="p">},</span>
- <span class="s1">'django.request'</span><span class="p">:</span> <span class="p">{</span> <span class="c1"># Stop SQL debug from logging to main logger</span>
- <span class="s1">'handlers'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'request_handler'</span><span class="p">],</span>
- <span class="s1">'level'</span><span class="p">:</span> <span class="s1">'DEBUG'</span><span class="p">,</span>
- <span class="s1">'propagate'</span><span class="p">:</span> <span class="bp">False</span>
- <span class="p">},</span>
- <span class="p">}</span>
- <span class="p">}</span>
- </pre></div>
- </div>
- <p>Now when some code causes an exception, the traceback should appear in <span class=”bold”>django_request.log</span></p>
- </div>
- <div class="section" id="make-sure-you-have-a-500-html-template-in-place">
- <h2>3. Make sure you have a 500.html template in place.</h2>
- </div>
- <div class="section" id="the-added-bonus">
- <h2>4. The added bonus....</h2>
- <p>The added bonus is you can use the standard python logging module to log during view execution, add the following to each of your views.py:</p>
- <div class="code python highlight-python"><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="n">__name__</span><span class="p">)</span>
- </pre></div>
- </div>
- </div>
- <div class="section" id="then-use-code-like-this-to-log-messages">
- <h2>5. Then use code like this to log messages:</h2>
- <div class="code python highlight-python"><div class="highlight"><pre><span></span>log.debug("API login attempt for %s" request.GET['user'])
- </pre></div>
- </div>
- <p>This will appear in the log like this::</p>
- <div class="highlight-python"><div class="highlight"><pre><span></span>2011-11-16 23:02:32,339 [DEBUG] api.views: API login attempt for pfarmer
- </pre></div>
- </div>
- </div>
- </div>
- </div>
-
- </div>
- </div>
- <footer class="footer">
- <div class="container">
- <p class="pull-right">
- <a href="#">Back to top</a>
-
- </p>
- <p>
- © Copyright 2011-2016, Peter Farmer.<br/>
- Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.1.<br/>
- </p>
- </div>
- </footer>
- <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','https://www.google-analytics.com/analytics.js','ga');
- ga('create', 'UA-322710-20', 'auto');
- ga('send', 'pageview');
- </script>
- </body>
- </html>