You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关闭Laravel内部日志,仅保留自定义日志输出?

解决Laravel日志被内部日志淹没的问题

以下几种方案可以帮你只保留自定义日志,屏蔽Laravel内部生成的日志:

方案一:创建带过滤逻辑的专属自定义日志通道

  1. 修改日志配置文件
    打开config/logging.php,在channels数组中添加一个新的通道,专门用于输出你的自定义日志:

    'custom_stderr' => [
        'driver' => 'monolog',
        'handler' => StreamHandler::class,
        'formatter' => env('LOG_STDERR_FORMATTER', \Monolog\Formatter\LineFormatter::class),
        'with' => [
            'stream' => 'php://stderr',
        ],
        'level' => 'warning', // 按需调整日志级别,比如只记录warning及以上
        'tap' => [App\Logging\FilterInternalLogs::class], // 绑定过滤处理器
    ],
    
  2. 创建日志过滤处理器
    在app/Logging目录下新建FilterInternalLogs.php文件,编写过滤逻辑,只保留你的自定义日志和业务代码产生的异常:

    <?php
    
    namespace App\Logging;
    
    use Monolog\Logger;
    
    class FilterInternalLogs
    {
        public function __invoke(Logger $logger)
        {
            foreach ($logger->getHandlers() as $handler) {
                $handler->pushProcessor(function ($record) {
                    // 过滤vendor目录下的Laravel/Symfony等框架内部日志
                    if (isset($record['context']['exception']) && str_starts_with($record['context']['exception']->getFile(), base_path('vendor'))) {
                        return false;
                    }
    
                    // 过滤框架核心命名空间的日志信息
                    $internalNamespaces = ['Illuminate\\', 'Laravel\\', 'Symfony\\'];
                    foreach ($internalNamespaces as $ns) {
                        if (str_contains($record['message'], $ns)) {
                            return false;
                        }
                    }
    
                    // 保留直接调用Log::xxx()的自定义日志(无异常上下文)
                    if (empty($record['context']['exception'])) {
                        return $record;
                    }
    
                    // 保留业务代码(app目录)产生的异常日志
                    if (str_starts_with($record['context']['exception']->getFile(), base_path('app'))) {
                        return $record;
                    }
    
                    return false;
                });
            }
        }
    }
    
  3. 启用自定义通道
    在.env文件中设置默认日志通道:

    LOG_CHANNEL=custom_stderr
    

    或者在调用自定义日志时明确指定通道:

    Log::channel('custom_stderr')->warning('你的自定义日志内容');
    

方案二:修改全局异常处理器,屏蔽内部异常日志

打开app/Exceptions/Handler.php,修改report方法,只记录业务代码产生的异常:

public function report(Throwable $e)
{
    // 仅记录app目录下代码抛出的异常,忽略框架内部异常
    if (str_starts_with($e->getFile(), base_path('app'))) {
        parent::report($e);
    }
}

方案三:调整日志级别减少冗余日志

在.env中设置日志级别为warning或更高(比如error),可以过滤掉大量低级别框架日志:

LOG_LEVEL=warning

注意:这个方法需要配合前面的过滤逻辑使用,否则仍会有框架产生的warning级别日志输出。

额外注意事项

  • 确保APP_DEBUG=false(你已经设置过),避免输出详细的调试栈信息。
  • 清理之前设置的error_reporting(1)和error_clear_last(),这些配置可能干扰Laravel的日志逻辑。

内容的提问来源于stack exchange,提问作者Simple Fellow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 07:07:36