【问题标题】:Flask - How to store logs and add additional informationFlask - 如何存储日志和添加附加信息
【发布时间】:2016-01-06 12:04:30
【问题描述】:

我想将“werkzeug”输出存储在一个文件中(或创建一个类似的日志文件),并向每一行日​​志添加额外的数据。 (例如用户名的值,如果该值在会话中已知)

如何进行?如果会话中不知道用户名,我希望用户是“未知的”。

是否可以在执行 app.run() 之前定义所有内容? (因为我在 app.run 之前尝试使用会话对象时确实遇到了“在请求上下文之外工作”错误)

class UserIDFilter(logging.Filter):
    """
    This is a filter which injects contextual information into the log.
    """
    from flask import session
    def filter(self, record):
        username = session.get('username','unknown')
        record.user_id = username
        return True


logFormatStr = '%(asctime)s - %(levelname)s - %(message)s'
logging.basicConfig(filename='output.log',format = logFormatStr, level=logging.DEBUG)
app.run(debug=True)

我关于 app.run 的问题是了解程序如何能够访问存储在会话中的用户值。 (我想也许我必须在定义日志记录之前启动“app.run”。)

对我来说,最好的答案是一个 Hello World 示例,其中用户名存储在会话中,并带有一个添加了该信息的日志文件(类似于 werkzeug)。

【问题讨论】:

    标签: python logging web-applications flask flask-login


    【解决方案1】:

    您的问题中有几个问题。

    对于第一个,您可以在此处查看文档:LoggingLogging to a File

    对于第二个,你可以使用session.get('someone', 'unknown'),如果'someone'不在会话中,则返回'unknown',否则它只返回值。

    最后一个。 app.run() 用于启动开发服务器,define everything before doing app.run() 是什么意思。只有错误可能不是很有帮助,显示一些代码并粘贴完整的错误日志。

    一个基本的flask登录示例:

    from flask import Flask, session
    
    import logging
    from logging import Formatter, FileHandler
    
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def index():
        user_name = session.get('Hello, world', 'unknown')
        app.logger.debug('Say somethind here'.format(
            user_name, extra={'username': user_name}))
        return 'Hello, {0}.'.format(user_name)
    
    
    if __name__ == '__main__':
        file_handler = FileHandler('app.log')
        file_handler.setLevel(logging.DEBUG)
        file_handler.setFormatter(
            Formatter('%(asctime)s %(levelname)s %(username)s: %(message)s'))
        app.logger.addHandler(file_handler)
        app.run(debug=True)
    

    当你运行应用程序时,你会在同一目录中找到一个app.log 文件,内容为:

    2016-01-07 20:19:09,636 DEBUG unknown: say something here
    

    【讨论】:

    • 感谢您的回答,我已经检查了文档,但我无法弄清楚如何在没有“basicConfig”或在格式字符串中添加内容时使其工作。提前感谢您的帮助:)
    • 我只想在日志中添加一个用户名(在会话变量中定义的用户名),我想了解如何操作。当我没有 basicConfig 时,我的日志文件中没有任何内容。
    • @DavidK 更新了答案,你想要吗?
    • 谢谢,我想要 '%(asctime)s %user (levelname)s: %(message)s' 的每一行(内部)的用户名,不知道时不知道。
    • 据我所知,没有日志格式可以在每个日志中添加用户名,需要手动添加。 unknow when not known 是什么意思,在我的示例中,当用户不在会话中时它是“未知的”。
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多