python3 输出日志的正确打开方式(一)

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

猜你喜欢

转载自blog.csdn.net/hhd1988/article/details/108650152