编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

python logging 随记(python loge)

wxchong 2024-10-20 15:21:50 开源技术 55 ℃ 0 评论

本文主要是对logging的注意点做一个随笔记录


logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件logging.FileHandler: 日志输出到文件

日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandlerlogging.handlers.BaseRotatingHandlerlogging.handlers.RotatingFileHandlerlogging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 远程输出日志到TCP/IP socketslogging.handlers.DatagramHandler: 远程输出日志到UDP socketslogging.handlers.SMTPHandler: 远程输出日志到邮件地址logging.handlers.SysLogHandler: 日志输出到sysloglogging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志logging.handlers.MemoryHandler: 日志输出到内存中的制定bufferlogging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器

logging.basicConfig函数各参数:filename: 指定日志文件名filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示: %(levelno)s: 打印日志级别的数值 %(levelname)s: 打印日志级别名称 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0] %(filename)s: 打印当前执行程序名 %(funcName)s: 打印日志的当前函数 %(lineno)d: 打印日志的当前行号 %(asctime)s: 打印日志的时间 %(thread)d: 打印线程ID %(threadName)s: 打印线程名称 %(process)d: 打印进程ID %(message)s: 打印日志信息datefmt: 指定时间格式,同time.strftime()level: 设置日志级别,默认为logging.WARNINGstream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略


logging.handlers.TimedRotatingFileHandler(filename[, when[, interval[, backupCount[, encoding[, delay[, utc]]]]]])

与RotatingFileHandler相同, 但文件的备份是由时间而非大小来控制的。

interval是一个数字, 而when是指定单元的字符串。when的可取值是's’(秒)、'M’(分)、'H’(小时)、'D’(天)、'w’(周)和'midnight’(在午夜备份)。例如, 将interval置为3同时将when置为'D’效果是每三天对日志进行一次备份。backupCount指定要保存的备份文件的最大数量。utc是一个布尔标志, 用于确定是使用本地时间(默认值)还是UTC时间。


用python中的logging库实现日志滚动和过期日志删除。

logging库提供了两个可以用于日志滚动的class,一个是RotatingFileHandler,它主要是根据日志文件的大小进行滚动,另一个是TimeRotatingFileHandler,它主要是根据时间进行滚动。在实际应用中,我们通常根据时间进行滚动,因此,本文中主要介绍TimeRotaingFileHandler的使用方法(RotatingFileHandler一样)。代码示例如下:

<code class="hljs python has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#!/usr/bin/env python</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#_*_coding:utf-8_*_</span>
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># vim : set expandtab ts=4 sw=4 sts=4 tw=100 :</span>

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> logging
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> time
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> re
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">from</span> logging.handlers <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> TimedRotatingFileHandler
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">from</span> logging.handlers <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> RotatingFileHandler

<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">main</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>:</span>
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#日志打印格式</span>
    log_fmt = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s'</span>
    formatter = logging.Formatter(log_fmt)
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#创建TimedRotatingFileHandler对象</span>
    log_file_handler = TimedRotatingFileHandler(filename=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ds_update"</span>, when=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"M"</span>, interval=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>, backupCount=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#log_file_handler.suffix = "%Y-%m-%d_%H-%M.log"</span>
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#log_file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}.log#34;)</span>
    log_file_handler.setFormatter(formatter)    
    logging.basicConfig(level=logging.INFO)
    log = logging.getLogger()
    log.addHandler(log_file_handler)
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#循环打印日志</span>
    log_content = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"test log"</span>
    count = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> count < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">30</span>:
        log.error(log_content)
        time.sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20</span>)
        count = count + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>
    log.removeHandler(log_file_handler)


<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> __name__ == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"__main__"</span>:
    main()</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul>
  • filename:日志文件名的prefix;
  • when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下:
    “S”: Seconds
    “M”: Minutes
    “H”: Hours
    “D”: Days
    “W”: Week day (0=Monday)
    “midnight”: Roll over at midnight
  • interval: 滚动周期,单位有when指定,比如:when=’D’,interval=1,表示每天产生一个日志文件;
  • backupCount: 表示日志文件的保留个数;

除了上述参数之外,TimedRotatingFileHandler还有两个比较重要的成员变量,它们分别是suffix和extMatch。suffix是指日志文件名的后缀,suffix中通常带有格式化的时间字符串,filename和suffix由“.”连接构成文件名(例如:filename=“runtime”, suffix=“%Y-%m-%d.log”,生成的文件名为runtime.2015-07-06.log)。extMatch是一个编译好的正则表达式,用于匹配日志文件名的后缀,它必须和suffix是匹配的,如果suffix和extMatch匹配不上的话,过期的日志是不会被删除的。比如,suffix=“%Y-%m-%d.log”, extMatch的只应该是re.compile(r”^\d{4}-\d{2}-\d{2}.log$”)。默认情况下,在TimedRotatingFileHandler对象初始化时,suffxi和extMatch会根据when的值进行初始化: ‘S’: suffix=”%Y-%m-%d_%H-%M-%S”, extMatch=r”\^d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}”; ‘M’:suffix=”%Y-%m-%d_%H-%M”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}”; ‘H’:suffix=”%Y-%m-%d_%H”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}”; ‘D’:suffxi=”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”; ‘MIDNIGHT’:”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”; ‘W’:”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;

如果对日志文件名没有特殊要求的话,可以不用设置suffix和extMatch,如果需要,一定要让它们匹配上。


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表