zoukankan      html  css  js  c++  java
  • python 添加日志详解

    官方文档 猛戳这里

    在settings中配置以下代码

    #LOGGING_DIR 日志文件存放目录
    LOGGING_DIR = "logs"   # 日志存放路径
    if not os.path.exists(LOGGING_DIR):
        os.mkdir(LOGGING_DIR)
    
    import logging
    
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {  #格式化器
            'standard': {
                'format': '[%(levelname)s][%(asctime)s][%(filename)s][%(funcName)s][%(lineno)d] > %(message)s'
            },
            'simple': {
                'format': '[%(levelname)s]> %(message)s'
            },
        },
        'filters': {
            'require_debug_true': {
                '()': 'django.utils.log.RequireDebugTrue',
            },
        },
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'filters': ['require_debug_true'],
                'class': 'logging.StreamHandler',
                'formatter': 'simple'
            },
            'file_handler': {
                 'level': 'INFO',
                 'class': 'logging.handlers.TimedRotatingFileHandler',
                 'filename': '%s/django.log' % LOGGING_DIR,  #具体日志文件的名字
                 'formatter':'standard'
            }, # 用于文件输出
            'mail_admins': {
                'level': 'ERROR',
                'class': 'django.utils.log.AdminEmailHandler',
                 'formatter':'standard'
            },
        },
        'loggers': {   #日志分配到哪个handlers中
            'mydjango': {
                'handlers': ['console','file_handler'],
                'level':'DEBUG',  
                'propagate': True,
            },
            'django.request': {
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': False,
            },
        ####如果要将get,post请求同样写入到日志文件中,则这个触发器的名字必须叫django,然后写到handler中 } }

    在settings中写完配置之后,下面就要具体到相应的视图函数中了。注意:这里我们在实施到具体函数或方法的时候需要手动捕获异常

    然后视图函数中

    #这里我们模拟一个登陆来写
    
    log = logging.getLogger('mydjango')  #这里的mydjango是settings中loggers里面对应的名字
    
    
    class Login(View):
        def get(self,request):
            return render(request,'login.html')
        def post(self,request):
            user = request.POST.get('username')
            pwd = request.POST.get('password')
            try:
                s = 1/0
            except Exception as e:
                log.error(e)

    如果是编写脚本,则需要手动配置logging的属性

    以下是demo:

    # ------------log信息------------
    sep = os.sep
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s -- %(pathname)s[line:%(lineno)d] -- %(levelname)s -- %(message)s')
    
    logDir = os.path.join(os.getcwd(), 'log')
    if not os.path.exists(logDir):
        os.mkdir(logDir)
    logName = time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.log'
    logPath = logDir + sep + logName
    
    fileHandler = logging.FileHandler(logPath)
    fileHandler.setLevel(logging.DEBUG)
    fileHandler.setFormatter(formatter)
    
    logger.addHandler(fileHandler)
    
    # 使用时只需要将logger对象导入
    try:
        int("你猜我猜不猜")
    except Exception as e: logger.error(e)

    我一般是这么用到脚本中的

    def reload_log():
        '''加载日志配置'''
        logger = logging.getLogger(__name__)
        logger.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(asctime)s -- %(pathname)s[line:%(lineno)d] -- %(levelname)s -- %(message)s')
    
        logDir = os.path.join(os.getcwd(), 'openvasLog')
        if not os.path.exists(logDir):
            os.mkdir(logDir)
        logName = time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.log'
        logPath = logDir + os.sep + logName
    
        if not os.path.exists(logPath):
            os.system("touch {}".format(logPath))
    
        fileHandler = logging.FileHandler(logPath)
        fileHandler.setLevel(logging.DEBUG)
        fileHandler.setFormatter(formatter)
    
        logger.addHandler(fileHandler)
        return logger

    还有一个模块包,可以记录详细位置的报错信息

    import traceback
    
    try:
        1/0
    except:
        # logger --> 上面实例化的logger对象
        logger.error(traceback.format_exc())
        

    备注: 如果sql执行错误,记得要回滚,rollback

    出现此错误: cursor.execute(sql)

    InFailedSqlTransaction: current transaction is aborted, commands ignored until end of transaction block

    本人用的以下解决方法:(详情参考:https://blog.csdn.net/hantiannan/article/details/4590259

    import psycopg2
    
    psql = psycopg2.connect(database="", user="", password="", host="", port="")
    cursor = psql.cursor()
    try:
        cursor.execute("insert into xxx xx values xx;")
    except:
        psql.rollback()
        logger.error("xxxxx")
  • 相关阅读:
    【20211112】学习,为自己,也为别人
    【20211109】计划会使人拥有魔力
    【20211110】责任是不确性的克星
    【20211113】因材施教
    【20211119】责任能使人变得难以置信
    【20211115】连岳摘抄
    【20211106】连岳摘抄
    c#中用正则过滤所有标点符号
    带农历的JavaScript日期时间
    JQuery常用方法一览
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/11400215.html
Copyright © 2011-2022 走看看