<h4>快速开始</h4> <p>日志级别 <br />权值</p> <p>CRITICAL <br />50</p> <p>ERROR <br />40</p> <p>WARNING <br />30</p> <p>INFO <br />20</p> <p>DEBUG <br />10</p> <p>NOTSET <br />0</p> <p>除<code>NOTSET</code>外,<code>logging</code>模块提供了与级别名称对应的小写函数以便快速调用。 <br />样例代码:</p> <pre><code>import logging
def main(): logging.critical("critical") logging.error("error") logging.warning("warning") logging.info("info") logging.debug("debug")
if name == 'main': main()</code></pre>
<p>输出:</p>
<blockquote> <p>CRITICAL:root:critical <br />ERROR:root:error
<br />WARNING:root:warning</p>
</blockquote>
<p>从输出可以注意到<code>WARNING</code>以下级别的信息并没有打印出来。
<br />原因在于<code>logging</code>默认的级别是<code>WARNING</code>,可以通过<code>logging.basicConfig</code>函数或修改默认<code>Logger</code>对象来改变级别。
<br />默认输出格式为:</p>
<blockquote> <p>级别:Logger对象名:日志</p> </blockquote>
<h4>basicConfig函数</h4>
<p>basicConfig函数可以快速定制默认<code>Logger</code>对象。</p>
<h5>参数名</h5>
<h6>filename</h6>
<p>指定日志文件的名称。</p>
<h6>filemode</h6>
<p>指定日志文件的打开方式,有<code>w</code>和<code>a</code>两个选项,默认为<code>a</code>。</p>
<h6>format</h6>
<p>指定输出的格式和内容,格式为:</p>
<blockquote> <p>%(名称)格式控制字符串</p> </blockquote>
<p>格式列表与其对应的类型</p>
<ul> <li><strong>levelno</strong> <code>s</code>: 打印日志级别的数值 </li>
<li><strong>levelname</strong> <code>s</code>: 打印日志级别名称 </li>
<li><strong>pathname</strong> <code>s</code>: 打印当前执行程序的路径,其实就是<code>sys.argv[0]</code></li>
<li><strong>filename</strong> <code>s</code>: 打印当前执行程序名 </li>
<li><strong>funcName</strong> <code>s</code>: 打印日志的当前函数 </li>
<li><strong>lineno</strong> <code>d</code>: 打印日志的当前行号 </li>
<li><strong>asctime</strong> <code>s</code>: 打印日志的时间 </li>
<li><strong>thread</strong> <code>d</code>: 打印线程ID </li>
<li><strong>threadName</strong> <code>s</code>: 打印线程名称 </li>
<li><strong>process</strong> <code>d</code>: 打印进程ID </li>
<li><strong>message</strong> <code>s</code>: 打印日志信息</li> </ul>
<h6>datefmt</h6>
<p>指定时间格式,格式同<code>time.strftime</code>,影响<code>format</code>中<code>asctime</code>的格式。</p>
<h6>level</h6>
<p>设置日志级别,默认为<code>logging.WARNING</code>。</p>
<h6>stream</h6>
<p>指定将日志的输出流,可以指定输出到<code>sys.stderr</code>,<code>sys.stdout</code>或者文件,默认输出到<code>sys.stderr</code>,当<code>stream</code>和<code>filename</code>同时指定时,<code>stream</code>被忽略。</p>
<h4>Logger对象</h4>
<p><code>logging.getLogger</code>函数返回一个<code>Logger</code>对象,函数接收一个字符串用以描述希望返回的<code>Logger</code>对象的名称,相同的名称全局唯一对应一个<code>Logger</code>对象。缺省参数为<code>root</code>,返回默认<code>Logger</code>对象。</p>
<h5>Logger对象的方法</h5>
<h6>setLevel</h6>
<p>设置该<code>Logger</code>对象的记录级别。
<br />参数:</p>
<ol> <li><strong>level</strong>:级别枚举</li> </ol>
<h6>log</h6>
<p>打印指定级别的日志,须先设置handler。 <br />参数:</p>
<ol> <li><strong>level</strong>:级别枚举。 </li>
<li><strong>msg</strong>:希望打印的对象,会自动转为字符串。如果参数已是字符串,可以是格式字符串。 </li>
<li><strong>*args</strong>:与msg结合成待打印内容<code>(msg % args)</code>。</li> </ol>
<h6>critical / error / warning / info / debug</h6>
<p>指定对应级别的调用<code>log</code>。
<br />参数:</p>
<ol> <li><strong>msg</strong>:希望打印的对象,会自动转为字符串。如果参数已是字符串,可以是格式字符串。 </li>
<li><strong>*args</strong>:与msg结合成待打印内容(msg % args)。</li> </ol>
<h6>addHandler</h6>
<p>给<code>Logger</code>对象添加处理器,可添加多个。
<br />参数:</p>
<ol> <li><strong>hdlr</strong>:处理器对象。</li> </ol>
<h6>removeHandler</h6>
<p>移除<code>Logger</code>对象的指定处理器。
<br />参数:</p>
<ol> <li><strong>hdlr</strong>:处理器对象。</li> </ol>
<h4>日志处理器</h4>
<p>处理器用来扩展<code>Logger</code>对象,通过<code>logger.addHandler(hdlr)</code>方法加载到<code>Logger</code>对象。</p>
<h5>模块集成处理器对象</h5>
<ul> <li><strong>logging.StreamHandler</strong>:日志输出到流,可以是<code>sys.stderr</code>、<code>sys.stdout</code>或者文件。 </li>
<li><strong>logging.FileHandler</strong>:日志输出到文件。 </li>
<li><strong>logging.handlers.SocketHandler</strong>:远程输出日志到TCP/IP sockets。 </li>
<li><strong>logging.handlers.DatagramHandler</strong>: 远程输出日志到UDP sockets。 </li>
<li><strong>logging.handlers.SMTPHandler</strong>: 远程输出日志到邮件地址。 </li>
<li><strong>logging.handlers.SysLogHandler</strong>:日志输出到syslog。 </li>
<li><strong>logging.handlers.NTEventLogHandler</strong>:远程输出日志到Windows NT/2000/XP的事件日志。 </li>
<li><strong>logging.handlers.MemoryHandler</strong>:日志输出到内存中的制定buffer。 </li>
<li><strong>logging.handlers.HTTPHandler</strong>:通过<code>GET</code>或<code>POST</code>远程输出到HTTP服务器。 </li>
<li><strong>logging.handlers.BaseRotatingHandler</strong>:日志回滚。 </li>
<li><strong>logging.handlers.RotatingFileHandler</strong>:日志回滚,实际用。 </li>
<li><strong>logging.handlers.TimedRotatingFileHandler</strong>:日志回滚,实际用。</li> </ul>
<h5>处理器使用简示</h5>
<h6>logging.StreamHandler</h6>
<p><code>logging.StreamHandler</code>对象构造参数缺省为<code>sys.stdout</code>,参数可以接收一个流对象(<code>sys.stderr</code>、<code>sys.stdout</code>或者文件)。</p>
<pre><code>sh1 = logging.StreamHandler() sh2 = logging.StreamHandler(sys.stdout) sh3 = logging.StreamHandler(open(file_path,"w")) # w 和 a 皆可</code></pre>
<p><code>logging.StreamHandler</code> 对象能够设置记录的日志级别,但实际输出受<code>Logger</code>对象的级别限制。<code>Logger</code>对象的级别制约着消息的派发,<code>Handler</code>对象的级别制约着记录。</p>
<pre><code>sh2 = logging.setLevel(logging.WARING) sh3 = logging.setLevel(logging.INFO)</code></pre>
<p><code>logging.StreamHandler</code> 对象能够自定义输出格式。</p>
<pre><code>fmt = logging.Formatter("%(name)s:%(levelname)s:%(message)s") sh1.setFormatter(fmt)</code></pre>
<h4>更多资料</h4>
<ul> <li><a href="http://docs.python.org/2/library/logging.html">官方文档</a></li>
<li><a href="http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html">python 的日志logging模块学习</a></li>
<li><a href="http://blog.youkuaiyun.com/fxjtoday/article/details/6307285">Python标准模块logging</a></li> </ul>
<hr />
<blockquote> <p>@<a href="http://mrlyc.blogspot.com/">LYC</a>
<br />转载请注明<a href="http://mrlyc.blogspot.com/">出处</a>。</p></blockquote>