Python LOG-日志
LOG
- https://www.cnblogs.com/yyds/p/6901864.html
- logging
- logging模块提供模块级别的函数记录日志
- 包括四大组件
1. 日志相关概念
- 日志
- 日志的级别(level)
- 不同的用户关注不同的程序信息
- DEBUG
- INFO
- NOTICE
- WARNING
- ERROR
- CRITICAL
- ALERT
- EMERGENCY
- IO操作=>不要频繁操作
- LOG的作用
- 调试
- 了解软件的运行情况
- 分析定位问题
- 日志信息
- time
- 地点
- level
- 内容
- 成熟的第三方日志
- log4j
- log4php
- logging
2 Logging模块
- 日志级别
- 级别可自定义
- DEBUG
- INFO
- WARNING
- ERROR
- CRITICAL
- 初始化/写日志实例需要指定级别, 只有当级别等于或高于指定级别才被记录
- 使用方式
- 直接使用logging(封装了其他组件)
- loging四大组件直接定制
2.1 logging模块级别的日志
使用以下几个函数
- logging.debug(msg, *args, **kwargs) 创建一条严重级别为DEBUG的日志记录
- logging.info(msg, *args, **kwargs) 创建一条严重级别为INFO的日志记录
- logging.warning(msg, *args, **kwargs) 创建一条严重级别为WARNING的日志记录
- logging.error(msg, *args, **kwargs) 创建一条严重级别为ERROR的日志记录
- logging.critical(msg, *args, **kwargs) 创建一条严重级别为CRITICAL的日志记录
- logging.log(level, *args, **kwargs) 创建一条严重级别为level的日志记录
- logging.basicConfig(**kwargs) 对root logger进行一次性配置
logging.basicConfig(**kwargs) 对root logger进行一次性配置
- 只在第一次调用的时候起作用
- 不配置logger则使用默认值
- 输出: sys.stderr
- 级别: WARNING
- 格式: level:log_name:content
案例 01
format参数
asctime %(asctime)s 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896
created %(created)f 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值
relativeCreated %(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
msecs %(msecs)d 日志事件发生事件的毫秒部分
levelname %(levelname)s 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno %(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50)
name %(name)s 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger
message %(message)s 日志记录的文本内容,通过 msg % args计算得到的
pathname %(pathname)s 调用日志记录函数的源码文件的全路径
filename %(filename)s pathname的文件名部分,包含文件后缀
module %(module)s filename的名称部分,不包含后缀
lineno %(lineno)d 调用日志记录函数的源代码所在的行号
funcName %(funcName)s 调用日志记录函数的函数名
process %(process)d 进程ID
processName %(processName)s 进程名称,Python 3.1新增
thread %(thread)d 线程ID
threadName %(thread)s 线程名称
2.1 logging模块的处理流程
四大组件
- 日志器(Logger): 产生日志的一个接口
- 处理器(Handler):把产生的日志发送到相应的目的地
- 过滤器(Filter): 更精细的控制那些日志输出
- 格式器(Formatter): 对输出信息进行格式化
Logger
产生一个日志
操作
Logger.setLevel() 设置日志器将会处理的日志消息的最低严重级别
Logger.addHandler() 和 Logger.removeHandler() 为该logger对象添加 和 移除一个handler对象
Logger.addFilter() 和 Logger.removeFilter() 为该logger对象添加 和 移除一个filter对象
Logger.debug: 产生一条debug级别的日志,同理,info,error,等
Logger.exception(): 创建类似于Logger.error的日志消息
Logger.log():获取一个明确的日志level参数类创建一个日志记录
如何得到一个logger对象
- 实例化
- logging.getLogger()
Handler
把log发送到制定位置
方法
- setLevel
- setFormat
- addFilter, removeFilter
不需要直接使用,Handler是基类
logging.StreamHandler 将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。
logging.FileHandler 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
logging.handlers.RotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按大小切割
logging.hanlders.TimedRotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按时间切割
logging.handlers.HTTPHandler 将日志消息以GET或POST的方式发送给一个HTTP服务器
logging.handlers.SMTPHandler 将日志消息发送给一个指定的email地址
logging.NullHandler 该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。
Format类
- 直接实例化
- 可以继承Format添加特殊内容
- 三个参数
- fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
- datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S"
- style:Python 3.2新增的参数,可取值为 ‘%’, ‘{‘和 ‘$’,如果不指定该参数则默认使用’%’
Filter类
- 可以被Handler和Logger使用
- 控制传递过来的信息的具体内容
# 需求:
'''
1、 要求所有级别的所有日志都写入磁盘文件中
2、 all.log文件中记录所有的日志信息,日志格式为:日期和时间- 日志级别-日志信息
3、 error.log文件中单独记录error及以上级别的日志信息,日志格式为:日期和时间- 日志级别- 文件名[:行号]- 日志信息
4、 要求all.log在每天凌晨进行日志切割
分析:
1)要记录所有级别的日志,因此日志的有效level需要设置为最低级别--DEBUG
2)日志需要被发送到两个不同的目的地,因此需要为日志器设置两个handler;另外,两个目的地都是磁盘文件,因此这两个handler都是与FileHandler相关的;
3)all.log要求按照时间进行日志切割,因此他需要用logging.handlers.TimedRotatingFileHandler; 而error.log没有要求日志切割,因此可以使用FileHandler;
4)两个日志文件的格式不同,因此需要对这两个handler分别设置格式器;
'''
import logging
import logging.handlers
import datetime
# 定义logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
rf_handler = logging.handlers.TimedRotatingFileHandler('all.log', when='midnight', interval=1, backupCount=7, atTime=datetime.time(0, 0, 0, 0))
rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
f_handler = logging.FileHandler('error.log')
f_handler.setLevel(logging.ERROR)
f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))
# 把相应的处理器组装到logger上
logger.addHandler(rf_handler)
logger.addHandler(f_handler)
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
Python LOG-日志的更多相关文章
- python - log日志
# -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: study_logging.py @ide: PyCharm Comm ...
- Python Django log日志
log日志 log开发日志 一.创建项目 1.python -m venv ll_env # 创建虚拟环境 2.source ll_env/bin/activate # 激活虚拟环境 3.pip in ...
- python打印日志log
整理一个python打印日志的配置文件,是我喜欢的格式. # coding:utf-8 # 2019/11/7 09:19 # huihui # ref: import logging LOG_FOR ...
- python 读取 log日志的编码问题
1.我要读取log日志的”执行成功”的个数,log日志编码格式为GBK 2.显示报错,大致意思是说utf-8的代码不能解析log日志 3.后来想想把log日志用GBK编码读出来,写到新文件中,用utf ...
- Atitit.log日志技术的最佳实践attilax总结
Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...
- python log
python的日志模块为logging,它可以将我们想要的信息输出保存到一个日志文件中. # cat log import logging logging.debug('This is debug m ...
- python logging 日志轮转文件不删除问题
前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据. 分析 项目使用了 logg ...
- Python之日志处理(logging模块)
本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日 ...
- python标准日志模块logging及日志系统设计
最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下. python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发 ...
- Python logging日志系统
写我小小的日志系统 配置logging有以下几种方式: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件, ...
随机推荐
- Django数据迁移介绍
1.简介 迁移是 Django 将你对模型的修改(例如增加一个字段,删除一个模型)应用至数据库表结构对方式 2.基本命令 python manage.py migrate---负责应用和撤销迁移 py ...
- mysql数据库用sql语句在指定的一个字段后面添加一个字段
alert table (新增列的表名) add (新列名) comment (添加备注)+[after + 要跟随的字段名]可写可不写 ALTER TABLE ch_poliy_info AD ...
- vue路由重复跳转导致控制台报错
重复跳转了同一个页面,导致空值台报错了! 解决思路: 方案1:在路由跳转时捕获错误. 1.1 全局捕获处理 //index.js import VueRouter from 'vue-router' ...
- SpringBoot之独立quartz数据源
背景: 之前项目里面把quartz相关的表跟业务数据库(涉及系统业务的库)融合在一起,后面需要把quartz单独拎出来放在一个数据库里面, 旧的数据源配置(application.properties ...
- PHP 文件和文件夹操作
文件夹操作 创建文件夹 mkdir(名称,权限,递归创建):创建文件 例如: #创建文件夹 mkdir('./aa') # 创建 aa 文件夹 mkdir('./aa/bb') # 在 aa 目录下创 ...
- Python自动化环境搭建轻轻松松---selenium
其实安装selenium实现自动化搭建环境也不拿 一共四步 1.Python开发环境 2.安装selenium包 3.安装浏览器 4.安装你安装的浏览器驱动 一: 想要实现Python环境不可能缺席: ...
- Mybatisplus----DML编程控制
乐观锁 (1)业务并发现象带来的问题:秒杀 执行: 1.在类对象中添加version属性,在数据库表中添加version字段(默认值为1) package com.itheima.domain; im ...
- 基于列存储的开源分布式NoSQL数据库Apache Cassandra入门分享
@ 目录 概述 定义 特性 与Hbase对比 Cassandra使用场景 术语 架构 概览 Dynamo 数据集分区使用令牌环的一致性哈希 存储引擎 部署 单实例部署 集群部署 CQL 概述 数据模型 ...
- 我没能实现始终在一个线程上运行 task
前文我们总结了在使用常驻任务实现常驻线程时,应该注意的事项.但是我们最终没有提到如何在处理对于带有异步代码的办法.本篇将接受笔者对于该内容的总结. 如何识别当前代码跑在什么线程上 一切开始之前,我们先 ...
- 聊聊spring中bean的作用域
前言 今天分享一下spring bean的作用域,理解bean的作用域能够在使用过程中避免一些问题,bean的作用域也是spring bean创建过程中一个重要的点. Spring bean的作用域类 ...