一个通用的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如何将HashMap<String,Object>从一个活动传递到另一个活动   java如何手动加密socket连接的流量?   java正则表达式生成一个不正确的结果   Java方法引用具有泛型参数的方法   java app setBackground()错误:不兼容的类型:int无法转换为Drawable   java是启动Spring引导而不是SpringApplication的其他方法。跑   无法打开java类路径资源[org/quartz/impl/jdbcjobstore/tables_h2.sql],因为它不存在   spring使用Java,如何确定来自tomcat Web服务器的出站服务调用?   java获取多个同名的XML元素JAXB   java使用Ant从同一代码库构建Swing和Android应用程序   JComponent的java重绘方法不起作用   java目标不可访问,标识符“beanName”解析为null   smtp是否有支持esmtp管道的java api?   java如何在Spring中自动连接业务对象   java在Hibernate中没有其他保存实体的方法吗?   针对两个客户机的SpringJavaWeb应用程序项目开发   使用split的java标记化输入