错误示范
代码语言:javascript复制import logging
log = logging.getLogger()
log.setLevel(logging.INFO)
log.info("INFO INFO INFO")
log.warning("这是WARN")
代码语言:javascript复制# 输出
D:workspaceinvestmentvenvScriptspython.exe D:/workspace/python-common/basic/logging_test.py
这是WARN
没有输出INFO的日志级别。默认是WARN级别的日志,这里没有输出WARN说明没有设置成功。
设置一个handler
代码语言:javascript复制import logging
if __name__ == '__main__':
log = logging.getLogger()
handler = logging.StreamHandler()
log.addHandler(handler)
log.setLevel(logging.INFO)
log.info("这是INFO-1")
这时可以正常输出INFO了
logging.getLogger() 和 logging.getLogger(name)
代码语言:javascript复制import logging
if __name__ == '__main__':
log = logging.getLogger()
handler = logging.StreamHandler() # StreamHandler是输出到控制台
log.addHandler(handler)
log.setLevel(logging.INFO)
log.info("这是INFO-1")
logger = logging.getLogger()
logger.info("这是INFO-2")
此时第二个logger也被设置了INFO级别了,查看源码:
可以看到名字为None时返回的是一个root对象,这也是为什么第二个logger也被修改的原因。
日志输出位置
常见的输出到控制台和文件
代码语言:javascript复制import logging
if __name__ == '__main__':
log = logging.getLogger("console-logger")
handler = logging.StreamHandler()
log.addHandler(handler)
log.setLevel(logging.INFO)
log.info("这是INFO-1")
log2 = logging.getLogger("file-logger")
file_handler = logging.FileHandler("E:/test.log")
log2.addHandler(file_handler)
log2.setLevel(logging.WARNING)
log2.info("这个不会被记录")
log2.warning("警告警告~~~~")
设置格式
默认只是输出了message,这样子还不如直接用print()函数了。所以还需要格式化一下:
设置格式化要用到logging.Handler
代码语言:javascript复制import logging
def print_name(logger, name):
logger.info("name={}".format(name))
if __name__ == '__main__':
log = logging.getLogger("console-logger")
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter("%(asctime)s %(filename)s %(funcName)s[line:%(lineno)d]%(levelname)s - %(message)s"))
log.addHandler(handler)
log.setLevel(logging.INFO)
log.info("这是INFO-1")
print_name(log, "happyjava")
复制代码
输出效果:
formatter参数:
代码语言:javascript复制# format参数中可能用到的格式化串
# %(name)s 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用户输出的消息