我有一个用于运行测试的应用程序/网站。每当我运行测试时,都会创建一个Celery任务,并且此任务会经过运行实际测试的过程。该测试与第三方服务器联系,因此有很多原因可能导致任务失败或挂起。当一切都在本地运行时,这一切都很好。我可以直接访问class Program
{
static async Task Main(string[] args)
{
var uri = new Uri(" http://webdavserver.net/User7bb0de4/" );
var payload = "content";
await MakeRequest(uri, payload);
await MakeRequest(uri, payload);
}
private static async System.Threading.Tasks.Task MakeRequest(Uri uri, string payload)
{
var firstRequest = WebRequest.Create(uri) as HttpWebRequest;
firstRequest.Method = "PROPFIND"; // PUT works OK. LOCK, PROPFIND, MKCOL - not
using (var stream = await firstRequest.GetRequestStreamAsync())
using (var textWriter = new StreamWriter(stream, System.Text.Encoding.UTF8))
{
await textWriter.WriteAsync(payload.ToLower());
}
}
}
和stdout
-它们会在我用来启动Celery的工作人员的终端上弹出。如果有错误,挂断或任何其他此类问题,我可以直接看到它,进行处理,并确保将来能够妥善处理。
最终,它将托管在独立于我的计算机的服务器上,这是问题开始的地方:
我想要一种访问特定任务日志到stderr
和stdout
(最好是实时)的方法。我实现了Flower,以为它可以做到这一点,但似乎没有实现。我曾考虑过将日志保存到一个文件中,每个任务一个,并在我的站点上包含一个“查看日志”按钮链接,该链接使我可以查看本来可以在本地看到的日志,但这非常麻烦。也许我可以做些类似的事情:生成每个正在运行的任务的链接,并使用javascript使用日志文件的内容来更新该链接中的页面?
我已经进行了一些研究,但在这种类型的日志记录中并没有发现太多。有人介意将我指向正确的方向吗?
答案 0 :(得分:0)
您可以创建一个LoggingTask对象,以捕获日志并将其作为任务的结果发布(如果不使用结果的话)。
我没有对此进行测试,但是它应该与一些柚木一起工作(您应该注意,它也会吞噬异常):
import logging
from io import StringIO
from celery import Task
LOGGER = logging.getLogger(__name__)
class LoggingTask(Task):
def __call__(self, *args, **kwargs):
# Only handles the logging capture
log_stream = StringIO()
handler = logging.StreamHandler(log_stream)
try:
logging.getLogger().addHandler(handler)
Task.__call__(self, *args, **kwargs)
catch:
LOGGER.exception("Error in task")
finally:
logging.getLogger().removeHandler(handler)
handler.flush()
return log_stream.getvalue()