datetime logging 模块
datetime**模块**
datetime是python处理时间和日期的标准库
datetime 模块中 主要类
类名 | 功能说明 |
---|---|
date | 日期对象, 属性year, month, day |
time | 时间对象 hour,minute,second,毫秒 |
datetime | 日期时间对象,属性hour, minute, second, microsecond |
timedelta | 时间间隔,即两个时间点之间的长度 |
主要使用: datetime.datetime( ) 、 datetime.timedelta( )
datetime.date()
日期: datetime.date( year, month, day )
t3 = datetime.date(2018,6,26)
print(t3)
2018-06-26
datetime.time( )
时间: datetime.time( hour, minute, second, microsecond )
import datetime
t1 = datetime.time(21,11,11,1) #时分秒微妙
print(t1)
t2 = datetime.time(21)
print(t2)
21:11:11.000001
21:00:00
datetime.datetime()
日期时间: datetime.datetime( year, month, day, hour, minute, second, microsecond )
t4 = datetime.datetime(2018,5,30,21,21,55,1)
print(t4)
t5 = datetime.datetime(2018,5,30)
print(t5)
2018-05-30 21:21:55.000001
2018-05-30 00:00:00
datetime.datetime.now()
当前日期时间
print(datetime.datetime.now())
2018-06-26 23:20:41.246089
datetime.datetime.utcnow()
当前UTC日期时间 比北京时间快了8小时/东八区
print(datetime.datetime.now())
print(datetime.datetime.utcnow())
2018-06-26 23:22:19.569735
2018-06-26 15:22:19.569920
time.mktime()
time. mktime(dt. timetuple()))
日期时间转时间戳
1970 到现在所经历的秒数 中间变量,可以做运算
year, month, day,hour, minute, second, microsecond, 夏令时
datetimes = (2018, 5, 30, 21, 21, 55, 1, 66, -1)
t = time.mktime(datetimes)
print(t)
1527686515.0
datetime.datetime.fromtimestamp()
时间戳转日期时间:
datetimes = (2018, 5, 30, 21, 21, 55, 1, 66, -1)
t = time.mktime(datetimes)
print(t)
ft = datetime.datetime.fromtimestamp(t)
print(ft)
1527686515.0
2018-05-30 21:21:55
时间与字符串的转换
datetime.strptime()
datetime.strptime(string, format_string)
string 时间字符串
format_string 解析格式字符串 时间对象
day = datetime.datetime.strptime('2018-6-27 12:12:12','%Y-%m-%d %H:%M:%S')
day2 = datetime.datetime.strptime('2018/6/27 11.11.11','%Y/%m/%d %H.%M.%S')
print(day)
print(day2)
2018-06-27 12:12:12
2018-06-27 11:11:11
datetime.strftime()
datetime.strftime(format_string ,string)
now = datetime.datetime.now()
print(now.strftime('%Y-%m-%d %H:%M:%S'))
day = datetime.datetime.strptime('2018-6-27 12:12:12','%Y-%m-%d %H:%M:%S')
print(day)
print(day.strftime('%Y-%m-%d %H:%M:%S'))
2018-06-27 08:21:38
2018-06-27 12:12:12
2018-06-27 12:12:12
时间日期格式化符号
符号 | 说明 |
---|---|
%y | 两位数的年份表示(00-99) |
%Y | 四位数的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月内中的一天(0-31) |
%H | 24小时制小时数(0-23) |
%I | 12小时制小时数(01-12) |
%M | 分钟数(00=59) |
%S | 秒(00-59) |
%a | 本地简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化的月份名称 |
%B | 本地完整的月份名称 |
%c | 本地相应的日期表示和时间表示 |
%j | 年内的一天(001-366) |
%p | 本地A.M.或P.M.的等价符 |
%U | 一年中的星期数(00-53)星期天为星期的开始 |
%w | 星期(0-6),星期天为星期的开始 |
%W | 一年中的星期数(00-53)星期一为星期的开始 |
%x | 本地相应的日期表示 |
%X | 本地相应的时间表示 |
%Z | 当前时区的名称 |
%% | %号本身 |
时间计算datetime.timedelta()
datetime.timedelta( days=0,seconds=0, microseconds=0 milliseconds=0, minutes=0, hours=0, weeks=0 )
now = datetime.datetime.now()
print(now)
new_now = now + datetime.timedelta(hours=10)
print(new_now)
new_now2 = now + datetime.timedelta(days=2)
print(new_now2)
new_now3 = now + datetime.timedelta(days=2,hours=10)
print(new_now3)
2018-06-27 08:37:28.392505
2018-06-27 18:37:28.392505
2018-06-29 08:37:28.392505
2018-06-29 18:37:28.392505
now = datetime.datetime.now()
print(now)
dt = datetime.datetime(1994,11,14)
print(dt)
time = now-dt
print(time)
2018-06-27 08:40:41.439072
1994-11-14 00:00:00
8626 days, 8:40:41.439072
时区 timezone
datetime.timezone( offset, name )
#创建时区utc+8:00
tz_utc_ = datetime.timezone(datetime.timedelta(hours=8))
now = datetime.datetime.now()
print(now)
dt = now.replace(tzinfo=tz_utc_)
print(dt)
2018-06-27 08:46:34.227487
2018-06-27 08:46:34.227487+08:00
print(datetime.datetime.now())
tz_china = datetime.timezone(datetime.timedelta(hours=8),'Asia/Beijing')
print(datetime.datetime.now().replace(tzinfo=tz_china))
2018-06-27 08:58:55.648983
2018-06-27 08:58:55.650104+08:00
utc_now = datetime.datetime.utcnow()
print(utc_now)
# 强制设置时区为utc+0:00
new_utc_now = utc_now.replace(tzinfo=datetime.timezone.utc)
print(new_utc_now)
2018-06-27 00:51:40.962566
2018-06-27 00:51:40.962566+00:00
logging模块
诊断日志:
记录与应用程序操作相关的日志,例如用户遇到的报错信息,可通过搜索诊断日志获得上下文信息
审计日志:
为商业分析而记录的日志,从审计日志中,可提取用户的交易信息,并结合其他资料构成用户报告或者用来优化商业目标
Logging与print差异
print()确实方便和易用,但是也有缺点,比如打印出来的信息不能保存,再次运行程序,之前打印出来的结果被清空
日志记录包含清晰可见的诊断信息,如文件名称,路径,函数名和行号等
日志五个级别
DEBUG: debug()
调试信息,通常在诊断问题的时候用得着
INFO: info()
普通信息,确认程序按照预期运行
WARNING: warning()
警告信息,表示发生意想不到的事情,或者指示接下来可能会出现一些问题,
但是程序还是继续运行
ERROR: error()
错误信息,程序运行中出现了一些问题,一些功能没有执行
CRITICAL: critical()
危险信息,一个严重的错误,导致程序无法继续运行
默认输出级别
import logging
logging.debug('debug')
logging.info('info')
# 默认输出级别
logging.warning('warning')
logging.error('error')
logging.critical('critical')
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
修改logging默认输出级别
import logging
logging.basicConfig(level=logging.INFO)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
INFO:root:info
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical
logging信息保存到文件
默认追加
import logging
logging.basicConfig(level=logging.INFO,filename='logging_test.log')
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
覆盖模式
import logging
logging.basicConfig(level=logging.INFO,filename='logging_test.log',filemode='w')
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
格式化输出
%()s
import logging
log_format = "%(levelname)s-%(asctime)s-%(message)s" #设置格式
logging.basicConfig(level=logging.DEBUG,filename='logging_test.log',format=log_format)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
DEBUG-2018-06-27 09:56:41,469-debug
INFO-2018-06-27 09:56:41,470-info
WARNING-2018-06-27 09:56:41,470-warning
ERROR-2018-06-27 09:56:41,470-error
CRITICAL-2018-06-27 09:56:41,471-critical
Formatter 中已有格式 :
%(name)s Logger的名字
%(levelname)s 文本形式的日志级别
%(message)s 用户输出的消息
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(levelno)s 数字形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
logging用法
- 初始化一个logger对象,设置级别
- 定义Handler,决定把日志发送到那里常用的是StreamHandler和FileHandler, StreamHandler:将日志在控制台输出 FileHandler: 将日志记录到文件里面
- 定义handler输入信息的格式例如:’[%(asctime)s][%(levelname)s] %(message)s’, ‘%Y-%m-%d %H:%M:%S’
- 将handler添加至loger对象中
import logging
# 创建一个日志记录器logger
logger = logging.getLogger('%s_log' % __name__)
# 设置日志等级
logger.setLevel(logging.INFO)
# 定义日志处理器 handler
# FileHandler 把日志记录到文件
fh = logging.FileHandler('test.log',mode='a')
# StreamHandle 把日志显示到控制台
sh = logging.StreamHandler()
# 创建格式器
format = logging.Formatter('%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s',datefmt='%Y/%m/%d %H:%M:%S')
# 将格式器添加至日志处理器
fh.setFormatter(format)
# 将handler处理器添加到log记录器
logger.addHandler(fh)
logger.addHandler(sh)
logger.warning('error')
控制台
error
文件
2018/06/27 11:51:55 - three_2.py [line:24] - WARNING - error
import logging
logger = logging.getLogger('%s_log' % __name__)
logger.setLevel(logging.INFO)
fh = logging.FileHandler('test.log',mode='a')
format = logging.Formatter('%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s',datefmt='%Y/%m/%d %H:%M:%S')
fh.setFormatter(format)
logger.addHandler(fh)
try:
with open('t.txt','r') as f:
f.read()
except FileNotFoundError as e:
print(e)
logger.error(e)
控制台
[Errno 2] No such file or directory: 't.txt'
文件
2018/06/27 11:56:51 - three_2.py [line:17] - ERROR - [Errno 2] No such file or directory: 't.txt'
import logging
logger = logging.getLogger('%s_log' % __name__)
logger.setLevel(logging.INFO)
fh = logging.FileHandler('test.log',mode='w')
format = logging.Formatter('%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s',datefmt='%Y/%m/%d %H:%M:%S')
fh.setFormatter(format)
logger.addHandler(fh)
try:
with open('t.txt','r') as f:
f.read()
except FileNotFoundError as e:
print(e)
logger.error(e,exc_info=True)
控制台
[Errno 2] No such file or directory: 't.txt'
文件
2018/06/27 12:01:31 - three_2.py [line:18] - ERROR - [Errno 2] No such file or directory: 't.txt'
Traceback (most recent call last):
File "/home/pyvip/py_case/jinjie/three_2.py", line 14, in <module>
with open('t.txt','r') as f:
FileNotFoundError: [Errno 2] No such file or directory: 't.txt'
fh.setLevel(logging.CRITICAL)
import logging
logger = logging.getLogger('%s_log' % __name__)
logger.setLevel(logging.INFO)
fh = logging.FileHandler('test.log',mode='w')
# 设置handlerde日志等级 只有CRITICAL的错误才存到文件
fh.setLevel(logging.CRITICAL)
format = logging.Formatter('%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s',datefmt='%Y/%m/%d %H:%M:%S')
fh.setFormatter(format)
logger.addHandler(fh)
logger.critical('error')
2018/06/27 12:10:07 - three_2.py [line:15] - CRITICAL - error
作业
根据上课例子,写一个记录程序错误的日志在程序里制造错误,看错误信息是否写入
import logging
logger = logging.getLogger('%s_log' % __name__)
logger.setLevel(logging.INFO)
fh = logging.FileHandler('test.log',mode='w')
fh.setLevel(logging.CRITICAL)
format = logging.Formatter('%(asctime)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s',
datefmt='%Y/%m/%d %H:%M:%S')
fh.setFormatter(format)
logger.addHandler(fh)
try:
a = 1/0
except ZeroDivisionError as e:
print(e)
logger.critical(e)
控制台
division by zero
文件
2018/06/27 12:30:20 - three_2.py [line:19] - CRITICAL - division by zero