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")

 

posted @ 2019-08-23 15:51  想扣篮的小矮子  阅读(2109)  评论(0编辑  收藏  举报