【发布时间】:2016-05-17 20:47:50
【问题描述】:
我得到 Yii2
Error (#8)
An internal server error occurred.
但在日志中找不到。
既不在此 apache vhost 的 .access .error 文件中,也不在 apache 日志中
这发生在远程服务器上,我无法在本地重现。除了在远程服务器上更改 error_reporting 之外,还有其他方法可以查看错误是什么?
【问题讨论】:
我得到 Yii2
Error (#8)
An internal server error occurred.
但在日志中找不到。
既不在此 apache vhost 的 .access .error 文件中,也不在 apache 日志中
这发生在远程服务器上,我无法在本地重现。除了在远程服务器上更改 error_reporting 之外,还有其他方法可以查看错误是什么?
【问题讨论】:
确保您在配置中指定了日志目标,并且在引导期间加载了日志组件。
例子:
return [
'bootstrap' => ['log'],
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
],
];
另外,请检查您的 exportInterval 和 flushInterval 设置。
日志消息由 logger 对象保存在一个数组中。为了限制该数组的内存消耗,每次数组累积一定数量的日志消息时,记录器都会将记录的消息刷新到日志目标。你可以通过配置log组件的flushInterval属性来自定义这个数字:
return [
'bootstrap' => ['log'],
'components' => [
'log' => [
'flushInterval' => 100, // default is 1000
'targets' => [...],
],
],
];
当 logger 对象将日志消息刷新到日志目标时,它们不会立即导出。相反,仅当日志目标累积一定数量的过滤消息时才会发生消息导出。您可以通过配置单个日志目标的exportInterval 属性来自定义此数字,如下所示,
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 100, // default is 1000
]
由于刷新和导出级别设置,默认情况下,当您调用Yii::trace() 或任何其他日志记录方法时,您将不会立即在日志目标中看到日志消息。对于一些长时间运行的控制台应用程序来说,这可能是一个问题。 要使每条日志消息立即出现在日志目标中,您应该将flushInterval 和exportInterval 都设置为1,如下所示:
return [
'bootstrap' => ['log'],
'components' => [
'log' => [
'flushInterval' => 1,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
],
],
],
],
];
注意:频繁的消息刷新和导出会降低应用程序的性能。
【讨论】: