logging模块详解以及常见代码
1.在django中获取客户端IP地址:
if 'HTTP_X_FORWARDED_FOR' in request.META: ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR']
2.logging模块日志级别:
DEBUG:最详细的日志信息,典型应用场景是问题诊断; INFO:信息详细程度仅次于DEBUG,通常只记录关键节点信息; WARNING:当某些不期望的事情发生时记录的信息, 如:磁盘可用空间较低,但是此时应用程序还是正常运行的; ERROR:由于一个更严重的问题导致某些功能不能正常运行时记录的信息; CRITICAL:当发生严重错误,导致应用程序不能继续运行时记录的信息. 应用上线或部署生产环境时,应该使用WARNING或ERROR或CRITICAL级别的 日志来降低机器的I/O压力和提高获取错误日志信息的效率.
3.logging模块提供了两种记录日志的方式:
第一种方式是使用logging提供的模块级别的函数;
第二种方式是使用Logging日志系统的四大组件.
4.模块级别的常见代码:
import logging LOG_FORMAT = "%(asctime)s %(levelname)s %(pathname)s %(message)s "#配置输出日志格式 DATE_FORMAT = '%Y-%m-%d %H:%M:%S %a ' #配置输出时间的格式,注意月份和天数不要搞乱了 logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt = DATE_FORMAT , filename=r"d:\test\test.log" ) logging.debug("msg1") logging.info("msg2") logging.warning("msg3") logging.error("msg4") logging.critical("msg5")
5.日志流处理--常见代码:
def set_log(level, filename='minic_down.log',filedir='/data/update/'): log_file = os.path.join(filedir, filename) if not os.path.isdir(filedir): os.makedirs(filedir) if not os.path.isfile(log_file): os.mknod(log_file) log_level_total = {'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARN, 'error': logging.ERROR, 'critical': logging.CRITICAL} logger_f = logging.getLogger() logger_f.setLevel(logging.DEBUG) fh = logging.FileHandler(log_file) fh.setLevel(log_level_total.get(level, logging.DEBUG)) formatter = logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) logger_f.addHandler(fh) return logger_f # 日志记录器 logger = set_log('debug')
6.说明
Logger类:
1.向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息; 2.将日志消息传送给所有感兴趣的日志handlers. 我们通常用logging.getLogger()方法创建一个Logger类的实例, 有一个可选参数name,该参数表示将要返回的日志器的名称标识, 如果不提供该参数,则其值为'root'. 注意不能创建多个logger,否则会出现重复输出日志现象, Logger.setLevel():设置日志器处理日志消息的最低严重级.
Handler类:
Handler对象的作用是(基于日志消息的level)将消息分发到handler指定的位置(文件、网络、邮件等). Logger对象可以通过addHandler()方法为自己添加0个或者更多个handler对象. 比如一个应用程序可能想要实现以下几个日志需求: 1.把所有日志都发送到一个日志文件中; 2.把所有严重级别大于等于error的日志发送到stdout(标准输出); 3.把所有严重级别为critical的日志发送到一个email邮件地址.这种场景就需要3个不同的handlers, 每个handler负责发送一个特定级别的日志到一个特定的位置. Handler.setLevel():指定被处理的信息级别,低于lel级别的信息将被忽略; Handler.setFormatter():给这个handler选择一个格式. logging.StreamHandler--将日志消息发送到输出到Stream logging.FileHandler--将日志消息发送到磁盘文件
7.日志流处理简要流程:
1.创建一个logger 2.设置下logger的日志的等级 3.创建合适的Handler(FileHandler要有路径) 4.设置下每个Handler的日志等级 5.创建下日志的格式 6.向Handler中添加上面创建的格式 7.将上面创建的Handler添加到logger中 8.打印输出logger.warning\logger.error\logger.critical 如果出现重复写日志,则使用前先判断是否有相同的handler对象 如果logger.handlers列表为空,则添加;否则,直接去写日志 def my_logger(logger_name): logger = logging.getLogger(logger_name) logger.setLevel(logging.INFO) if not logger.handlers: fh = logging.FileHandler('hehe.log') formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s ') fh.setFormatter(formatter) logger.addHandler(fh) return logger
8.捕获 Traceback
try: result = 10 / 0 except Exception: logger.error('Faild to get result', exc_info=True) logger.info('Finished')
参考地址:https://cuiqingcai.com/6080.html
参考地址:https://www.cnblogs.com/liujiacai/p/7804848.html
参考地址:https://www.cnblogs.com/Nicholas0707/p/9021672.html