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
快速启动
在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: {} }
将这两行添加到
设置
文件的末尾。
import django_logger LOGGING = django_logger.LOGGING_FORMAT
测试-打开shell
python 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
快乐的伐木。更深入地了解。
< > >- app_name:将在日志中使用的应用程序的名称-
app_ex
- logger_name:用于获取此logger配置的logger的名称-
logger_ex
- 邮件记录器名称:邮件记录器的名称。
- 命名空间密钥:用于抛出所有日志数据的密钥名称。-
应用程序数据
- secure_params:在使用函数decorator记录输入输出时使用 为了隐藏(记录"***"而不是实际值)这里给出的元组参数。参见[示例]
- logging_format:这定义了实际的日志格式,在key<;namespace_key>;中,例如
app_data_ex
日志简单警告:
0DJANGO_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: {} }
带有一些参数的日志:
注意:键
消息
和kwargs
必须在那里,否则它们将不会被记录。
1DJANGO_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: {} }
为具有args和kwargs的函数记录入口-出口。
2DJANGO_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: {} }
注意:由于参数
b
未作为kwargs传递,因此它将仅作为args处理。
3DJANGO_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: {} }
< > >写作测试-随时欢迎对此进行改进,此时它将超过90%。
其他指南-请随意建议更多功能或提出请求。
- 作者-Niranjan Singh
配置
让我们逐个查看下面的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}}}
日志记录格式
这需要是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中执行所有这些操作
9
pip install django-logger
贡献指南
我该和谁说话?
推荐PyPI第三方库