日志文件未在 Laravel 5.5 中写入

Posted

技术标签:

【中文标题】日志文件未在 Laravel 5.5 中写入【英文标题】:Log file is not being written in Laravel 5.5 【发布时间】:2020-04-13 12:14:53 【问题描述】:

我在 Laravel 5.5 上默认启用了日志记录。

设置如下:

config/app.php 文件中:

'log' => env('APP_LOG', 'single'),

'log_level' => env('APP_LOG_LEVEL', 'debug'),

.env 文件中:

APP_LOG_LEVEL=debug

如果应用程序发生任何错误,我可以看到异常页面。但我不再在日志文件中看到它了。几个月前它工作得很好。即使我尝试手动记录,它也不会记录。

Log::debug('Notification');

我有使用Storage 创建文件的代码,它工作正常。所以,我不认为这是一些权限问题。这可能是什么原因?

【问题讨论】:

试试php artisan config:clear && php artisan optimize @TsaiKoga 不,它没有帮助。 $request的内容是什么? @apokryfos 它可以是任何东西。那是作为例子写的。即使我遇到致命错误,它也不会记录,尽管它会在屏幕上显示异常。 您也可以从 tinker 尝试获取实际记录器的实例 $logger = \Illuminate\Support\Facades\Log::getLogger();`` then print it print_r($logger);` 您应该能够在对象的某处看到预期的日志文件 【参考方案1】:

这里有两件事:

    仔细检查您的.env 文件中是否确实包含以下内容, 基本上检查它是否不是虚假值。:
APP_LOG=daily
    确保您的storage 目录对服务器用户是可写的:
chmod -R 755 storage

【讨论】:

【参考方案2】:

试试

php artisan config:cache

如果问题与 laravel 应用程序缓存有关,那么 artisan 命令将有助于将所有配置文件(包括当前更改)缓存到一个文件中。在 laravel 中,配置值是从应用程序缓存中获取的,因此无论何时更改配置文件都必须运行此命令。使用最新更改更新应用程序缓存。

如果问题与应用程序缓存无关,您可以使用 apache2 错误日志跟踪真正的原因。

tail -f /var/log/apache2/error.log

【讨论】:

【参考方案3】:

可能是您授予了存储文件夹而不是内部文件夹的权限和所有权,例如:在 redhat 上处理案例,因为在 redhat apache 的情况下,用户是 apache,而在 debian 或大多数其他 www-data 的情况下

folder | Permission | ownership 
storage | 775 | root:apache 
storage/logs | 755 | root:apache
storage/logs | 775 | root:root

应该是最小的

storage/logs | 775 | root:apache
or 
storage/logs | 755 | apache:apache

请检查一次 APP_DEBUG=真

【讨论】:

【参考方案4】:

您可能不小心更改了默认日志路径或配置数组中的任何内容

'single' => [
    'driver' => 'single',
    'path' => storage_path('logs/laravel.log'),
    'level' => 'debug',
],

【讨论】:

【参考方案5】:

将文件权限更改为 777,如果日志文件中存在错误,则为权限。您可以使用以下命令检查用户运行 php:

ps 辅助 | egrep '(apache|httpd)'

并更正文件权限。

如果问题不是因为权限问题,那么您可以在日志文件中编写的代码行之后使用 error_get_last() 并查看错误是什么。

如果你没有错误,可能是config中写日志文件的地址不正确

【讨论】:

【参考方案6】:

确保您的日志级别设置为调试,并记住在更改该值后清除配置缓存

.env file 
APP_LOG_LEVEL=debug

run in console
php artisan config:cache

【讨论】:

【参考方案7】:

我发现了问题。我正在使用 Bugsnag(用于生产)并且我已经在项目中设置了它。

当我集成它时,我使用了它在仪表板上的说明,我认为这并不完整,因为他们在 documentation 上有它。所以,我在我的应用服务提供者 app/Providers/AppServiceProvider.php 的 register 方法中添加了以下代码。

$this->app->alias('bugsnag.logger', \Illuminate\Contracts\Logging\Log::class);
$this->app->alias('bugsnag.logger', \Psr\Log\LoggerInterface::class);

在我的本地环境中,我没有在我的.env 文件中设置BUGSNAG_API_KEY。因此,它既没有将异常发送到 Bugsnag,也没有登录到本地 laravel.log 文件。

当我将 Bugsnag 集成到另一个在 Laravel 6 上运行的项目时,我怀疑这个问题并检查了文档。在那里,我找到了继续记录到我的原始记录器以及 Bugsnag 所需的代码。

$this->app->alias('bugsnag.multi', \Illuminate\Contracts\Logging\Log::class);
$this->app->alias('bugsnag.multi', \Psr\Log\LoggerInterface::class);

【讨论】:

以上是关于日志文件未在 Laravel 5.5 中写入的主要内容,如果未能解决你的问题,请参考以下文章

写入日志文件时Laravel 5权限被拒绝

Laravel 日志配置以及设置按日期记录日志

如何使Python多处理池工作以写入相同的日志文件

记一次Laravel定时任务导致日志没有写入权限的坑

Laravel 6 API 不会在日志中写入错误 500

Laravel daily 日志权限问题