Python中的日志模块

最简单的用法:

import logging

logging.debug("logging debug")
logging.info("logging info")
logging.warning("user [qianduoduo] attempted wrong password more than 3 times")
logging.error("logging error")
logging.critical("logging critical")

#输出
WARNING:root:user [qianduoduo] attempted wrong password more than 3 times
ERROR:root:logging error
CRITICAL:root:logging critical  #root  就是默认的用户名 

重点:为什么上面debug和info没有输出,那是因为一个模块默认的日志级别是warning,比他级别低的就不会输出

 

把日志写到文件系统里

import logging

logging.basicConfig(filename='duoduo.log',
                    level=logging.DEBUG,
                    format='%(asctime)s %(message)s',#asctime字符串形式的当前时间,message用户输出的消息
                    datefmt='%Y-%m-%d %I:%M:%S %p ')
logging.debug("logging debug")
logging.info("logging info")
logging.warning("user [qianduoduo] attempted wrong password more than 3 times")
logging.error("logging error")
logging.critical("logging critical")

#输出到文件‘duoduo.log’
2018-01-27 07:33:30 PM  logging debug
2018-01-27 07:33:30 PM  logging info
2018-01-27 07:33:30 PM  user [qianduoduo] attempted wrong password more than 3 times
2018-01-27 07:33:30 PM  logging error
2018-01-27 07:33:30 PM  logging critical

 

format的日志格式

 

Logger的名字

%(levelno)s

数字形式的日志级别

%(levelname)s

文本形式的日志级别

%(pathname)s

调用日志输出函数的模块的完整路径名,可能没有

%(filename)s

调用日志输出函数的模块的文件名

%(module)s

调用日志输出函数的模块名

%(funcName)s

调用日志输出函数的函数名

%(lineno)d

调用日志输出函数的语句所在的代码行

%(created)f

当前时间,用UNIX标准的表示时间的浮 点数表示

%(relativeCreated)d

输出日志信息时的,自Logger创建以 来的毫秒数

%(asctime)s

字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒

%(thread)d

线程ID。可能没有

%(threadName)s

线程名。可能没有

%(process)d

进程ID。可能没有

%(message)s

用户输出的消息

 

通过配置文件配置log

{
    "version":1,
    "disable_existing_loggers":false,
    "formatters":{
        "simple":{
            "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        }
    },
    "handlers":{
        "console":{
            "class":"logging.StreamHandler",
            "level":"DEBUG",
            "formatter":"simple",
            "stream":"ext://sys.stdout"
        },
        "info_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"INFO",
            "formatter":"simple",
            "filename":"logs/info.log",
            "maxBytes":10485760,
            "backupCount":20,
            "encoding":"utf8"
        },
        "error_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"ERROR",
            "formatter":"simple",
            "filename":"logs/errors.log",
            "maxBytes":10485760,
            "backupCount":20,
            "encoding":"utf8"
        }
    },
    "loggers":{
        "my_module":{
            "level":"DEBUG",
            "handlers":["info_file_handler"],
            "propagate":"no"
        }
    },
    "root":{
        "level":"INFO",
        "handlers":["console","info_file_handler","error_file_handler"]
    }
}

 在程序中引用

import json
import logging
import logging.config
import os

def setup_logging(default_path="logging.json", default_level=logging.INFO, env_key="LOG_CFG"):
    path = default_path
    value = os.getenv(env_key, None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path, "r") as f:
            config = json.load(f)
            logging.config.dictConfig(config)
    else:
        logging.basicConfig(level=default_level)


if __name__ == "__main__":
    setup_logging(default_path="logging.json")

 

posted @ 2018-04-06 20:28  IT胖子  阅读(174)  评论(0编辑  收藏  举报