一个通用的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-kronosdjango rq,…

安装

pip install django-joblog

然后将django作业日志添加到djangosettings.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字段。没什么特别的。

admin changelist screenshot

配置

可以使用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_updatestrue将存储当前日志和错误文本,只要当前 每当调用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

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

推荐PyPI第三方库


热门话题
由于java的原因,maven无法运行代码。lang.NoClassDefFoundError:com/fasterxml/jackson/annotation/JsonMerge   Android项目中的java Creative SDK图像编辑器UI   java如何在Android Studio中使用DataOutputStream上传文件并将其他参数传递到web服务器   java倒计时服务打开时崩溃   java将RubyonRails项目转换为JRubyonRails项目   java我的图库意图是不显示图像?为什么?   java如何在春季启动时跳过mongodb/   java@Autowired在Spring中是如何实现的   甲骨文Akka java。util。同时发生的timeoutexception线程池频繁超时   java maven依赖项对spring启动应用程序有何影响?   java Firestore执行复合查询,未截获事件“已修改”   java ItemStreamException:未能初始化读取器,原因是:IllegalStateException:流已初始化。重新开放前关闭   java将空标记解组到集合的新实例中   使用AspectJ的java新手:无法调用aspect   java查找棋类游戏的所有组合   你为什么要这样做and==与Java中的equals方法不一样吗?   如何对使用JavaUUID的代码进行单元测试?