08-datetime logging模块

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)
%H24小时制小时数(0-23)
%I12小时制小时数(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用法

  1. 初始化一个logger对象,设置级别
  2. 定义Handler,决定把日志发送到那里常用的是StreamHandler和FileHandler, StreamHandler:将日志在控制台输出 FileHandler: 将日志记录到文件里面
  3. 定义handler输入信息的格式例如:’[%(asctime)s][%(levelname)s] %(message)s’, ‘%Y-%m-%d %H:%M:%S’
  4. 将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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值