UmbracoLog表

时间:2013-02-04 03:18:53

标签: umbraco

在负载均衡的服务器设置中,我们的UmbracoLog表正在接收大约50条记录,每秒写入所有记录都遵循相同的模式(格式化道歉)

**id    userId  NodeId  Datestamp   logHeader   logComment

1122069437  0   -1  41302.1891  System  Submitting calls to distributed servers

1122069438  0   -1  41302.1891  Custom  http://www.url.com/umbraco/webservices/cacheRefresher.asmx

1122069439  0   -1  41302.1891  System  Submitting calls to distributed servers

1122069440  0   -1  41302.1891  System  Distributed server push completed with no nodes reporting an error

1122069441  0   -1  41302.1891  System  Distributed server push completed with no nodes reporting an error

1122069442  0   -1  41302.1891  Custom  http://www.url.com/umbraco/webservices/cacheRefresher.asmx**

在24小时内,这会产生一个6.9GB的表和一个在CPU和内存使用方面持续运行的数据库。

我们检查了其他类似网站设置的web.config和umbraco.config设置文件,并且在配置方面没有差异。

我们可以禁用系统级日志记录,但我们会丢失其他有意义的消息。

任何人都可以帮助解决此问题吗?

TL; DR Umbraco,日志表每毫秒都会被多次调用锤击。

1 个答案:

答案 0 :(得分:1)

我们已经确定了这个问题。它归结为过期文档以及umbraco 4.5.2如何处理它们。

在反汇编dll之后,我们在publishService类(umbraco.presentation)中找到了CheckPublishing方法的罪魁祸首:

foreach (Document d in Document.GetDocumentsForExpiration())
{
   library.UnPublishSingleNode(d.Id);
}

GetDocumentsForExpiration()运行以下查询:

IRecordsReader dr = CMSNode.SqlHelper.ExecuteReader("select distinct nodeId from cmsDocument where newest = 1 and not expireDate is null and expireDate <= @today", new IParameter[] { CMSNode.SqlHelper.CreateParameter("@today", DateTime.Now) });

因此,umbraco运行此发布服务来检查和取消发布过期文档,而不实际更新过期日期,该日期用于获取需要过期/未发布的文档。因此,文件永远不会过期(虽然它们未发表)。

每次文档发生更改(发布,取消发布,保存等)时,都会对分布式服务器进行调用。由于publishService和上面列出的代码,每次运行服务时这些过期的文档都是未发布的,导致许多分布式调用(以及写入的数据库记录)。

解决方案是清除这些文档的过期日期(手动或通过SQL代理作业)或修复Umbraco源代码。

此错误已在Umbraco的更高版本中修复(不确定修复了哪个版本,但我检查了4.11.3并且它具有固定代码)。