美文网首页
python的datetime模块和logging模块

python的datetime模块和logging模块

作者: 昆仑草莽 | 来源:发表于2019-05-05 15:44 被阅读0次

    datetime模块

    datetime是python处理时间和日期的标准库。包含很多时间类。

    类名 描述
    date 日期对象,常用的属性有year、month、day
    time 时间对象,常用属性有hour、minute、second、毫秒
    datetime 日期时间对象,常用的属性有hour, minute, second, microsecond
    timedelta 时间间隔,即两个时间点之间的长度

    在datetime模块中,最常用的是主要使用:
    datetime.datetime( ) 、 datetime.timedelta( )

    import datetime
    
    dt = datetime.time(12,30,30,50) #时,分,秒,毫秒
    print('dt的时间为: {}'.format(dt))
    dd = datetime.date(2019,5,5) #年 月 日
    print('dd的时间为: {}'.format(dd))
    d_time = datetime.datetime(2019,5,5,12,30,50) #年 月 日 时 分 秒 毫秒
    print('d_time的时间为: {}'.format(d_time))
    t = datetime.datetime.now() - d_time #时间相减,可得固定时间的间隔
    print('时间间隔为: {}'.format(t))
    输出:
    dt的时间为: 12:30:30.000050
    dd的时间为: 2019-05-05
    d_time的时间为: 2019-05-05 12:30:50
    时间间隔为: 0:44:17.309240
    
    Process finished with exit code 0
    

    datetime类的常用方法:

    类名 描述
    datetime.now() 获取当前时间
    时间日期对象.timestamp() 日期时间转换为时间戳,例如:dayetime.now().timestamp()
    datetime.fromtimestamp(时间戳) 时间戳转化为日期时间,例如:datetime.fromtimestamp(1534231316.796308)
    时间日期对象.strftime(format) 时间日期对象转字符串,例如: datetime.now().strftime("%Y-%m-%d")
    datetime.strptime(date_str,format) 字符串转日期时间对象例如: datetime.strptime('2018-3-22 15:28:18', '%Y-%m-%d %H:%M:%S')

    格式化字符串常用格式

    格式 描述
    %Y/%y
    %m
    %d
    %H/%I
    %M
    %S
    import datetime
    
    dd = datetime.datetime.now()
    print('当前时间为: {}'.format(dd))
    
    ddt = datetime.datetime.now().timestamp()
    print('当前时间戳为: {}'.format(ddt))
    
    ddts = datetime.datetime.now().fromtimestamp(ddt)
    print('当前时间戳转为时间为: {}'.format(ddts))
    
    ddzfc = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print('当前时间转字符串为: {}'.format(ddzfc))
    
    dddd = datetime.datetime.strptime(ddzfc,'%Y-%m-%d %H:%M:%S')
    print('当前字符串转时间为: {}'.format(dddd))
    输出:
    当前时间为: 2019-05-05 13:53:08.692527
    当前时间戳为: 1557035588.692527
    当前时间戳转为时间为: 2019-05-05 13:53:08.692527
    当前时间转字符串为: 2019-05-05 13:53:08
    当前字符串转时间为: 2019-05-05 13:53:08
    
    Process finished with exit code 0
    
    时间运算

    datetime.timedelta( days=0,seconds=0, microseconds=0,milliseconds=0,minutes=0, hours=0, weeks=0 )
    timedelta的属性包含days、seconds、microseconds、milliseconds、minutes、hours、weeks

    import datetime
    
    now = datetime.datetime.now().date()
    result_time_before = now + datetime.timedelta(days=3) #3天后的时间
    print('3天前的时间为: {}'.format(result_time_before))
    
    now = datetime.datetime.now().date()
    result_time_after = now - datetime.timedelta(days=3) #3天前的时间
    print('3天后的时间为: {}'.format(result_time_after))
    输出:
    3天前的时间为: 2019-05-08
    3天后的时间为: 2019-05-02
    
    Process finished with exit code 0
    

    logging模块

    软件中通过日志记录程序运行状况是一个开发的好习惯,对于错误排查核系统运维都是有非常大的帮助,python标准库自带日志模块,程序的日志功能直接调用标准库的日志模块即可。通过日志,开发者可以清楚的了解发生了哪些事情。包括出现了哪些错误。
    logging中几种日志等级:

    日志等级 描述
    DEBUG 调式信息,通常在诊断问题时候用的着
    INFO 普通信息,确认程序按照预期运行
    WARNING 警告信息,表示发生意想不到的事情,或者指示接下来可能会出现一些问题,但是程序还是继续运行
    ERROR 错误信息,程序运行中出现了一些问题,程序某些功能不能执行
    CRITICAL 危险信息,一个严重的错误,导致程序无法继续运行

    日志模块中formatter格式

    日志格式 描述
    %(asctime)s 日志事件发生的时间
    %(levelname)s 该日志记录的日志级别
    %(message)s 该日志记录的日志内容
    %(name)s 日志所使用日志器的名称,默认为‘root’
    %(pathname)s 调用日志记录函数的文件的全路径
    %(filename)s 调用日志记录函数的文件
    %(funcname)s 调用日志记录函数的函数名
    %(lineno)d 调用日志记录函数的代码所在的行数
    import logging
    
    LOG_for= "日志时间:%(asctime)s,日志级别:%(levelname)s,日志内容:%(message)s"
    
    logging.basicConfig(level=logging.DEBUG,format=LOG_for)
    
    logging.debug('这是调试日志')
    logging.info('这是运行日志')
    logging.warning('这是警告日志')
    logging.error('程序出错了')
    logging.critical('系统崩溃了')
    输出:
    日志时间:2019-05-05 14:43:33,344,日志级别:DEBUG,日志内容:这是调试日志
    日志时间:2019-05-05 14:43:33,345,日志级别:INFO,日志内容:这是运行日志
    日志时间:2019-05-05 14:43:33,345,日志级别:WARNING,日志内容:这是警告日志
    日志时间:2019-05-05 14:43:33,345,日志级别:ERROR,日志内容:程序出错了
    日志时间:2019-05-05 14:43:33,345,日志级别:CRITICAL,日志内容:系统崩溃了
    Process finished with exit code 0
    

    如果只是简单的使用logging,那么上面已经足够了。但是要实现定制log,那么可就需要更加深入的了解,logging模块还提供了模块化组件的方法,来灵活的配置日志器。

    组件 描述
    Loggers(日志记录器) 提供程序直接使用的接口
    Handlers(日志处理器) 将记录的日志发送到指定的位置
    Filters(日志过滤器) 用于过滤特定的日志记录
    Formatters(日志格式器) 用于控制日志信息的输出格式

    模块化组件的使用步骤:
    1、创建一个logger(日志记录器)对象;
    2、定义handler(日志处理器),决定把日志发送到哪里;
    1)、streamhandler ===> 输出到控制台
    2)、Filehandler ===> 输出到指定文件
    3、设置日志级别(level)和输出格式formatters(日志格式器)
    4、把handler添加到对应的logger中去

    import logging
    
    #第一步,创建一个logger
    logger = logging.getLogger('{}_log'.format(__name__))
    logger.setLevel(logging.DEBUG) #设置日志等级
    #第二步,创建一个Handler,用于写入日志
    fh = logging.FileHandler('text.log',mode='a') #写入文件
    fh.setLevel(logging.DEBUG) #设置写入文件的日志等级
    
    dh = logging.StreamHandler() #在控制台输出
    dh.setLevel(logging.DEBUG) #设置控制台输出日志等级
    #第三步 ,定义handler的输出格式
    formatter = logging.Formatter(
        '日志时间:%(asctime)s,'
        '日志级别:%(levelname)s,'
        '日志内容:%(message)s,'
    )
    
    fh.setFormatter(formatter) #设置文件输出格式
    dh.setFormatter(formatter) #设置控制台输出格式
    
    #第四步,将对应的handler添加到logger中
    logger.addHandler(fh)
    logger.addHandler(dh)
    
    
    if __name__ == '__main__':
        def add_num(m,n):
            try:
                for i in range(10):
                    num = (m+n)/i
                    logger.info(num)
                    return num
            except Exception as e:
                logger.error(e)
        add_num(2,3)
    输出:
    日志时间:2019-05-05 15:43:16,149,日志级别:ERROR,日志内容:division by zero,
    Process finished with exit code 0
    

    相关文章

      网友评论

          本文标题:python的datetime模块和logging模块

          本文链接:https://www.haomeiwen.com/subject/xrbcoqtx.html