保持 TYPO3 sys_log 干净整洁的最佳方法?

Posted

技术标签:

【中文标题】保持 TYPO3 sys_log 干净整洁的最佳方法?【英文标题】:Best way to keep the TYPO3 sys_log nice & clean? 【发布时间】:2012-06-29 04:01:38 【问题描述】:

我有这个 mysql

DELETE FROM sys_log 
WHERE sys_log.tstamp < UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL -2 MONTH)) 
ORDER BY sys_log.tstamp ASC 
LIMIT 10000

如果我对它进行 cronjob,这对保持 sys_log 较小有好处吗?

【问题讨论】:

cronjob真的是动词吗? 不,它是一个名词。这个 cronjob。一个定时任务。虽然我个人不介意这里的创意词创作。如果您介意,是否愿意编辑? 【参考方案1】:
Since TYPO3 9, the history is no longer stored using sys_log.
You can safely delete records from sys_log.

见Breaking Change #55298。

简答:

不,这绝对不是一个好主意(除非您使用的是 TYPO3 9 或更高版本,请参阅本文底部的注释)。如果您真的想从 sys_log 中删除内容,请记住 sys_history 仍在引用它。你也应该对 sys_history 做同样的事情。

或者,只需执行以下操作:

DELETE FROM sys_log WHERE NOT EXISTS 
(SELECT * FROM sys_history WHERE sys_history.sys_log_uid=sys_log.uid) 
AND recuid=0 AND tstamp < $timestamp LIMIT $limit 

请随时根据您的要求对其进行优化。

您还可以安全地(不影响 sys_history)删除 sys_log.error != 0 的记录。

更多建议:

在开发中将调试级别设置为详细(警告),但在生产中仅出错 定期查看系统日志并排除问题。解决问题后,您可以从 sys_log 中删除特定错误(请参阅 sys_log.error != 0, sys_log.details)。您可以使用数据库命令或在较新的 TYPO3 版本上使用后端的“SYSTEM: log”并使用“删除类似错误”按钮来执行此操作:

您也可以考虑在主要版本升级时使用低级清理器和删除记录并删除已删除=1 的truncate sys_logtruncate sys_history。不过,请务必先与编辑附近的人交谈,因为这将删除整个历史记录。确保您愿意这样做。

有关调度程序任务“表垃圾收集”,请参阅文档:https://docs.typo3.org/c/typo3/cms-scheduler/master/en-us/Installation/BaseTasks/Index.html

【讨论】:

【参考方案2】:

导致sys_log 大表的另一个常见原因是 TYPO3 安装中使用的其中一个扩展出现问题/错误。

使用旧版本tx_solr 的常见示例:

Core: Error handler (FE): php Warning: Invalid argument supplied for foreach() in typo3conf/ext/solr/classes/class.tx_solr_util.php
Core: Error handler (FE): PHP Warning: array_reverse() expects parameter 1 to be array, null given in typo3conf/ext/solr/classes/class.tx_solr_util.php line 280

每分钟左右会在sys_log弹出这组记录,从而在短时间内产生数百万条记录。

幸运的是,这些记录对sys_history 中的记录历史和相关的回滚功能没有任何影响,因此删除它们是安全的。

如果您的 sys_log 很大,这可能会导致 LOCK 超时问题,因此您必须限制删除查询:

delete from sys_log where details LIKE 'Core:%' LIMIT 200000;

【讨论】:

【参考方案3】:

是与否

如果您关心自己的记录历史,那不是。 您可以使用 sys_history 表恢复对记录(内容、页面等)的更改。 sys_history 表和 sys_log 表是相关的。当您截断 sys_log 时,您也失去了回滚对系统的任何更改的能力。您的客户可能不喜欢这样。

如果您只关心 sys_log 大小,它。 通过 cron 截断表格很好。

在 TYPO3 4.6 及更高版本中,您可以使用表垃圾收集调度程序任务 als pcampe 说。对于 4.5 以下的 TYPO3 版本,您可以使用 tablecleaner 扩展名。如果您从 sys_log 中删除所有早于 [N] 天的记录,您还将保留您的记录历史记录 [N] 天。这对我来说似乎是最好的解决方案。

请首先尝试修复填充 sys_log 的内容 ;-)

【讨论】:

快速评论 - IIRC 有一个调度程序作业,因此您可以在 TYPO3 安装“内部”保持房屋清洁,并且不需要运行不同的外部 cli 作业 如果我将 sys_log 和 sys_history 一起截断怎么办?!回滚的能力是否被保留? 没有@Andrea_86。如果您截断 sys_history,您将失去回滚功能。【参考方案4】:

为此有一个调度程序任务。

它被称为Table garbage collection (scheduler)

在 TYPO3 4.7 中,它只能清理 sys_log 表。从TYPO3 6.0开始,还可以清理sys_history表。您可以配置天数以及要清理的表。

扩展可以注册更多的表来清理。

【讨论】:

我在答案中添加了名称和更多单词。 在typo3 4.7.8 中,由于调度程序扩展中的各种错误,无法从后端调度此任务。见错误forge.typo3.org/issues/48022,差异:forge.typo3.org/projects/typo3v4-core/repository/revisions/…【参考方案5】:

是的。

另请参阅other suggestions by Jochen Weiland,了解如何保持 TYPO3 安装干净且小巧

【讨论】:

以上是关于保持 TYPO3 sys_log 干净整洁的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

TYPO3 扩展如何限制 findAll(最佳实践)

在 TYPO3 CMS 中调试 Typoscript 的最佳方法是啥?

版本 6.1.5 和 7.6 之间的typo3-content 的兼容性

TYPO3:在 Fluid 模板中硬编码的语言相关变量

ActionScript 2 事件的最佳实践 - 有没有模拟 ActionScript 3 样式事件的方法?

React 整洁代码最佳实践