Django Logger记录格式化日志,可通过弹性搜索进行解析,并通过Kibana进行可视化。

easy-django-logger的Python项目详细描述


记录


< Buff行情>

日志记录是为了记住代码所做的事情,以防有一天忘记它! 除了发现错误/理解行为/文档和更好的可视化之外。

< Buff行情>

~sarvadim(第0章,第010节)

Django_记录器


django_logger是一个具有超级能力的python日志库。它利用python 记录以记录任何内容并按照django设置中的配置对其进行格式化, 它可以通过弹性搜索进行解析,并在Kibana中可视化。

默认实现使用streamhandler()并将所有消息发送到stdout。目前支持django>;=1.9。

使用django_logger,您可以:

  • 设置您自己的日志格式,以特定格式记录所有日志。
  • 只使用decorator来记录函数输入/输出
  • 在"设置"或"装饰"中指定要在日志中隐藏的参数值@functionlogger(secure_args=['password'])
  • 可以设置邮件记录器,将日志邮件发送到django设置文件中配置的admins 从日志记录到标准输出
  • 在"设置"中以日志格式设置参数,该设置将始终记录在每个日志和 只在其值发生更改时全局设置一次。
  • 还有更多…

更改日志


0.1.0

  • 函数记录器退出日志因对象类型的响应而中断-已修复
  • 删除了对CrequestMiddleware库的依赖,以保留全局日志, 现在可以在任何地方设置全局日志变量。
  • 通过传递{key:value},可以同时设置所有全局日志变量。
  • 增加了对django 1.8的支持
  • 解决了上传到pypi repo的小问题。
  • 支持Django 1.9
  • 增加了对Python2.7的支持

安装


pip install django-logger

