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-日志的更多相关文章

  1. python - log日志

    # -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: study_logging.py @ide: PyCharm Comm ...

  2. Python Django log日志

    log日志 log开发日志 一.创建项目 1.python -m venv ll_env # 创建虚拟环境 2.source ll_env/bin/activate # 激活虚拟环境 3.pip in ...

  3. python打印日志log

    整理一个python打印日志的配置文件,是我喜欢的格式. # coding:utf-8 # 2019/11/7 09:19 # huihui # ref: import logging LOG_FOR ...

  4. python 读取 log日志的编码问题

    1.我要读取log日志的”执行成功”的个数,log日志编码格式为GBK 2.显示报错,大致意思是说utf-8的代码不能解析log日志 3.后来想想把log日志用GBK编码读出来,写到新文件中,用utf ...

  5. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  6. python log

    python的日志模块为logging,它可以将我们想要的信息输出保存到一个日志文件中. # cat log import logging logging.debug('This is debug m ...

  7. python logging 日志轮转文件不删除问题

    前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据. 分析 项目使用了 logg ...

  8. Python之日志处理(logging模块)

    本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日 ...

  9. python标准日志模块logging及日志系统设计

    最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下. python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发 ...

  10. Python logging日志系统

    写我小小的日志系统 配置logging有以下几种方式: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件, ...

随机推荐

  1. Django数据迁移介绍

    1.简介 迁移是 Django 将你对模型的修改(例如增加一个字段,删除一个模型)应用至数据库表结构对方式 2.基本命令 python manage.py migrate---负责应用和撤销迁移 py ...

  2. mysql数据库用sql语句在指定的一个字段后面添加一个字段

    alert table (新增列的表名)   add (新列名) comment (添加备注)+[after  + 要跟随的字段名]可写可不写 ALTER TABLE ch_poliy_info AD ...

  3. vue路由重复跳转导致控制台报错

    重复跳转了同一个页面,导致空值台报错了! 解决思路: 方案1:在路由跳转时捕获错误. 1.1 全局捕获处理 //index.js import VueRouter from 'vue-router' ...

  4. SpringBoot之独立quartz数据源

    背景: 之前项目里面把quartz相关的表跟业务数据库(涉及系统业务的库)融合在一起,后面需要把quartz单独拎出来放在一个数据库里面, 旧的数据源配置(application.properties ...

  5. PHP 文件和文件夹操作

    文件夹操作 创建文件夹 mkdir(名称,权限,递归创建):创建文件 例如: #创建文件夹 mkdir('./aa') # 创建 aa 文件夹 mkdir('./aa/bb') # 在 aa 目录下创 ...

  6. Python自动化环境搭建轻轻松松---selenium

    其实安装selenium实现自动化搭建环境也不拿 一共四步 1.Python开发环境 2.安装selenium包 3.安装浏览器 4.安装你安装的浏览器驱动 一: 想要实现Python环境不可能缺席: ...

  7. Mybatisplus----DML编程控制

    乐观锁 (1)业务并发现象带来的问题:秒杀 执行: 1.在类对象中添加version属性,在数据库表中添加version字段(默认值为1) package com.itheima.domain; im ...

  8. 基于列存储的开源分布式NoSQL数据库Apache Cassandra入门分享

    @ 目录 概述 定义 特性 与Hbase对比 Cassandra使用场景 术语 架构 概览 Dynamo 数据集分区使用令牌环的一致性哈希 存储引擎 部署 单实例部署 集群部署 CQL 概述 数据模型 ...

  9. 我没能实现始终在一个线程上运行 task

    前文我们总结了在使用常驻任务实现常驻线程时,应该注意的事项.但是我们最终没有提到如何在处理对于带有异步代码的办法.本篇将接受笔者对于该内容的总结. 如何识别当前代码跑在什么线程上 一切开始之前,我们先 ...

  10. 聊聊spring中bean的作用域

    前言 今天分享一下spring bean的作用域,理解bean的作用域能够在使用过程中避免一些问题,bean的作用域也是spring bean创建过程中一个重要的点. Spring bean的作用域类 ...