TYPO3插件调用logger写入sys_log表无报错无记录该如何解决?
问题原因
- TYPO3 核心通用日志组件(
LogManager)默认配置的日志写入器为文件写入器,日志默认写入到typo3temp/var/log/目录下的日志文件,不会自动写入sys_log表。 sys_log表是TYPO3专门用于存储后端操作记录、核心系统事件的表,默认未与通用日志组件做绑定,通用logger生成的日志不会直接同步到该表。- 存在日志级别过滤的可能:如果全局或对应扩展的日志级别阈值配置高于
info(比如仅记录warning及以上级别日志),info级别的日志会被直接过滤丢弃。
解决办法
提供两种可选方案,可根据需求选择:
方案1:直接使用sys_log专属写入逻辑
不通过通用日志组件,直接调用数据库连接写入sys_log表,代码示例:
// classes/controller/MyExtensionController.php use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Log\LogLevel; use TYPO3\CMS\Core\Database\ConnectionPool; class MyExtensionController { public function doAction() { $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('sys_log'); $connection->insert( 'sys_log', [ 'userid' => $GLOBALS['BE_USER']->user['uid'] ?? 0, // 后端用户ID,前端上下文可填0 'action' => 0, // 自定义操作类型标识 'recuid' => 0, // 关联业务记录UID,无关联可填0 'tablename' => '', // 关联业务表名,无关联可填空字符串 'details' => 'TEST', 'log_data' => json_encode(['something' => 123]), 'IP' => GeneralUtility::getIndpEnv('REMOTE_ADDR'), 'tstamp' => time(), 'type' => 5, // 扩展自定义日志的固定类型标识 'level' => LogLevel::INFO ] ); } }
方案2:配置通用日志组件绑定sys_log写入器
如果你想保留通用日志组件的调用方式,只需要在扩展的ext_localconf.php中增加写入器配置即可:
// ext_localconf.php // 请将下方的YourVendor\YourExtension替换为你自己扩展的命名空间前缀 $GLOBALS['TYPO3_CONF_VARS']['LOG']['YourVendor']['YourExtension']['Controller']['writerConfiguration'] = [ \TYPO3\CMS\Core\Log\LogLevel::INFO => [ \TYPO3\CMS\Core\Log\Writer\DatabaseWriter::class => [ 'logTable' => 'sys_log', ] ] ];
配置完成后,你原有代码中调用$logger->info()生成的日志就会自动写入sys_log表。
注意:如果配置后仍不生效,请检查全局日志级别配置,确保
INFO级别没有被过滤。
内容的提问来源于stack exchange,提问作者ESP32
相关产品推荐
相关产品推荐

