国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

日志

日志


日志

簡(jiǎn)介

為了幫助你更多的了解應(yīng)用程序中到底發(fā)生了什么,Laravel 提供了強(qiáng)大的日志服務(wù),允許你將日志消息、系統(tǒng)錯(cuò)誤日志記錄到文件,甚至使用 Slack 通知到你的整個(gè)團(tuán)隊(duì)。

在 Laravel 框架中,Laravel 使用 Monolog 庫(kù),它為各種強(qiáng)大的日志處理提供支持。Laravel 使配置這些處理程序變得簡(jiǎn)單,允許你混合并匹配它們自定義的應(yīng)用程序日志處理。

配置

所有的應(yīng)用程序日志系統(tǒng)配置都位于 config/logging.php 配置文件中。這個(gè)文件允許你配置你的應(yīng)用程序日志通道,所以務(wù)必查看每個(gè)可用的通道及它們的選項(xiàng)。當(dāng)然,我們將在下面回顧一些常用的選項(xiàng)。

默認(rèn)情況下,Laravel 將使用  stack 去記錄日志消息。stack 通道被用來(lái)將多個(gè)日志通道聚合到一個(gè)單一的通道中。關(guān)于堆棧的更多信息,查看 以下文檔。

配置通道名稱

默認(rèn)情況下,Monolog 使用與當(dāng)前環(huán)境匹配的『通道名稱』進(jìn)行實(shí)例化,比如 production 或者 local。要改變這個(gè)值,需添加一個(gè) name  選項(xiàng)到你的通道配置中:

'stack' => [  
  'driver' => 'stack',    
  'name' => 'channel-name',    
  'channels' => ['single', 'slack'],
 ],

可用的通道驅(qū)動(dòng)

名稱描述
stack一個(gè)便于創(chuàng)建『多通道』通道的包裝器
single單個(gè)文件或者基于日志通道的路徑 (StreamHandler)
daily一個(gè)每天輪換的基于 Monolog 驅(qū)動(dòng)的 RotatingFileHandler
slack一個(gè)基于 Monolog 驅(qū)動(dòng)的 SlackWebhookHandler
syslog一個(gè)基于 Monolog 驅(qū)動(dòng)的 SyslogHandler
errorlog一個(gè)基于 Monolog 驅(qū)動(dòng)的 ErrorLogHandler
monolog一個(gè)可以使用任何支持 Monolog 處理程序的 Monolog 工廠驅(qū)動(dòng)程序
custom一個(gè)調(diào)用指定工廠創(chuàng)建通道的驅(qū)動(dòng)程序

{tip} 有關(guān)  monolog  和  custom  驅(qū)動(dòng),查看 高級(jí)通道自定義

配置 Single 和 Daily 通道

singledaily 通道包含三個(gè)可選配置項(xiàng):bubble 、permissionlocking.

名稱描述默認(rèn)值
bubble消息處理后,指示消息是否推送到其他通道true
permission日志文件權(quán)限644
locking寫入之前嘗試鎖定日志文件false

配置 Slack 通道

slack 通道需要 url 配置選項(xiàng)。這個(gè) URL 應(yīng)當(dāng)與你為 Slack 團(tuán)隊(duì)配置的一個(gè) incoming webhook 相匹配。

構(gòu)建日志堆棧

前面說(shuō)過(guò), stack 驅(qū)動(dòng)允許你在單一日志通道中整合多個(gè)通道。讓我們通過(guò)一個(gè)產(chǎn)品級(jí)應(yīng)用的配置實(shí)例來(lái)看看如果使用日志堆棧::

'channels' => [ 
   'stack' => [     
      'driver' => 'stack',        
      'channels' => ['syslog', 'slack'],   
     ],    
      'syslog' => [      
       'driver' => 'syslog',        
       'level' => 'debug',    
      ],    
      'slack' => [       
          'driver' => 'slack',        
          'url' => env('LOG_SLACK_WEBHOOK_URL'),        
          'username' => 'Laravel Log',        
          'emoji' => ':boom:',        
          'level' => 'critical',    
         ],
   ],

