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