Php Laravel:如何将信息记录到单独的文件中

Php Laravel:如何将信息记录到单独的文件中,php,laravel,laravel-5,laravel-5.1,monolog,Php,Laravel,Laravel 5,Laravel 5.1,Monolog,如何在Laravel 5.1中为日志信息指定单独的文件 任何直接的帮助都是非常值得的。谢谢如果您想添加另一个monolog处理程序,可以使用应用程序的configureMonologUsing方法 在$app变量返回之前,在bootstrap/app.php文件中调用此方法: $app->configureMonologUsing(function($monolog) { $monolog->pushHandler(new StreamHandler('path/to/inf

如何在
Laravel 5.1
中为
日志信息指定单独的文件


任何直接的帮助都是非常值得的。谢谢

如果您想添加另一个monolog处理程序,可以使用应用程序的configureMonologUsing方法

在$app变量返回之前,在bootstrap/app.php文件中调用此方法:

$app->configureMonologUsing(function($monolog) {
    $monolog->pushHandler(new StreamHandler('path/to/info.log', Logger::INFO, false)); // false value as third argument to disable bubbling up the stack
});

return $app;

是否要专门将
info
记录到一个日志文件,将另一种日志类型记录到另一个位置?在这种情况下,我的解决方案可能没有帮助,但仍然有用

要将日志文件写入另一个位置,请使用方法
useDailyFiles
useFiles
,然后按刚才指定的路径记录到日志文件。像这样:

    Log::useDailyFiles(storage_path().'/logs/name-of-log.log');
    Log::info([info to log]);

这两种方法的第一个参数是日志文件的路径(如果日志文件不存在,则创建该文件),对于
useDailyFiles
,第二个参数是Laravel在删除旧日志之前记录日志的天数。默认值是无限制的,因此在我的示例中,我没有输入值。

一个简单的记录器帮助程序,允许您动态记录多个自定义文件。您还可以添加自定义处理程序并设置文件路径

App\Helper\LogToChannels.php

<?php
/**
 * Logger helper to log into different files
 *
 * @package    App\Helpers
 * @author     Romain Laneuville <romain.laneuville@hotmail.fr>
 */

namespace App\Helpers;

use Monolog\Logger;
use Monolog\Handler\HandlerInterface;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;

/**
 * Class LogToChannels
 *
 * @package App\Helpers
 */
class LogToChannels
{
    /**
     * The LogToChannels channels.
     *
     * @var Logger[]
     */
    protected $channels = [];

    /**
     * LogToChannels constructor.
     */
    public function __construct()
    {
    }

    /**
     * @param string $channel The channel to log the record in
     * @param int    $level   The error level
     * @param string $message The error message
     * @param array  $context Optional context arguments
     *
     * @return bool Whether the record has been processed
     */
    public function log(string $channel, int $level, string $message, array $context = []): bool
    {
        // Add the logger if it doesn't exist
        if (!isset($this->channels[$channel])) {
            $handler = new StreamHandler(
                storage_path() . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR . $channel . '.log'
            );

            $handler->setFormatter(new LineFormatter(null, null, true, true));

            $this->addChannel($channel, $handler);
        }

        // LogToChannels the record
        return $this->channels[$channel]->{Logger::getLevelName($level)}($message, $context);
    }

    /**
     * Add a channel to log in
     *
     * @param string           $channelName The channel name
     * @param HandlerInterface $handler     The channel handler
     * @param string|null      $path        The path of the channel file, DEFAULT storage_path()/logs
     *
     * @throws \Exception When the channel already exists
     */
    public function addChannel(string $channelName, HandlerInterface $handler, string $path = null)
    {
        if (isset($this->channels[$channelName])) {
            throw new \Exception('This channel already exists');
        }

        $this->channels[$channelName] = new Logger($channelName);
        $this->channels[$channelName]->pushHandler(
            new $handler(
                $path === null ?
                    storage_path() . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR . $channelName . '.log' :
                    $path . DIRECTORY_SEPARATOR . $channelName . '.log'
            )
        );
    }

    /**
     * Adds a log record at the DEBUG level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function debug(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::DEBUG, $message, $context);
    }

    /**
     * Adds a log record at the INFO level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function info(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::INFO, $message, $context);
    }

    /**
     * Adds a log record at the NOTICE level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function notice(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::NOTICE, $message, $context);
    }

    /**
     * Adds a log record at the WARNING level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function warn(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::WARNING, $message, $context);
    }

    /**
     * Adds a log record at the WARNING level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function warning(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::WARNING, $message, $context);
    }

    /**
     * Adds a log record at the ERROR level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function err(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::ERROR, $message, $context);
    }

    /**
     * Adds a log record at the ERROR level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function error(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::ERROR, $message, $context);
    }

    /**
     * Adds a log record at the CRITICAL level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function crit(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::CRITICAL, $message, $context);
    }

    /**
     * Adds a log record at the CRITICAL level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return Boolean Whether the record has been processed
     */
    public function critical(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::CRITICAL, $message, $context);
    }

    /**
     * Adds a log record at the ALERT level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function alert(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::ALERT, $message, $context);
    }

    /**
     * Adds a log record at the EMERGENCY level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function emerg(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::EMERGENCY, $message, $context);
    }

    /**
     * Adds a log record at the EMERGENCY level.
     *
     * @param  string $channel The channel name
     * @param  string $message The log message
     * @param  array  $context The log context
     *
     * @return bool Whether the record has been processed
     */
    public function emergency(string $channel, string $message, array $context = []): bool
    {
        return $this->log($channel, Logger::EMERGENCY, $message, $context);
    }
}
<?php
/**
 * Logger service provider to be abled to log in different files
 *
 * @package    App\Providers
 * @author     Romain Laneuville <romain.laneuville@hotmail.fr>
 */

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Helpers\LogToChannels;

/**
 * Class LogToChannelsServiceProvider
 *
 * @package App\Providers
 */
class LogToChannelsServiceProvider extends ServiceProvider
{
    /**
     * Initialize the logger
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('App\Helpers\LogToChannels', function () {
            return new LogToChannels();
        });
    }
}
然后,您可以在应用程序中的任何位置使用依赖项注入进行调用(在构造函数中添加类,并将其绑定到
log
class属性)

您甚至可以通过调用

$this->log->addChannel('channel_name', $customHandler);

当您在应用程序中的任何位置调用它的名称时,它都可以访问。

在Laravel 5.6中,您可以在
config\logging.php
中创建自己的频道。如果您已从较旧的Laravel版本升级,则需要创建此文件()

将其添加到
config\logging.php

'your_channel_name' => [
            'driver' => 'single',
            'path' => storage_path('logs/your_file_name.log'),
        ],
然后,您可以调用任何类似的:

Illuminate\Support\Facades\Log::channel('your_channel_name')->info('your_message');

日志将存储在
logs/your_file_name.log

中,因为Laravel>=5.6我们可以使用它以简单的方式工作。这允许您创建日志通道,这些通道可以作为具有自己的驱动程序、路径或级别的日志文件处理。你只需要这几行就行了

简单地添加一个新频道(选择频道名称,例如“命令”) config/logging.php:

return [
    'channels' => [ 
        'command' => [
            'driver' => 'single',
            'path' => storage_path('logs/command.log'),
            'level' => 'debug',
        ],
    ],
];

通过解析频道名称记录所需位置:


获取此错误
PHP致命错误:在第56行的/var/www/html/project/bootstrap/app.PHP中找不到类“StreamHandler”
@RohitJindal swap
StreamHandler
out for
Monolog\Handler\StreamHandler
。您可能还发现需要将
Logger
换成
Monolog\Logger
。@alexrussell,因此,根据它,我必须在我的bootstrap/app.php中包含两个名称空间。
Monolog\Handler\StreamHandler
Monolog\Logger
?是的,或者
使用
名称空间,完全限定类的参考。可能重复的。请再次验证正确答案?已经过时了。请检查我的答案,可能会将其标记为正确的,因为这是Laravel中常见的方法。这在Laravel 5.4中仍然有效,我刚刚测试并使用了它。有关此方法的问题/注意事项,请参阅是否有方法在我编写所需日志后删除第二个日志处理程序?我也使用了相同的方法。一切正常。但该文件还存储其他调试和错误日志。为什么会发生这种情况。
Illuminate\Support\Facades\Log::channel('your_channel_name')->info('your_message');
return [
    'channels' => [ 
        'command' => [
            'driver' => 'single',
            'path' => storage_path('logs/command.log'),
            'level' => 'debug',
        ],
    ],
];
Log::channel('command')->info('Something happened!');