一个通用的django实用程序,帮助将数据记录到数据库中。
django-joblog的Python项目详细描述
django作业日志v0.2.2
一个通用的django实用程序,有助于将数据记录到数据库。
概述
fromdjango_joblogimportJobLoggerwithJobLogger("task-name")aslog:log.log("task started")if1!=2:log.error("The impossible happened!")
以下信息将存储到数据库中以供进一步检查:
- 任务的名称
- 特定任务的调用计数
- 开始时间
- 结束时间
- 持续时间
- 任何日志或错误输出
- 异常跟踪,用于在带有-块的 中发生的异常
这在与cronjobs和异步任务(例如,这些库)结合使用时非常有用: django-kronos, django rq,…
安装
pip install django-joblog
然后将django作业日志添加到django
settings.py中的
已安装的应用程序中,并调用
manage.py migrate
要求
用法
并行性
默认情况下,不允许作业并行运行。这可以用中的parallel=true更改
作业记录器的构造函数。
如果在已启动同名作业时启动作业记录器
运行时,会引发一个django_job log.jobisalReadyRunning错误
。此外,还会出现一个作业日志条目
将在数据库中创建blocked
状态。
例如,您可能有一个cronjob,它每分钟运行一次,并在 数据库。如果将任务包装在作业记录器中,则可以确保任务不是 并行工作:
fromdjango_joblogimportJobLogger,JobIsAlreadyRunningErrordefcronjob_open_task_worker():ifopen_tasks():withJobLogger("work-open-tasks")aslog:work_open_tasks(log)# to avoid the error message on multiple invocation:defcronjob_open_task_worker():ifopen_tasks():try:withJobLogger("work-open-tasks")aslog:work_open_tasks(log)exceptJobIsAlreadyRunningError:pass
上下文
要更改作业中的日志记录上下文,请使用jobloggercontext
。
它可能有助于确定在哪一点生成输出或引发异常。
fromdjango_joblogimportJobLogger,JobLoggerContextwithJobLogger("pull-the-api")aslog:credentials=get_credentials()log.log("using user %s"%credentials.name)withJobLoggerContext(log,"api"):api=Api(credentials)log.log("connected")withJobLoggerContext(log,"submit"):api.submit(data)log.log("%s items submitted"%len(data))withJobLoggerContext(log,"check result"):log.log(api.check_result())
数据库中的日志输出如下:
using user Herbert
api: connected
api:submit: 42 items submitted
api:check result: 23 items updated
错误日志捕获的异常可能如下所示:
api:submit: IOError - Status code 404 returned for url https://my.api.com/submit
File "/home/user/python/awesome_project/api/Api.py, line 178, in Api._make_request
self.session.post(url, data=params)
File "/home/user/python/awesome_project/api/Api.py, line 66, in Api.submit
self._make_request(url, params)
File "/home/user/python/awesome_project/main.py, line 12
api.submit(data)
可以看到,jobloggercontext不会从上下文堆栈中弹出其名称 万一有例外!也就是说,在更高的上下文级别中捕捉异常 如果引发的异常没有留下有效的上下文堆栈,则 发现异常后,您将继续工作。
DummyJobLogger
您可以使用dummyjoblogger
类来提供日志记录,而无需将内容存储到数据库。
这对于调试或作为manage.py
任务运行函数可能很有用,但是
只需要对cronjobs进行数据库日志记录。
通常,功能可以设计为与作业记录器一起工作,但不需要它。
fromdjango_joblogimportJobLogger,DummyJobLoggerdefbuy_eggs(log=None):log=logorDummyJobLogger()log.log("Gonna buy some eggs!")...defcronjob_invokation():withJobLogger("buy-eggs")aslog:buy_eggs(log)defdebug_invokation():buy_eggs()
使用型号
默认情况下,joblogmodel有一个django管理视图。
您可以像往常一样在django_joblog.models
中找到模型。
请检查文件django_joblog/models.py
对于规格fic字段。没什么特别的。
配置
可以使用django projectsettings.py中的一个对象配置django\u作业日志应用程序,
例如:
JOBLOG_CONFIG={# name of alternate database connection, to circumvent transactions on default connection"db_alias":"joblog",# enable .log and .error to write to database immediately"live_updates":True,# enable a constant update of job state - to check for jobs which went away without notice"ping":True,"ping_interval":1,# always print to console during jobs"print_to_console":True}
整个对象及其所有字段都是可选的。
数据库别名
db_alias
定义数据库连接的替代名称。
此名称必须存在于数据库设置中。
通常不需要定义此设置,除非要确保 实时更新或使用ping模式即使在事务处理时也始终有效 在作业体中使用。考虑这个例子:
fromdjango.dbimporttransactionfromdjango_joblogimportJobLoggerwithJobLogger("my-job")asjob:job.log("Outside transaction")withtransaction.atomic():job.log("Inside transaction")# ...other stuff...
如果您正在使用实时更新,并且需要确保第二个日志 ("内部事务")立即存储到数据库中,您需要定义第二个 数据库连接。它可以只是数据库设置的副本。
实时更新
设置live_updates
为true
将存储当前日志和错误文本,只要当前
每当调用joblogger.log()或joblogger.error()时,数据库的作业持续时间。
ping
将ping
设置为true
将在使用joblogger(…)调用时生成一个单独的线程,该线程将
使用当前日志文本、错误文本和持续时间不断更新joblog数据库。
更新间隔配置为以秒为单位的
ping间隔
。
通常,如果作业意外退出(segfault、关机、重启vm等等),它的状态为 数据库将永远运行。 同名的新作业将被阻止执行。
但是,启用ping
模式将确保如果duration
的作业(在数据库中)是
但未定义的或大于ping间隔的则可以认为已停止。
要将这些悬挂作业的数据库状态设置为已消失
请使用:
fromdjango_joblogimportJobLoggerwithJobLogger("task-name")aslog:log.log("task started")if1!=2:log.error("The impossible happened!")0
或
fromdjango_joblogimportJobLoggerwithJobLogger("task-name")aslog:log.log("task started")if1!=2:log.error("The impossible happened!")1
测试
单元测试是django风格的 并放在django-joblog/tests/中
注意,由于数据库锁定,并行测试将在sqlite后端失败。
存储库
回购协议包含整个django项目(django_joblog_project
)
为了便于开发。setup.py
仅导出django_作业日志
应用程序。
默认数据库后端配置为mysql
要启动runserver或在repo中运行测试,请打开mysql控制台:
fromdjango_joblogimportJobLoggerwithJobLogger("task-name")aslog:log.log("task started")if1!=2:log.error("The impossible happened!")2
然后,也可以根据python版本:
fromdjango_joblogimportJobLoggerwithJobLogger("task-name")aslog:log.log("task started")if1!=2:log.error("The impossible happened!")3
最后:
fromdjango_joblogimportJobLoggerwithJobLogger("task-name")aslog:log.log("task started")if1!=2:log.error("The impossible happened!")4
更改日志
V0.2.4-2019年4月
- 在并行作业运行失败时添加"阻止"状态条目
V0.2.3
- 修复joblog模型访问
V0.2.2
- 添加joblog配置设置
- 添加
实时更新
和ping
模式
v0.1.1-2018年8月
- 将搜索和筛选添加到管理视图
v0.1.0-2018年7月
- 使打印到控制台成为可选
- 添加django单元测试
v0.0.1
- 从各种私人项目粘贴在一起的副本,"消毒"并重新打包以用于PYPI