2024年最新Python logging模块_logging,2024年最新【金三银四】

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

import logging

logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s:%(message)s',  
                    filename='D:/st07/error/tmp/test.log',  
                    filemode='w')        

#在控制台输出ERROR等级日志,在logging.basicConfig中的参数配置会成为默认配置
#创建一个logger,定义输出到控制台的log等级开关为ERROR  
logger = logging.getLogger()      
con = logging.StreamHandler()
con.setLevel(logging.ERROR)  
#定义handler的输出格式  
format1 = logging.Formatter("%(asctime)s  %(filename)s[line:%(lineno)d]  %(levelname)s: %(message)s")  
con.setFormatter(format1)   
#将logger添加到handler里面  
logger.addHandler(con) 
                                       
#日志              
logging.debug('debug message')  
logging.info('info message')  
logging.warning('warning message')  
logging.error('error message')  
logging.critical('critical message')  

#测试代码
try:
    print("start")
    n=int(input("Please enter a number:"))
    share=12/n
    print('每一个股东的分红是:{}亿元。'.format(share))
except ValueError as e:
    logging.error(e)
except ZeroDivisionError as e:
    logging.error(e)
finally:
    print("end")

(2)在控制台输出:

(3)查看test.log日志文件:

2018-05-04 23:05:16,612 -error1.py[line:20] - DEBUG:debug message

2018-05-04 23:05:16,612 -error1.py[line:21] - INFO:info message

2018-05-04 23:05:16,612 -error1.py[line:22] - WARNING:warning message

2018-05-04 23:05:16,612 -error1.py[line:23] - ERROR:error message

2018-05-04 23:05:16,612 -error1.py[line:24] - CRITICAL:critical message

2018-05-04 23:05:46,735 -error1.py[line:33] - ERROR:invalid literal for int() with base 10: ‘2.5’

6.logging模块组件

(1)logging模块的四大组件

组件名称对应类名描述
日志器Logger提供了应用程序可一直使用的接口。
处理器Handler将logger创建的日志记录发送到合适的目的输出。
过滤器Filter提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录。
格式器Formatter决定日志记录的最终输出格式。

(2)Logger对象常用方法

方法描述
Logger.setLevel()设置日志器将会处理的日志消息的最低严重级别。
Logger.addHandler()为该logger对象添加handler对象。
Logger.removeHandler()为该logger对象移除handler对象。
Logger.addFilter()为该logger对象添加filter对象。
Logger.removeFilter()为该logger对象移除个filter对象。

怎样得到一个Logger对象呢?

通常用: logger = logging.getLogger()

logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则其值为’root’。

name相同:只要logging.getLogger(name)中name相同,则返回的Logger实例就是同一个,最后logger的输出遵从后来设置的日志级别。

(3)Handler对象常用方法

方法描述
Handler.setLevel()设置handler将会处理的日志消息的最低严重级别。
Handler.setFormatter()为handler设置一个格式器对象。
Handler.addFilter()为handler添加一个过滤器对象。
Handler.removeFilter()为handler删除一个过滤器对象。

一些常用的Handler子类

Handler描述
logging.StreamHandler将日志消息发送到Stream。
logging.FileHandler将日志消息发送到磁盘文件,默认情况下文件大小会无限增长。
logging.handlers.RotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按大小切割。
logging.hanlders.TimedRotatingFileHandler将日志消息发送到磁盘文件,并支持日志文件按时间切割。
logging.handlers.HTTPHandler将日志消息以GET或POST的方式发送给一个HTTP服务器。
logging.handlers.SMTPHandler将日志消息发送给一个指定的email地址。

例如:

con = logging.StreamHandler()

con.setLevel(logging.ERROR)

经常需要将日志消息发送到磁盘文件,并支持日志文件按时间切割:logging.hanlders.TimedRotatingFileHandler的构造函数定义如下:
     TimedRotatingFileHandler(filename[,when [,interval [,backupCount]]])
filename是输出日志文件名,when是一个字符串:

“S”:Seconds

“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight

interval是指等待多少个单位when的时间后,Logger会自动重建文件(这个文件的创建取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件)。

backupCount是保留日志个数,默认的0不会自动删除日志。若设10,则在文件的创建过程中库会判断是否有超过10个,若超过则会从最先创建的开始删除。

(4)Formater对象

Formater对象用于配置日志信息的最终顺序、结构和内容。

例如:

#定义handler的输出格式

format1 =logging.Formatter(“%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s: %(message)s”)

con.setFormatter(format1)

(5)Filter对象

Filter可以被Handler和Logger用来做比level更细粒度的、更复杂的过滤功能。

7.实例

(1)需求

(a)要求将所有级别的日志都写入磁盘文件中

(b)all.log文件中记录所有的日志信息

