Flask使用日志记录到文件示例
flask的日志记录需要用到python标准库logging的支持。
最简单示例:
from flask import Flask
import logging
app = Flask(__name__)
@app.route('/')
def root():
app.logger.info('info log')
app.logger.warning('warning log')
return 'hello'
if __name__ == '__main__':
app.debug = True
handler = logging.FileHandler('flask.log')
app.logger.addHandler(handler)
app.run()
记录到flask.log
中内容为:
info log
warning log
handler = logging.FileHandler('flask.log')
即创建一个log handler,比较常用的有FileHandler
和RotatingHandler
,其中FileHandler
函数原型为
class logging.FileHandler(filename,mode='a',encoding=None,delay=False)
app.logger.addHandler(handler)
即将此handler
加入到此app中
app.logger.info('info log')
即以INFO
级别将'info log'
写入到日志中。
logging
的级别主要有NOTSET
、DEBUG
、INFO
、WARNING
、ERROR
和CRITICAL
,挺容易理解的。
高级一些的示例:
from flask import Flask
import logging
app = Flask(__name__)
@app.route('/')
def root():
app.logger.info('info log')
app.logger.warning('warning log')
return 'hello'
if __name__ == '__main__':
app.debug = True
handler = logging.FileHandler('flask.log', encoding='UTF-8')
handler.setLevel(logging.DEBUG)
logging_format = logging.Formatter(
'%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
handler.setFormatter(logging_format)
app.logger.addHandler(handler)
app.run()
记录到flask.log
中内容为:
2015-08-29 10:12:48,004 - INFO - test.py - root - 9 - info log
2015-08-29 10:12:48,004 - WARNING - test.py - root - 10 - warning log
handler.setLevel(logging.DEBUG)
即设置日志记录最低级别为DEBUG
,低于DEBUG
级别的日志记录会被忽略,不设置setLevel()
则默认为NOTSET
级别。
logging_format = logging.Formatter(
'%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
handler.setFormatter(logging_format)
这两句用来控制日志记录格式,效果如上述记录内容;在Python参考文档中有更详细的说明,这里简单介绍一下:
%(asctime)s
即日志记录时间,精确到毫秒%(levelname)s
即此条日志级别%(filename)s
即触发日志记录的python文件名%(funcName)s
即触发日志记录的函数名%(lineno)s
即触发日志记录代码的行号%(message)s
这项即调用如app.logger.info('info log')中的参数,即message
注意:此示例来自Python 3.4.3 和Flask 0.10.1
<script>胖虎</script>
我想flask启动的日志也打印到日志文件中怎么做
你说的启动日志会写在Linux系统中哟,比如你可以设置你的flask APP为一个service,这样在启动后就能通过systemctl status your_app查看到flask启动日志,通过指定service的某些参数,就能把日志写到指定文件~
请问如何设置成service,我就是想看有些程序我没有捕获异常,然而它报错了,然后日志里没有任何报错信息
抱歉又没看到~
这个是Linux的知识了哟,你可以搜systemctl service了解更多设置方法呢,我就不班门弄斧啦~
我这只打印一要条warning级别的记录,没有打印info级别的记录,这是为啥呀
注意看你有没有设置日志最低级别哟,要是设置最低级别是warning的话那么info是不会记录的呢~
这里是我的运行结果,还是有问题,您能帮我看一下吗
https://m.weibo.cn/1957855171/4240708119869664
不好意思,图在这里
那个输出的意思是执行到了app.logger.warning('warning log'),看样子没报错就是日志记录成功了,这时候应该会在你的pyflask文件夹下有个flask.log文件出现的,我刚才试了下没问题的~
没看到唉,你要不直接给我发邮件?
您好,在参考您的示例代码时,找不到flask.log的输出文件,想问一下文件生成在哪里?
使用 路径拼接,自定义日志文件路径
一般来说是在执行启动flask命令时所在的目录,比如你在~/myFlaskProject/下执行的flask run,那么flask.log文件就在~/myFlaskProject/flask.log。
return self._fmt.find("%(asctime)") >= 0
AttributeError: 'tuple' object has no attribute 'find'
我遇到一个这样的问题
你提供的错误信息比较少,我只能猜一下了。这个错误是logging/init.py报出来的,原因是_fmt格式为tuple没有find()方法。
_fmt的来源实际是代码中的handler.setFormatter(logging_format),接受的参数应当是logging.Formatter,而不是tuple;所以考虑是不是你的代码里logging_format的类型不对,比如忘了给字符串外面套logging.Formatter()了。
抱歉低级错误,复制的时候在 log_format 后面多加了个","
然后 就被当成元组了。。。
不过现在已经添加落地日志成功了
感谢博主