我們來(lái)分析這個(gè)配置。首先要注意的是 stack 通過(guò)借助它的 channels 選項(xiàng)聚合了另外兩個(gè)通道: syslogslack 。因此,在記錄日志消息時(shí),這兩個(gè)通道都有機(jī)會(huì)完成日志消息記錄:

日志級(jí)別

請(qǐng)留意上面例子中 syslogslack 中存在的 level 配置項(xiàng)。這個(gè)選項(xiàng)決定了需要被該通道記錄的日志的最低 「級(jí)別」。Monolog (一個(gè)功能強(qiáng)勁的 Laravel 日志服務(wù))接受定義在 RFC 5424 specification 中的全部級(jí)別: emergencyalert、 criticalerror、 warningnotice、 infodebug

假設(shè)我們使用 debug 方法記錄日志消息:

Log::debug('An informational message.');

根據(jù)我們的配置, syslog 通道將把該消息記錄到系統(tǒng)日志;不過(guò)因?yàn)殄e(cuò)誤消息不是  critical 或更高級(jí)別,它將不會(huì)被發(fā)送到 Slack。如果我們記錄一條 emergency 消息,它將被發(fā)送給系統(tǒng)日志和 Slack,因?yàn)?emergency 的級(jí)別高于兩個(gè)通道的最低級(jí)別限制:

Log::emergency('The system is down!');

寫日志消息

可以使用 Log facade 將信息寫入日志。如前所述,日志提供定義在 RFC 5424 specification 中的可用日志級(jí)別: emergency、 alert、 critical、 error、 warning、 noticeinfodebug

Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);

因此,你可以調(diào)用這些方法中的任一方法記錄相應(yīng)級(jí)別的日志。默認(rèn)情況下,消息被寫入到在 config/logging.php 配置文件中定義的默認(rèn)日志通道:

<?php
   namespace App\Http\Controllers;use App\User;
   use Illuminate\Support\Facades\Log;
   use App\Http\Controllers\Controller;
   class UserController extends Controller{   
    /**
     * 顯示給定用戶的配置信息。
     *
     * @param  int  $id
     * @return Response
     */  
    public function showProfile($id)  
      {     
         Log::info('Showing user profile for user: '.$id);        
         return view('user.profile', ['user' => User::findOrFail($id)]);   
       }
    }

上下文信息

可以將上下文數(shù)據(jù)數(shù)組傳遞給日志方法。這些信息將被格式化,并與日志消息一直顯示:

Log::info('User failed to login.', ['id' => $user->id]);

寫入指定通道

有時(shí)候你可能希望將消息寫入到應(yīng)用默認(rèn)通道之外的通道中。可以使用 Log facade 的 channel 方法獲取定義在配置文件中的任一通道并將消息寫入其中 :

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

如果想要?jiǎng)?chuàng)建一個(gè)由多通道構(gòu)成的按需記錄的堆棧,可以使用 stack 方法:

Log::stack(['single', 'slack'])->info('Something happened!');

高度自定義 Monolog 通道

為通道自定義 Monolog

有時(shí)需要完全控制已存在通道的 Monolog: 比如,你可能想要為給定通道的日志處理配置自定義的 Monolog FormatterInterface 實(shí)現(xiàn):

先在通道配置中定義一個(gè) tap 數(shù)組。 tap 數(shù)組包含一個(gè)在通道創(chuàng)建后有機(jī)會(huì)用于自定義 Monolog 實(shí)例的類列表:

'single' => [   
 'driver' => 'single',    
 'tap' => [App\Logging\CustomizeFormatter::class],    
 'path' => storage_path('logs/laravel.log'),    
 'level' => 'debug',
],

一旦在通道中有了 tap 選項(xiàng)配置,就要準(zhǔn)備用于自定義 Monolog 實(shí)例的類。這種類這需要一個(gè)方法: __invoke,它接受一個(gè) Illuminate\Log\Logger 實(shí)例作為其參數(shù)。 Illuminate\Log\Logger 實(shí)例將所有方法調(diào)用代理到基礎(chǔ)的 Monolog 實(shí)例:

<?php
   namespace App\Logging;
   class CustomizeFormatter{   
    /**
     * 自定義給定的日志實(shí)例。
     *
     * @param  \Illuminate\Log\Logger  $logger
     * @return void
     */   
   public function __invoke($logger)   
    {      
      foreach ($logger->getHandlers() as $handler) {        
          $handler->setFormatter(...);      
         }  
      }
   }

{tip} 所有的 "tap" 類都是由 服務(wù)容器 解析的,因此任何依賴它們的構(gòu)造器都會(huì)自動(dòng)被注入。

創(chuàng)建 Monolog 處理器通道

Monolog 多種 可用處理器。在某些情況下,你會(huì)希望僅創(chuàng)建一個(gè)帶有指定處理器的 Monolog 驅(qū)動(dòng)的日志類型。這些通道可以使用 monolog 驅(qū)動(dòng)創(chuàng)建。

在使用 monolog 驅(qū)動(dòng)時(shí), handler 配置項(xiàng)用于指定被實(shí)例化的處理器。如果該處理器的構(gòu)造器需要參數(shù),可以使用可選的 with 配置項(xiàng)來(lái)指定:

'logentries' => [   
 'driver'  => 'monolog',    
 'handler' => Monolog\Handler\SyslogUdpHandler::class,    
 'with' => [      
   'host' => 'my.logentries.internal.datahubhost.company.com',        
   'port' => '10000',   
   ],
  ],

Monolog 格式化

使用 monolog 驅(qū)動(dòng)時(shí),Monolog 的 LineFormatter 用于默認(rèn)的格式化處理器。當(dāng)然,你也可以使用 formatter and formatter_with 配置項(xiàng)自定義格式化處理器類型:

'browser' => [  
  'driver' => 'monolog',    
  'handler' => Monolog\Handler\BrowserConsoleHandler::class,    
  'formatter' => Monolog\Formatter\HtmlFormatter::class,    
  'formatter_with' => [      
    'dateFormat' => 'Y-m-d',  
    ],
  ],

如果所用的 Monolog 處理器能夠提供自帶的格式代處理器,可以將 formatter 配置項(xiàng)指定為 default:

'newrelic' => [ 
   'driver' => 'monolog',    
   'handler' => Monolog\Handler\NewRelicHandler::class,    
   'formatter' => 'default',
],

通過(guò)工廠創(chuàng)建渠道

如果你想定義一個(gè)完全自定義的通道,你可以完全控制 Monolog 的實(shí)例化和配置,你可以在 config/logging.php 配置文件中指定 custom 驅(qū)動(dòng)程序類型。 你的配置應(yīng)該包含一個(gè) via 選項(xiàng),指向?qū)⒈徽{(diào)用以創(chuàng)建 Monolog 實(shí)例的工廠類:

'channels' => [  
  'custom' => [      
    'driver' => 'custom',        
    'via' => App\Logging\CreateCustomLogger::class,   
    ],
 ],

一旦配置了 custom 通道,就可以定義創(chuàng)建 Monolog 實(shí)例的類。 這個(gè)類只需要一個(gè)方法: __invoke ,它就可以返回 Monolog 實(shí)例:

<?php
  namespace App\Logging;use Monolog\Logger;
  class CreateCustomLogger{    
      /**
     * 創(chuàng)建一個(gè) Monolog 實(shí)例.
     *
     * @param  array  $config
     * @return \Monolog\Logger
     */   
    public function __invoke(array $config) 
      {     
         return new Logger(...);  
       }
     }
本文章首發(fā)在 LearnKu.com 網(wǎng)站上。