- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
给定一个在多个服务器上同时执行的 Django 应用程序,该应用程序如何记录到单个共享日志文件(在网络共享中),而不保持该文件以独占模式永久打开?
当您想要利用日志流时,这种情况适用于 Windows Azure 网站上托管的 Django 应用程序。
关于this sample project ,我尝试使用 ConcurrentLogHandler像这样:
在 settings.py :
'ConcurrentLogHandler':{
'level': 'DEBUG',
'class': 'cloghandler.ConcurrentRotatingFileHandler',
'formatter': 'verbose',
'filename': os.getenv('LOGFILE', 'django.log')
},
在 views.py :
from time import gmtime, strftime
import logging
from django.http import HttpResponse
logger = logging.getLogger(__name__)
def home(request):
current_time = strftime("%Y-%m-%d %H:%M:%S", gmtime())
logger.info('home ' + current_time)
return HttpResponse("Hello from Django! It is now " + current_time + ".\n")
网站运行时,日志已写入,但文件似乎未刷新。另外,如果我尝试使用 FTP 读取该文件,我会收到以下消息:“550 该进程无法访问该文件,因为该文件正在被另一个进程使用。”
如果我停止应用程序,文件将关闭,我可以读取该文件并查看其中的所有日志。
我假设 ConcurrentLogHandler 将允许对日志文件进行共享访问。这个假设是错误的吗?是否需要一些额外的配置?有替代方案吗?
最佳答案
另一种方法是将所有 Django 日志记录发送到队列(例如 Redis 队列,使用类似 this 或 multiprocessing.Queue
),然后单个进程读取队列并将记录写入文件。有更多的移动部件,因此这可能适合也可能不适合您的需求,但它会消除文件争用。请参阅this post使用来自多个进程的日志记录时的更多选项。
您当然也可以设置套接字服务器并使用 SocketHandler 将所有 Django 进程的日志记录事件发送到服务器,然后服务器写入文件。 Python 文档包含 working example这样的服务器。
关于python - 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17902972/
我想锁定 MySQL (InnoDB) 中的特定行,以便其他连接无法读取该特定行。 start transaction; Select apples from fruit where apples =
我想锁定 MySQL (InnoDB) 中的特定行,以便其他连接无法读取该特定行。 start transaction; Select apples from fruit where apples =
这个问题在这里已经有了答案: MySQL: comparison of integer value and string field with index (1 个回答) 关闭 5 年前。 我有一个
锁有两种分类方法。 (1) 从数据库系统的角度来看 锁分为以下三种类型: •独占锁(Exclusive Lock) 独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不
如下所示,我在 Linux (RHEL) 上运行 Python 2.6,但出于某种原因它没有 os.O_EXLOCK。有什么原因吗?有办法解决这个问题吗? Python 2.6.5 (r265:790
我是一名优秀的程序员,十分优秀!