• day16-python常用的内置模块2


    logging模块的使用

    一:日志是我们排查问题的关键利器,写好日志记录,当我们发生问题时,可以快速定位代码范围进行修改。Python有给我们开发者们提供好的日志模块,下面我们就来介绍一下logging模块:

    首先,我们先来看一个例子:

    import logging
    logging.debug("this is debug message")
    logging.info("this is info message")
    logging.warning("this is warning message")
    logging.error("this is error message")
    logging.critical("this is critical message")
    
    结果:
    WARNING:root:this is warning message
    ERROR:root:this is error message
    CRITICAL:root:this is critical message

    解释:我们写了三句话,但是在屏幕上没有打印debug和info,这个是怎么回事呢?

    默认情况下,logging将日志打印到屏幕,日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

      ● DEBUG:详细的信息,通常只出现在诊断问题上。

      ● INFO:确认一切按预期运行

      ● WARNING:一个警告,可能会有一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作

      ● ERROR:个更严重的问题,软件没能执行一些功能

      ● CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行

    而默认logging默认的日志级别是info,一般基本上所有的程序都是这个级别,有助于我们排查问题,但是当发生问题,我们没法定位到问题,很多情况下我们需要把日志级别提升到debug级别,那又怎么办呢?

    二:将日志同时输出到文件和屏幕

    现实工作中,往往我们是要把日志写在日志文件中的,那怎么做呢?看如下代码:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    import logging
    logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',datefmt=' %Y/%m/%d %H:%M:%S', filename='log.log', filemode='w')
    logger = logging.getLogger(__name__)
    logging.debug('This is debug message')
    logging.info('This is info message')
    logging.warning('This is warning message')
    结果:
    在当前文件新增了一个log.log文件,文件的内容如下:
    2017/04/26 13:57:11 test.py[line:10] DEBUG This is debug message
    2017/04/26 13:57:11 test.py[line:11] INFO This is info message
    2017/04/26 13:57:11 test.py[line:12] WARNING This is warning message

    解释:

    主要是通过logging.basicConfig函数进行操作,现在我们来介绍一下该函数参数的用法:

    level: 设置日志级别,默认为logging.WARNING

    filename: 指定日志文件名。

    filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a'

    format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:

    %(levelname)s: 打印日志级别名称

      %(filename)s: 打印当前执行程序名

     %(funcName)s: 打印日志的当前函数

     %(lineno)d: 打印日志的当前行号

     %(asctime)s: 打印日志的时间

     %(thread)d: 打印线程ID

      %(process)d: 打印进程ID

     %(message)s: 打印日志信息

    datefmt: 指定时间格式,同time.strftime()

    stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

    logging.getLogger([name]):创建一个日志对象:

    返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例。

    logging.getLogger(__name__) 在上述实例中__name__就指的是__main__。

     三:logging之日志回滚

    import logging
    from logging.handlers import RotatingFileHandler
    
    #################################################################################################
    #定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
    Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5)
    Rthandler.setLevel(logging.INFO)
    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
    Rthandler.setFormatter(formatter)
    logging.getLogger('').addHandler(Rthandler)
    ################################################################################################

    从上例和本例可以看出,logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。
    logging的几种handle方式如下:

    ogging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
    logging.FileHandler: 日志输出到文件
    日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
    logging.handlers.BaseRotatingHandler
    logging.handlers.RotatingFileHandler
    logging.handlers.TimedRotatingFileHandler
    logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
    logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
    logging.handlers.SMTPHandler:  远程输出日志到邮件地址
    logging.handlers.SysLogHandler: 日志输出到syslog
    logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
    logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
    logging.handlers.HTTPHandler: 通过"GET""POST"远程输出到HTTP服务器

    由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中。

    os模块的使用

    python编程时,经常和文件、目录打交道,这是就离不了os模块。os模块包含普遍的操作系统功能,与具体的平台无关。以下列举常用的命令

    1. os.name——判断现在正在实用的平台,Windows 返回 ‘nt'; Linux 返回’posix'

    2. os.getcwd()——得到当前工作的目录。

    3. os.listdir()——指定所有目录下所有的文件和目录名。例: 

                  

      以列表的形式全部列举出来,其中没有区分目录和文件。

    4. os.remove()——删除指定文件

    5. os.rmdir()——删除指定目录

    6. os.mkdir()——创建目录

      注意:这样只能建立一层,要想递归建立可用:os.makedirs()

    7. os.path.isfile()——判断指定对象是否为文件。是返回True,否则False

    8. os.path.isdir()——判断指定对象是否为目录。是True,否则False。例:          9. os.path.exists()——检验指定的对象是否存在。是True,否则False.例:

         

    10. os.path.split()——返回路径的目录和文件名。例:

         

    此处只是把前后两部分分开而已。就是找最后一个'/'。看例子:

         

    11. os.getcwd()——获得当前工作的目录(get current work dir)

    12. os.system()——执行shell命令。例:

         

    13. os.chdir()——改变目录到指定目录

    14. os.path.getsize()——获得文件的大小,如果为目录,返回0

    15. os.path.abspath()——获得绝对路径。例:

        

    16. os.path.join(path, name)——连接目录和文件名。例:

        

    17.os.path.basename(path)——返回文件名

        

    18. os.path.dirname(path)——返回文件路径

        

     

    ccommands模块只使用与linux的shell模式下

    在我们平时码字时,经常需要调用系统脚本或者系统命令来解决很多问题,接下来我们就介绍给大家一个很好用的模块command,可以通过python调用系统命令,调用系统命令command模块提供了三种方法:cmd代表系统命令

      commands.getoutput(cmd)

    只返回执行shell命令的结果:

    举个例子:

    [root@localhost ~]# cat a.py

    #!/usr/bin/env python

    #-*- coding:utf-8 -*-

    import commands

    cmd = 'ls /home/admin'

    a = commands.getoutput(cmd)

    print(type(a))

    print(a)

    结果:

    [root@localhost ~]# python a.py

    <type 'str'>

    nginx.conf

    nginx_upstream_check_module-master.zip

    test.py

    commands是提供linux系统环境下支持使用shell命令的一个模块,在企业中,我们很多的脚本和环境都是在linux系统中跑起来的,

    commands.getstatusoutput(cmd)

    在上面我们在执行shell命令的时候,我们的shell命令可能执行报错,或者异常退出,我们就要有一个条件来判断shell最终执行的结果是什么,commands.getstatusoutput(cmd)的返回结果有两个值,

    #!/usr/bin/env python
    # --*-- coding:utf-8 --*--
    import commands
    cmd = 'ls /home/'
    
    result = commands.getoutput(cmd)
    
    print(type(result))
    print(result)
    #commands.getoutput的返回值是只有返回结果,无法判断执行结果是否正常。
    
    cmd = 'ps -ef'
    result,staus = commands.getstatusoutput(cmd)
    print(type(result))
    print(result)
    print(type(staus))
    print(staus)
    
    #commands.getstatusoutput的返回值是一个tuple类型
    #第一个值接受状态码,结果是int类型,如果返回结果为0,说明执行正常,如果非0,说明结果异常
    #第二个值接受返回结果,结果是str类型
    

      

    sys模块

    sys模块其实有很多功能的,那我们就介绍一些最常用的一些功能吧,这样对于大家来说更加容易上手:

    1,  通过sys模块获取程序参数

    if __name__ == '__main__':
        print('sys.argv[0] = {0}'.format(sys.argv[0]))
        print('sys.argv[1] = {0}'.format(sys.argv[1]))
        print('sys.argv[2] = {0}'.format(sys.argv[2]))
    
    输出结果:
    sys.argv[0] = C:/python/learm/demon_sy.py
    sys.argv[1] = -i
    sys.argv[2] = 1.txt

    解释:

    和其他语言一样,python的sys模块默认是把第一个参数默认是程序本省,从第二个参数起都是代码后面跟着的参数,通过sys.arg[n]就可以获得传入到程序中的参数。

    2,  sys.stdinstdoutstderr

    功能:stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们

    2..1 sys.stdout 与 print

    当我们在 Python 中打印对象调用 print obj 时候,事实上是调用了sys.stdout.write(obj+'
    '),print 将你需要的内容打印到了控制台,然后追加了一个换行符,print 会调用 sys.stdout 的 write 方法
    
    以下两行在事实上等价:
    
    import sys
    
    sys.stdout.write('hello'+'
    ')
    
    print 'hello'
    
    2.2 sys.stdin 与 raw_input
    
    import sys
    
    a = raw_input('raw_input_name: ')
    
    print(a)
    
    print 'stdin_name: ', #comma to stay in the same line
    
    b = sys.stdin.readline()[:-1] # -1 to discard the '
    ' in input stream
    
    print(b)

    1.3    从控制台重定向到文件

    Import sys
    
    f_handler=open('out.log', 'w')
    
    sys.stdout=f_handler
    
    print 'hello'

    在当前文件下新生成一个文件out.log,文件内容为hello,

    3,  捕获sys.exit(n)调用

    功能:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)
    
    def exitfunc():
    
        print "hello world"
    
    sys.exitfunc = exitfunc  # 设置捕获时调用的函数
    
    print "aaaaaaaa"
    
    sys.exit(1)     # 退出自动调用exitfunc()后,程序依然退出了
    
    print "there"  # 不会被 print
    
    结果:
    
    aaaaaaaa
    
    hello world

    解释:

    1,  设置sys.exitfunc函数,及当执行sys.exit(1)的时候,调用exitfunc函数

    2,  sys.exit(1)后面的内容就不会执行了,因为程序已经退出。

  • 相关阅读:
    08-01集合运算
    07-03成员运算符
    07-02集合
    07-01结构与封装
    06-01字符串格式化.md
    06-03线性结构与切片
    06-02字符串与bytes
    05-02命名元组
    05-01元组
    04-01列表与常用操作
  • 原文地址:https://www.cnblogs.com/wxp997/p/7820532.html
Copyright © 2020-2023  润新知