1

我正在开发一个 django 项目,该项目除了有一个用于其模型和关系的数据库外,还写入一个名为activity_logs项目目录之外的日志目录,以跟踪格式化的用户活动,每个用户一个文件。这是另一种基于文件结构的解决方案,而不是让数据库表携带这些信息,因为这会从数据库中卸载一些存储,并且相对容易格式化和表达此类活动。也许你们中的一些人可能会建议将这种数据存储在数据库中,这很好,但我仍然相信所有这些都存在我需要帮助回答的问题。

这个 django 项目有多个应用程序,它们具有广泛的测试套件,每个应用程序一个。此外,还有一个logging.py文件封装了日志记录功能(向/从日志文件写入/读取活动),因此测试套件中的测试用例以及视图功能(以及各种其他实用程序功能)都使用这些日志记录功能,以便存储这些用户活动并根据模型关系检索它们以模拟用户通知系统。由于 logging 模块负责此日志记录,它需要知道写入到哪里,因此我们有一个名为的目录结构activity_logs它向其中写入用户日志文件,为新用户创建一个,为从数据库中删除的用户删除一个。我们希望在这个项目中进行的最新更改之一是创建一个单独的日志目录来测试此日志记录功能,例如test_activity_logs,以便在写入测试用户的测试目录或常规活动日志时不会混淆真实用户的目录。

我的问题是:在运行时,我如何告诉系统,无论是在哪个执行起点(无论是通过 django 测试Client对象的视图函数调用、测试用例、通过 URL 发出的实际 HTTPrequest 等) ,什么时候看里面的activity_logs还是test_activity_logs目录?这完全取决于我是为真实用户还是测试用户生成新信息,但是用户是我们系统中的用户,我在试图告诉这些调用一些日志记录函数的函数写入到测试日志目录与常规目录。例如,我正在尝试的一种方法是将关键字参数 (kwarg) 传递给日志记录函数,以便它们可以知道要读/写哪个目录,如下所示:

self.assertTrue(activity_has_been_logged(ACTIVITY_ACCOUNT_CREATED, user.get_profile(), use_test_activity_log_directory=True) == True)

调用的 kwarguse_test_activity_log_directory=True将告诉调用的日志记录函数activity_has_been_logged读取测试活动日志目录。不幸的是,除了有点不灵活(但可以容忍)之外,这并不能解决 django 测试client对象通过 URL 将 GET 或 POST 请求发送到将活动写入日志文件的视图函数的情况:

response = client.post(propose_match_url, post) #Can't write to test_log_directory if by default it writes to regular directory!

如何让客户端将此 kwarg 传递给那些视图函数?我认为完全可以做到这一点,但我不确定摆弄这些 kwargs 是否是最好的方法,或者可能在项目设置文件中创建一个全局变量,但这可能会导致一些竞争条件问题具有共享的可变变量。

你的帮助会很棒。提前致谢!

4

2 回答 2

1

所以我刚刚解决了这个问题。托管所有日志功能的日志文件实际上是唯一需要知道在哪里查找(test_activity_logsactivity_logs)的地方,因为所有其他组件将调用来自日志模块的函数来写入/读取这些目录/从这些目录中读取。UserProfile我为名为的类的模型类提供了一个附加字段,该is_test字段是一个布尔字段,用于确定是否查看test_activity_logsifis_test=Trueactivity_logsif is_test=False。这样,日志记录模块只需检查类型的输入参数UserProfile及其新字段即可确定在何处执行其日志记录功能。问题解决了!

于 2012-10-12T06:08:00.003 回答
0

如果您在 *nix 机器上或在 OS X 上启动,请查看 daemontools。两者都可以确保您的 Django 实例保持在您喜欢的任何模式下运行(daemontools 有更多选项)并且可以隔离用于记录标准输出的目录/标准错误。

您可以为每个实例设置环境变量,以帮助其他日志文件和临时文件知道在哪里创建,然后您可以从 os.environment 获取这些文件,或者如果使用 daemontools,则只需使用当前工作目录作为基础。

该目录是使用 daemontools 自动为您创建的。

于 2012-10-08T22:59:56.810 回答