【问题标题】:How to Log INFO to separate file in LaravelLaravel:如何将信息记录到单独的文件中
【发布时间】:2015-12-09 17:25:03
【问题描述】:

如何在Laravel 5.1中为logging INFO指定单独的文件?

任何直接的帮助都将是非常可观的。谢谢

【问题讨论】:

标签: php laravel laravel-5 laravel-5.1 monolog


【解决方案1】:

您想将info 专门记录到一个日志文件,并将另一种日志类型记录到另一个位置吗?在这种情况下,我的解决方案可能无济于事,但仍然有用。

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

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

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

【讨论】:

【解决方案2】:

在 Laravel 5.6 中,您可以在 config\logging.php 中创建自己的频道。如果你从旧的 Laravel 版本升级,你需要创建这个文件 (https://laravel.com/docs/5.6/upgrade)。

将此添加到config\logging.php中的频道数组

'your_channel_name' => [
            'driver' => 'single',
            'path' => storage_path('logs/your_file_name.log'),
        ],

然后您可以像这样调用任何8 logging levels

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

日志将存储在logs/your_file_name.log

【讨论】:

  • 我也用过。一切正常。但此文件还存储其他调试和错误日志。为什么会这样。
【解决方案3】:

Laravel >= 5.6 开始,我们可以使用Log Channels 使其以简单的方式工作。这允许您创建日志通道,这些通道可以作为具有自己的驱动程序、路径或级别的自己的日志文件来处理。您只需要这几行即可使其正常工作。

简单地添加一个新频道(选择你的频道名称,例如“command”)

config/logging.php:

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

通过解析频道名称记录到任何你想要的地方:

Log::channel('command')->info('Something happened!'); 

【讨论】:

    【解决方案4】:

    如果您想添加另一个独白处理程序,您可以使用应用程序的 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;
    

    【讨论】:

    • 收到此错误PHP Fatal error: Class 'StreamHandler' not found in /var/www/html/project/bootstrap/app.php on line 56
    • @RohitJindal 将StreamHandler 换成Monolog\Handler\StreamHandler。您可能还需要将Logger 换成Monolog\Logger
    • @alexrussell,所以,根据它,我必须在我的 bootstrap/app.php..Monolog\Handler\StreamHandlerMonolog\Logger 中包含两个命名空间@ ??
    • 是的,要么use命名空间,要么引用完全限定的类。
    • configureMonologUsing() 存在于 Laravel 5.5 中,但自 5.8 以来不再存在 laravel.com/api/5.5/search.html?search=configureMonologUsing laravel.com/api/5.8/search.html?search=configureMonologUsing
    【解决方案5】:

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

    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);
        }
    }
    

    App\Providers\LogToChannelsServiceProvider.php

    <?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();
            });
        }
    }
    

    config\app.php(添加服务提供者)

    // Register Service Providers
    $app->register(App\Providers\LogToChannelsServiceProvider::class);
    

    然后,您可以在应用程序中的任何位置使用依赖注入进行调用(在构造函数中添加类并将其绑定到 log 类属性)

    $this->log->info('logger_name', 'Log message');
    $this->log->error('other_logger_name', 'Log message', $someContext);
    

    您甚至可以通过调用自定义记录器输出

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

    当您在应用中的任何位置调用它的名称时,它就会被访问。

    【讨论】:

      猜你喜欢
      • 2019-02-28
      • 1970-01-01
      • 2017-11-26
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多