Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 455|回复: 0

python使用logger实现日志回滚和异常捕捉

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-30 11:41:43 | 显示全部楼层 |阅读模式

    日志回滚

    使用logger模块设置日志输出到文件中,使用TimedRotatingFileHandler

    import time import logging import logging.handlers def loghandler(name): #初始化logging
     logging.basicConfig() mylog=logging.getLogger(name) #设置日志级别
     mylog.setLevel(logging.INFO) #添加TimeRoatingFileHandler
        #定义一个1天换一次log文件的handler
        #保留7个旧log文件
        timefilehandler=logging.handlers.TimedRotatingFileHandler("log1/log.log",when='D',interval=1,backupCount=7) timefilehandler.suffix="%Y-%m-%d.log"
    
        #设置log记录输出的格式
        formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(lineno)d-%(message)s') timefilehandler.setFormatter(formatter) #添加到logger中
     mylog.addHandler(timefilehandler) return mylog

     

     程序异常捕捉

    使用traceback statck追踪记录代码异常,格式为:

    try: do-something-block except: logger.exception("Exception Logged")

     

    最终代码:

    import time import logging import logging.handlers def loghandler(name): #初始化logging
     logging.basicConfig() mylog=logging.getLogger(name) #设置日志级别
     mylog.setLevel(logging.INFO) #添加TimeRoatingFileHandler
        #定义一个1天换一次log文件的handler
        #保留7个旧log文件
        timefilehandler=logging.handlers.TimedRotatingFileHandler("log1/log.log",when='D',interval=1,backupCount=7) timefilehandler.suffix="%Y-%m-%d.log"
    
        #设置log记录输出的格式
        formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(lineno)d-%(message)s') timefilehandler.setFormatter(formatter) #添加到logger中
     mylog.addHandler(timefilehandler) return mylog #调用函数,实现日志输出
    log=loghandler('mylog') try: assert 1==2 log.info('hello') except: #实现追踪异常返回信息
        log.exception("Failed to assert 1==2")

    实现捕获异常效果如下:

    小结知识点:

    1、日志记录输出的格式,实例化Formatter类

    属性名称
        格式  
                                           说明  
    name
    %(name)s
    日志的名称
    asctime
    %(asctime)s
    可读时间,默认格式‘2003-07-08 16:49:45,896’,逗号之后是毫秒
    filename
    %(filename)s
    文件名,pathname的一部分
    pathname
    %(pathname)s
    文件的全路径名称
    funcName
    %(funcName)s
    调用日志多对应的方法名
    levelname
    %(levelname)s
    日志的等级
    levelno
    %(levelno)s
    数字化的日志等级
    lineno
    %(lineno)d
    被记录日志在源码中的行数
    module
    %(module)s
    模块名
    msecs %(msecs)d 时间中的毫秒部分
    process
    %(process)d
    进程的ID
    processName
    %(processName)s
    进程的名称
    thread
    %(thread)d
    线程的ID
    threadName
    %(threadName)s
    线程的名称
    relativeCreated
    %(relativeCreated)d
    日志被创建的相对时间,以毫秒为单位

    2、日志级别

    FATAL(致命错误,一般不用)>CRITICAL(严重错误,级别数值50)>ERROR(错误,级别数值40)>WARNING(警告信息,级别数值30)>INFO(日常信息,级别数值20)>DEBUG(调式信息,级别数值10)

    格式为:

    setlevel(logging.INFO)

    3、按照时间日志回滚

    格式:

    TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

    filename :是输出日志文件名的前缀,比如log/myapp.log
    when 是一个字符串的定义如下:
    “S”: Seconds
    “M”: Minutes
    “H”: Hours
    “D”: Days
    “W”: Week day (0=Monday)
    “midnight”: Roll over at midnight
    interval: 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建
    取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以
    有些情况suffix要定义的不能因为when而重复。
    backupCount :是保留日志个数。默认的0是不会自动删除掉日志。若设7,则在文件的创建过程中
    库会判断是否有超过这个7,若超过,则会从最先创建的开始删除。

     

    4、按照文件大小回滚日志

    logging.handlers.RotatingFileHandler('log-day/myDemo.log', maxBytes=1*1024, backupCount=5)

    maxBytes:每个日志文件最大的大小(这里设置1K)

    backupCount: 是保留日志个数。默认的0是不会自动删除掉日志。若设7,则在文件的创建过程中

    库会判断是否有超过这个数,若超过,则会从最先创建的开始删除。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 17:11 , Processed in 0.065928 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表