Introduce
- To help you know what’s going on in the system, Laravel provides powerful logging services that allow you to log files, system logs or even Slack to notify the entire team. your
- Not only to help you debug, but it also helps you to record the execution history as desired
- Laravel uses the Monolog library to provide and support many different ways of handling logs. You can also reconfigure or combine them to handle the log as you like
1. Configuration and types of channel drivers
All log configuration is in config/logging.php
file By default Laravel will use stack
channel to save log
- Channel drivers There are many types of log channels that Laravel provides. Depending on the requirements of the project, you can use 1 or a combination of the following channel log types:
Name description custom Driver allows you to call a class factory to create a new channel daily Use RotatingFileHandler
class to log and log file will be generated dailyerrorlog Use ErrorLogHandler
class to log and log files to php’s errorlogmonolog As a factory driver that allows you to use any Monolog handle null As a driver that ignores all logs papertrail Use SyslogUdpHandler
class to log and log will be stored in the cloudmonolog As a factory driver that allows you to use any Monolog handle single Is a driver that allows you to save logs to a single file slack Use SlackWebHookHandler
to log to slack – a chat appstack Allows you to use multiple channels syslog Use SyslogHandler
to log to the operating system’s system log
- Channel Single and Daily : Single and daily channels alone have 3 more config options: buble , permission and locking
Name description Default bubble Allow logging to other channels not for example when using stack true locking Lock the log file again before writing in false permission Permissions option for log file 0644
- Daily channel : has the option of days as the number of days the log file is kept, the default will be 7 days.
- Papertrail channel : will need to configure the host and port of the cloud you use to log
- Slack channel : will need url configuration, by default slack will only receive logs at critical level or higher
- Deprecations log : To log warnings about unused features, use deprecations
- Log level : emergency, alert, critical, error, warning, notice, info, and debug.
2. Specify another log channel
- Using a log channel other than the default channel we use the Log facade to access and log into any defined channels:1234<span class="token keyword">use</span> <span class="token package">Illuminate Support Facades Log</span> <span class="token punctuation">;</span><span class="token class-name static-context">Log</span> <span class="token operator">::</span> <span class="token function">channel</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'slack'</span> <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token function">info</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'Something happened!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>
- To create the desired logging stack you use the stack method:12<span class="token class-name static-context">Log</span> <span class="token operator">::</span> <span class="token function">stack</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'single'</span> <span class="token punctuation">,</span> <span class="token string single-quoted-string">'slack'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token function">info</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'Something happened!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>
- Create a desired channel by providing a configuration array to the build method:1234567<span class="token keyword">use</span> <span class="token package">Illuminate Support Facades Log</span> <span class="token punctuation">;</span><span class="token class-name static-context">Log</span> <span class="token operator">::</span> <span class="token function">build</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'driver'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'single'</span> <span class="token punctuation">,</span><span class="token string single-quoted-string">'path'</span> <span class="token operator">=></span> <span class="token function">storage_path</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'logs/custom.log'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token function">info</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'Something happened!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>
3. Create a custom channel by creating a Factory class
- First you need to create a factory class, which will return a Monolog instance. In this class you will need to define a method called __invoke , this method needs to pass a configuration array:12345678910111213141516<span class="token keyword">namespace</span> <span class="token package">App Logging</span> <span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Monolog Logger</span> <span class="token punctuation">;</span><span class="token keyword">use</span> <span class="token package">Monolog Handler StreamHandler</span> <span class="token punctuation">;</span><span class="token keyword">class</span> <span class="token class-name-definition class-name">CustomLogger</span><span class="token punctuation">{</span><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__invoke</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">array</span> <span class="token variable">$config</span> <span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token variable">$logger</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Logger</span> <span class="token punctuation">(</span> <span class="token variable">$config</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'name'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token variable">$logger</span> <span class="token operator">-></span> <span class="token function">pushHandler</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">StreamHandler</span> <span class="token punctuation">(</span> <span class="token variable">$config</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'path'</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token variable">$config</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'level'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span><span class="token keyword">return</span> <span class="token variable">$logger</span> <span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
- Then define your custom log channel in config/longging.php, using via to point to your factory class just created above1234567891011<span class="token string single-quoted-string">'channels'</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token comment">// ...</span><span class="token string single-quoted-string">'custom'</span> <span class="token operator">=></span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'driver'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'custom'</span> <span class="token punctuation">,</span><span class="token string single-quoted-string">'via'</span> <span class="token operator">=></span> <span class="token class-name class-name-fully-qualified static-context">App Logging CustomLogger</span> <span class="token operator">::</span> <span class="token keyword">class</span> <span class="token punctuation">,</span><span class="token string single-quoted-string">'name'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'my-channel'</span> <span class="token punctuation">,</span><span class="token string single-quoted-string">'path'</span> <span class="token operator">=></span> <span class="token function">storage_path</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'logs/my-channel.log'</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span><span class="token string single-quoted-string">'level'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'debug'</span> <span class="token punctuation">,</span><span class="token punctuation">]</span> <span class="token punctuation">,</span><span class="token punctuation">]</span> <span class="token punctuation">,</span>
- That you can use your custom channel123456<span class="token keyword">use</span> <span class="token package">Illuminate Support Facades Log</span> <span class="token punctuation">;</span><span class="token comment">// ...</span><span class="token class-name static-context">Log</span> <span class="token operator">::</span> <span class="token function">channel</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'custom'</span> <span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token function">debug</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'This is a debug message for my custom channel'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span>