©error.log文件中单独记录error及以上级别的日志信息

(d)要求all.log,每秒一个log文件,超过10个log就删除。

代码:

import logging
import logging.handlers
import time
import threading
def log_test():
    #1.创建一个logger,设置Log等级总开关
    logger = logging.getLogger('mylogger')
    logger.setLevel(logging.DEBUG)
    
    #2.设置输出到all.log的参数
    f1 = logging.handlers.TimedRotatingFileHandler('D:/st07/error/tmp1/all.log', when='S', 
    interval=1, backupCount=10)
    format1=logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s:%(message)s')
    f1.setFormatter(format1)
    f1.suffix = "%Y-%m-%d_%H-%M-%S.log" 
    
    #3.设置输出到error.log的等级开关和格式
    f2 = logging.FileHandler('D:/st07/error/tmp1/error.log')
    f2.setLevel(logging.ERROR)
    format2 = logging.Formatter("%(asctime)s  %(filename)s[line:%(lineno)d]  %(levelname)s: %(message)s") 
    f2.setFormatter(format2)
    #4.把logger添加到handler里面 
    logger.addHandler(f1)
    logger.addHandler(f2)
    
    #日志
    logger.debug('logger debug message')  
    logger.info('logger info message')  
    logger.warning('logger warning message')  
    logger.error('logger error message')  
    logger.critical('logger critical message')

    #为了测试,重复构造定时器
    global timer
    timer = threading.Timer(1, log_test)
    timer.start()
        
#测试(用定时器来实现)
timer = threading.Timer(1, log_test)
timer.start()

注意:filehanlder.suffix的格式,如果设定是天应该写成“%Y-%m-%d.log”,写成其他格式会导致不能删除旧文件。

查看生成的log文件个数:

(2)在error_test1.py写代码:

import logging  
  
# 创建logger    
logger = logging.getLogger()  
logger.setLevel(logging.DEBUG) 
 
logger1 = logging.getLogger('mylogger')  
logger1.setLevel(logging.INFO)  

logger2 = logging.getLogger('mylogger.child1')  
logger2.setLevel(logging.WARNING)  
 
f = logging.FileHandler('D:/st07/error/tmp/all.log',mode='w')   
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s:%(message)s')  
f.setFormatter(formatter)  
logger.addHandler(f)

f1 = logging.FileHandler('D:/st07/error/tmp/some.log',mode='w')    
f1.setFormatter(formatter)  
logger1.addHandler(f1)
logger2.addHandler(f1)  
# 日志    
logger.debug('logger debug message')  
logger.info('logger info message')  
logger.warning('logger warning message')  


![img](https://i-blog.csdnimg.cn/blog_migrate/137eceb8f227ad120df499693b5465a1.png)
![img](https://img-blog.csdnimg.cn/img_convert/9008b35bbf160825161c54070a3f5550.png)
![img](https://img-blog.csdnimg.cn/img_convert/310bcaa207cddcffa506e96b13bb86c5.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618658159)**

图片转存中...(img-yAKOV1Wc-1715742919112)]
[外链图片转存中...(img-DSRtEXvi-1715742919112)]
[外链图片转存中...(img-k6HTvA8e-1715742919112)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618658159)**

### 如何解决 Homebrew 使用 `curl` 命令时遇到的错误 当尝试通过 `curl` 下载 Homebrew 或其资源时,可能会遇到连接失败的问题。这通常是因为网络不稳定或是 GitHub 被墙所致。针对这种情况,有几种不同的方案可以帮助解决问题。 对于 `curl: (7) Failed to connect` 错误,可以考虑使用国内镜像来代替默认的国外服务器地址进行安装[^1]: ```bash /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" ``` 上述命令利用 Gitee 提供的服务作为代理下载 Homebrew 安装脚本,从而绕过了可能存在的网络障碍[^2]。 另外一种常见的问题是由于 OpenSSL 库引发的 SSL 连接异常(如 `LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54`),此时可以通过更换为清华大学提供的加速源来改善状况[^4]: ```bash git clone git://mirrors.ustc.edu.cn/homebrew-core.git/ /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth=1 cd "$(brew --repo)" git remote set-url origin https://mirrors.ustc.edu.cn/brew.git cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core" git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git ``` 这些操作会将原本指向官方仓库的位置修改为中国境内的镜像站点,有助于提高访问速度并减少因跨境传输带来的不确定性因素影响。 最后,在某些情况下,直接替换整个安装过程也是一个可行的选择。例如下面这条来自 Gitee 的一键式安装指令能够有效规避原始链接不可达的风险[^5]: ```bash /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" ``` 以上方法均能不同程度地缓解乃至彻底消除由 `curl` 所引起的各类问题,使得 Homebrew 可以顺利工作于 macOS 平台上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值