简单的单个日志文件
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt='%m-%d %H:%M',
filename='/temp/myapp.log',
filemode='w')
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)
Python的logging.config.fileConfig方式配置日志,通过解析conf配置文件实现。
文件 logglogging.conf 配置如下:
#logger.conf
#Configure loggers info
[loggers]
keys=root,log
#Default logger
[logger_root]
level=DEBUG
handlers=stream
#Custom Log
[logger_log]
level=DEBUG
handlers=stream,timedrt
#Define app name
qualname=log
#Prevent log records from being passed to the upper logger
propagate=0
#Define declaration handlers information
[handlers]
keys=stream,timedrt
#Export log information to stream,such as sys.stderr
[handler_stream]
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stderr,)
#Save log information to file and create a file every day
[handler_timedrt]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=form01
#Initialization parameters
args=('logs/log.log', 'd', 1 , 7)
#Define formatted output
[formatters]
keys=form01
[formatter_form01]
#Specific output format
format=[%(asctime)s] %(levelname)s [%(funcName)s: %(filename)s, %(lineno)d] %(message)s
datefmt=%Y-%m-%d %H:%M:%S
可以设置向HTTP服务器发送数据,通常在一个分布式的环境中,我们会选择实现一个HTTP接口用来接收来自各个网络组件的日志。
[handler_http]
class=handlers.HTTPHandler
level=NOTSET
formatter=form02
args=('localhost:9022', '/log', 'GET')
- loggers : 配置logger信息。必须包含一个名字叫做root的logger,当使用无参函数logging.getLogger()时,默认返回root这个logger,其他自定义logger可以通过 logging.getLogger(“fileLogger”) 方式进行调用
- handlers:定义声明handlers信息。常用的handlers包括 StreamHandler(仅将日志输出到kong控制台)、FileHandler(将日志信息输出保存到文件)、RotaRotatingFileHandler(将日志输出保存到文件中,并设置单个日志wenj文件的大小和日志文件个数)
- formatter : 设置日志格式
- logger_xxx : 对loggers中声明的logger进行逐个配置,且要一一对应
- handler_xxx : 对handlers中声明的handler进行逐个配置,且要一一对应
- formatter_xxx : 对声明的formatterjinx进行配置
使用方法:
import logging
import logging.config
logging.config.fileConfig(“logging.conf”)
logging.config.fileConfig(os.path.join(os.path.dirname(os.path.abspath(__file__)), r"log.conf"), defaults=None,
disable_existing_loggers=True)
#配置文件中的qualname 不填默认为root
logger = logging.getLogger("log")
工程中我们使用一个名字为config.py的Python模块用来保存全局的配置,由于logging在工程中每个源代码文件都可能用到,因此我们把logging模块在config.py中生成一个实例,这样其它模块只需要引用这个实例就可以了。
import logging
import logging.config
config = { "key1":"value1" }
logging.config.fileConfig("logger.conf")
logger = logging.getLogger("cse")
在其它模块中,我们使用这样的语句引用logger对象:
from config import logger
友情提示
-
进行以上配置后,在项目中需要进行日志输出的地方通过logging.getLogger()方式就可以获取到对应的logger,然后就可以使用logger.info(“xxx”)jinx进行日志输出了。
-
使用这种方式配置日志,一定要在项目的入口函数中就调用 logging.config.fileConfig(“logging.conf”)函数,因为 logging.conf 文件中,在handler中配置的是日志文件的相对地址,如果在其他代码文件中进行调用,由于相对地址的原因,将导致日志文件会出现在意想不到的位置。
日志的级别
日志系统通常有下面几种级别,看情况是使用
- FATAL - 导致程序退出的严重系统级错误,不可恢复,当错误发生时,系统管理员需要立即介入,谨慎使用。
- ERROR - 运行时异常以及预期之外的错误,也需要立即处理,但紧急程度低于FATAL,当错误发生时,影响了程序的正确执行。需要注意的是这两种级别属于服务自己的错误,需要管理员介入,用户输入出错不属于此分类。
- WARN - 预期之外的运行时状况,表示系统可能出现问题。对于那些目前还不是错误,然而不及时处理也会变成错误的情况,也可以记为WARN,如磁盘过低。
- INFO - 有意义的事件信息,记录程序正常的运行状态,比如收到请求,成功执行。通过查看INFO,可以快速定位WARN,ERROR, FATAL。INFO不宜过多,通常情况下不超过TRACE的10%。
- DEBUG - 与程序运行时的流程相关的详细信息以及当前变量状态。
- TRACE - 更详细的跟踪信息。DEBUG和TRACE这两种规范由项目组自己定义,通过该种日志,可以查看某一个操作每一步的执行过程,可以准确定位是何种操作,何种参数,何种顺序导致了某种错误的发生
值得一提的是,logging模块是线程安全的。