快速启动


  1. 在django设置文件中添加django记录器。

     DJANGO_LOGGER = {
         "APP_NAME": "YOUR_APP_NAME",
         "LOGGER_NAME": "YOUR_LOGGER_NAME",
         "MAIL_LOGGER_NAME": "YOUR_MAIL_LOGGER_NAME",
         "NAMESPACE_KEY": "YOUR_APP_NAME_DATA", # optional, default: <APP_NAME>_DATA
         "SECURE_PARAMS": ('any_secure_param',), # optional, default: ()
         "LOGGING_FORMAT": {} # optional, default: {}
     }
    
  2. 将这两行添加到设置文件的末尾。

     import django_logger
    
     LOGGING = django_logger.LOGGING_FORMAT
    
  3. 测试-打开shellpython manage.py shell

     import logging
     logger = logging.getLogger('YOUR_LOGGER_NAME')
     mail_logger = logging.getLogger('YOUR_MAIL_LOGGER_NAME')
    
     logger.info('It worked..') # should print log in screen 
     mail_logger.info('It's working..') # print log and ADMINS defined in settings should get a mail too 
                                        # provided proper mail settings are in django
    
  4. 快乐的伐木。更深入地了解。

  5. < > >

    配置


    让我们逐个查看下面的django_logger配置中的每个"键":

    DJANGO_LOGGER = {
        "APP_NAME": "APP_EX",
        "LOGGER_NAME": "LOGGER_EX",
        "MAIL_LOGGER_NAME": "MAIL_LOGGER_EX",
        "NAMESPACE_KEY": "APP_DATA_EX",
        "SECURE_PARAMS": ('password_ex',),
        "LOGGING_FORMAT": {
            # TWO DIFFERENT KEYS WITH SAME NAME BUT DIFFERENT CASE CAN ALSO BE SET
            # AVOID DOING THAT FOR CONSISTENCY BUT YES YOU HAVE FREEDOM TO DO THAT
            # FOR EX. `C` IN BELOW FORMAT
    
            "INT_KEY": int,
            "FLOAT_KEY": float,
            "C": str,
            "f": {
                'a': str,
                'b': int,
                'c': {
                    'c': {},  # for storing dict, if you will give `dict`
                              # it will be assumed as <str>
                    'd': dict, # will be assumed as <str>
                }
            },
    
        }
    }
    

    现在让我们打印此日志:

    import logging
    logger = logging.getLogger('LOGGER_EX')
    logger.info("Just an example.")
    

    这将在控制台上打印为:

    {"FUNCTION":"<module>","TRACE":"","LEVEL":"INFO","APP":"APP_EX","TIME":"2018-03-09T17:06:45.975+05:30","PATH":"<ipython-input-3-6017132af706>","LOGGER":"LOGGER_EX","LINE":1,"APP_DATA_EX":{"C":"","FLOAT_KEY":"0.00","INT_KEY":"0","MESSAGE":{"TEXT": "Just an example."},"f":{"a":"","c":{"c":"{}","d":""},"b":0}}}
    
    • app_name:将在日志中使用的应用程序的名称-app_ex
    • logger_name:用于获取此logger配置的logger的名称-logger_ex
    • 邮件记录器名称:邮件记录器的名称。
    • 命名空间密钥:用于抛出所有日志数据的密钥名称。-应用程序数据
    • secure_params:在使用函数decorator记录输入输出时使用 为了隐藏(记录"***"而不是实际值)这里给出的元组参数。参见[示例]
    • logging_format:这定义了实际的日志格式,在key<;namespace_key>;中,例如app_data_ex
    日志记录格式

    这需要是dict,并且应该包含您希望在所有日志中使用的键(format<;key\u name>;:type) 让我们考虑一个用例-

    您有一个应用程序服务,它获取一个人的详细信息,验证并将其发送到另一个服务以预订贷款 如果验证失败,则抛出错误。

    现在在您的验证服务中,您有许多验证函数(name、aadhar、cibil, 出生日期等)。为了根据请求筛选日志,或者如果 验证失败,然后查找哪个验证器失败。

    你可以每次都记录"pan_number"在每个函数中传递它 或在日志记录格式中的django_logger设置中将其配置为:

        DJANGO_LOGGER = {
            "APP_NAME": "APP_EX",
            "LOGGER_NAME": "LOGGER_EX",
            "MAIL_LOGGER_NAME": "MAIL_LOGGER_EX",
            "NAMESPACE_KEY": "APP_DATA_EX",
            "SECURE_PARAMS": ('password_ex',),
            "LOGGING_FORMAT": {
                    "PAN": <str>
                }
        }
    

    现在,每次记录任何内容时,都会有一个键pan并默认为"",因为这是一个字符串。

    logger = logging.getLogger('LOGGER_EX')
    logger.info("Validating aadhar..")
    

    它记录,检查键app_data_ex

    pip install django-logger
    
    0

    注意:float、int、dict(指定为{})类型的默认值分别为0.0、0和{}。

    现在要在它到达时全局设置这个pan 全局设置的pan的up值。它可以设置为:

    pip install django-logger
    
    1

    注意:当设置全局日志时,因为这些日志存储在当前线程键下,请确保清除全局日志 请求/处理的退出点前后为:

    pip install django-logger
    
    2

    所以它所做的是清除全局日志,这样就不会为了安全起见从以前的进程中提取全局日志变量。 它还有助于保持全局日志的干净。如果你的切入点是芹菜任务,那么你可以写一个前置和后置 芹菜信号,在执行任何任务之前和之后清除全局日志。对于EX:

    pip install django-logger
    
    3

    现在,当您要记录任何内容时,在设置好后,它将始终记录平移。

    logger = logging.getLogger('LOGGER_EX')
    logger.info("Validating aadhar..")
    

    它记录,检查键app_data_ex

    pip install django-logger
    
    5

    同样,可以在logger_format中设置复杂配置来记录复杂数据。普通文本日志进入app_data_ex['message']['text']键。

    装饰工

    当我们想知道代码的行为时,通常是这样的 当它进入任何函数时,传递的参数和返回的内容。 要做到这一点,只需将decorator@functionlogger()放在函数上方即可。

    注意:将这个decorator放在其他decorator的末尾,例如

    pip install django-logger
    
    6

    现在,您可能不想记录某些参数的值,如密码、用户名、api_密钥、第三方_密钥、oauth_密钥等。 为此,请在元组的secure_params下的设置中设置参数名,或者 将decorator中的参数名称传递为@functionlogger(secure_args=['password']),该参数值将记录为"****"

    例如:

    pip install django-logger
    
    7

    正如您在日志中看到的,它将用户名密码记录为"****",而不是文本

    示例:


    配置:

    pip install django-logger
    
    8

    python manage.py shell中执行所有这些操作

    pip install django-logger
    
    9
    1. 日志简单警告:

       DJANGO_LOGGER = {
           "APP_NAME": "YOUR_APP_NAME",
           "LOGGER_NAME": "YOUR_LOGGER_NAME",
           "MAIL_LOGGER_NAME": "YOUR_MAIL_LOGGER_NAME",
           "NAMESPACE_KEY": "YOUR_APP_NAME_DATA", # optional, default: <APP_NAME>_DATA
           "SECURE_PARAMS": ('any_secure_param',), # optional, default: ()
           "LOGGING_FORMAT": {} # optional, default: {}
       }
      
      0
    2. 带有一些参数的日志:

      注意:键消息kwargs必须在那里,否则它们将不会被记录。

       DJANGO_LOGGER = {
           "APP_NAME": "YOUR_APP_NAME",
           "LOGGER_NAME": "YOUR_LOGGER_NAME",
           "MAIL_LOGGER_NAME": "YOUR_MAIL_LOGGER_NAME",
           "NAMESPACE_KEY": "YOUR_APP_NAME_DATA", # optional, default: <APP_NAME>_DATA
           "SECURE_PARAMS": ('any_secure_param',), # optional, default: ()
           "LOGGING_FORMAT": {} # optional, default: {}
       }
      
      1
    3. 为具有args和kwargs的函数记录入口-出口。

       DJANGO_LOGGER = {
           "APP_NAME": "YOUR_APP_NAME",
           "LOGGER_NAME": "YOUR_LOGGER_NAME",
           "MAIL_LOGGER_NAME": "YOUR_MAIL_LOGGER_NAME",
           "NAMESPACE_KEY": "YOUR_APP_NAME_DATA", # optional, default: <APP_NAME>_DATA
           "SECURE_PARAMS": ('any_secure_param',), # optional, default: ()
           "LOGGING_FORMAT": {} # optional, default: {}
       }
      
      2

      注意:由于参数b未作为kwargs传递,因此它将仅作为args处理。

       DJANGO_LOGGER = {
           "APP_NAME": "YOUR_APP_NAME",
           "LOGGER_NAME": "YOUR_LOGGER_NAME",
           "MAIL_LOGGER_NAME": "YOUR_MAIL_LOGGER_NAME",
           "NAMESPACE_KEY": "YOUR_APP_NAME_DATA", # optional, default: <APP_NAME>_DATA
           "SECURE_PARAMS": ('any_secure_param',), # optional, default: ()
           "LOGGING_FORMAT": {} # optional, default: {}
       }
      
      3
    4. < > >

      贡献指南


      • 写作测试-随时欢迎对此进行改进,此时它将超过90%。

      • 其他指南-请随意建议更多功能或提出请求。

      我该和谁说话?


      • 作者-Niranjan Singh

      欢迎加入QQ群-->: 979659372 Python中文网_新手群

      推荐PyPI第三方库


热门话题
java OnClick用于ListView中的特定项   java如何多次循环相同的TestNG测试。包括课前和课后   java如何在Codenameone中设置BrowserComponent浏览器窗口大小   java Socketchannel始终为空   java以编程方式向JavaFX WebEngine历史添加新条目   java Hibernate+Spring与Oracle一起使用分层查询(从+连接方式开始)   Java中的安卓 getView和Beacon(Estimote)问题   计时器如何在java中设置暂停选项   java为什么输入1000000000000的输出不正确?   java如何在程序执行期间更改log4j2中的日志记录级别   java阻止代码引发XML异常   未找到媒体类型为application/json的java JAX RS MessageBodyWriter   java如何将BuffereImage中的特定颜色(0xFF00FF)设置为透明?   java如何列出web元素,如果网页中没有特定链接的id,如何单击网页中的特定链接?   在Java中读取txt文件时获取EOFEException   java如何避免为每个视图添加inject方法?   JavaSpringController:Facebook上类似文章的永久链接   java在尝试执行脚本时遇到错误“net.serentiybdd.core.exceptions.serentitymanagedexception:No session ID”