python的datetime模块和logging模块

2019-05-05  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读