python中输出日志的形式一般有两种,一是简单的输出到终端,二是保存到文件中,而针对这些日志形式所选用的方式也多种多样。
1、最简单的方式
print("testtesttest")
2、使用logging.config.fileConfig()
使用配置文件的方式可以将日志配置和代码分离,方便代码的维护和日志独立管理,更加灵活。
创建配置文件
使用logging.config.fileConfig(),首先要创建配置文件,例如log.conf,添加如下内容。
#log.conf
###################keys#########################
[loggers]
keys=root,file,fileAndConsole,rotatingFile
[handlers]
keys=consoleHandler,timedRotatingFileHandler,rotatingFileHandler
[formatters]
keys=simpleFormatter
###################logger#########################
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_file]
level=DEBUG
handlers=timedRotatingFileHandler
qualname=file
propagate=0
[logger_fileAndConsole]
level=DEBUG
handlers=consoleHandler,timedRotatingFileHandler
qualname=fileAndConsole
propagate=0
[logger_rotatingFile]
level=DEBUG
handlers=rotatingFileHandler
qualname=rotatingFile
propagate=0
###################handler#########################
[handler_consoleHandler]
class=StreamHandler
args=(sys.stdout,)
level=DEBUG
formatter=simpleFormatter
#
[handler_timedRotatingFileHandler]
class=handlers.TimedRotatingFileHandler
args=('/log/app.log', 'D', 1, 31)
level=DEBUG
formatter=simpleFormatter
#
[handler_rotatingFileHandler]
class=handlers.RotatingFileHandler
args=('log/app2.log', 'a', 20 * 1024 * 1024, 10)
level=DEBUG
formatter=simpleFormatter
###################formatter#########################
[formatter_simpleFormatter]
format=%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s
datefmt=%Y-%m-%d %H:%M:%S
配置文件说明
1. 在以上配置文件中,包含了logging要使用的三大模块,loggers, handlers, formatters。三个模块包含的内容都是通过keys指定,再通过logger_key/handler_key/formatter_key对里面的key进行具体的配置。
2. loggers配置的是logger模块,其中必须包含一个叫做root的logger,如果在应用程序中,使用无参函数logging.getLogger()时,默认返回的是root的logger,其他自定义的logger通过 logging.getLogger("name") 进行相应设置。
3. handlers配置的是handlers模块,也是通过keys指定。在其中可以设置日志的输出方式、日志的级别、日志的格式等。
4. formatters配置的是日志内容的格式。
5. logger_***对loggers中声明的logger进行逐个配置,必须要一一对应,在所有的logger中,必须设置level和handlers选项。对于非root handler,要添加额外的选项
- handlers:可以指定多个,中间用逗号隔开,比如handlers=consoleHandler,timedRotatingFileHandler,同时设置使用控制台和文件输出日志
- qualname:表示它在logger层级中的名字,在应用代码中通过这个名字找到所使用的handler,即 logging.getLogger("fileAndConsole")。
- propagate:通常设为零,当在handlers中设置多个处理器时,就不会多次打印日志信息。
6. handler_***在handler中,必须指定class和args选项
常用的class包括:
- logging.StreamHandler 可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息
- logging.FileHandler 用于向一个文件输出日志信息
- logging.handlers.RotatingFileHandler 类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出
- logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件
参数含义和顺序:
- logging.handlers.SocketHandler 使用TCP协议,将日志信息发送到网络。
- logging.handlers.DatagramHandler 使用UDP协议,将日志信息发送到网络。
- logging.handlers.SysLogHandler 日志输出到syslog
- logging.handlers.NTEventLogHandler 远程输出日志到Windows NT/2000/XP的事件日志
- logging.handlers.SMTPHandler 远程输出日志到邮件地址
- logging.handlers.MemoryHandler 日志输出到内存中的制定buffer
- logging.handlers.HTTPHandler 通过"GET"或"POST"远程输出到HTTP服务器
注:各个Handler的具体用法可查看参考书册:
https://docs.python.org/2/library/logging.handlers.html#module-logging.handlers
args表示传递给class所指定的handler类初始化方法参数,它必须是一个元组(tuple)的形式,即便只有一个参数值也必须是一个元组的形式;里面指定输出路径,比如输出的文件名称等。
level与logger中的level一样
formatter是该处理器所使用的格式器,这里格式器名称必须出现在formatters这个section中,且在配置文件中必须要有这个formatter的section定义;如果不指定formatter则该handler将会以消息本身作为日志消息进行记录,而不添加额外的时间、日志器名称等信息;
7. formatter_***:设置日志内容的格式
配置文件使用
在同级目录下创建log.py文件,写入如下代码
import logging.config
CONF_LOG = "log.conf"
#load config file
logging.config.fileConfig(CONF_LOG)
# create logger
# logger:file,fileAndConsole,rotatingFile
logger = logging.getLogger("fileAndConsole")
# "application" code
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")