How to save custom log file in laravel 5.6? - php

I'm totally new to laravel, I am using laravel 5.6. and I am trying to create custom logging file. I googled but could not find.
I made here a chanel in config/logging.php:
'userLogin' => [
'driver' => 'daily',
'path' => storage_path('logs/user.log'),
'level' => 'info',
],
and used it in my controller:
use Log;
Log::channel('userLogin')->info('A transaction has been made!');
but it not writing to file at all.

Your code looks correct. I would guess that this is a permissions issue related to your log file. Try changing the log file to the default laravel log file: storage_path('logs/laravel.log'). If this solves the problem, then the problem is either that the logs/user.log file does not yet exist and your system wants to you to create it manually, or the file does exist but does not have proper permissions. Since I don't know your file system, etc. I can't give explicit instructions for setting permissions but I'd be happy to help if you get to that point.

this is my logging config
<?php
use Monolog\Handler\StreamHandler;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "monolog",
| "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single', 'singleInfo', 'singleAlert', 'singleWarning', 'singleCritical', 'singleEmergency'],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'singleInfo' => [
'driver' => 'single',
'path' => storage_path('logs/info.log'),
'level' => 'info',
],
'singleAlert' => [
'driver' => 'single',
'path' => storage_path('logs/alert.log'),
'level' => 'alert',
],
'singleWarning' => [
'driver' => 'single',
'path' => storage_path('logs/warning.log'),
'level' => 'warning',
],
'singleCritical' => [
'driver' => 'single',
'path' => storage_path('logs/critical.log'),
'level' => 'critical',
],
'singleEmergency' => [
'driver' => 'single',
'path' => storage_path('logs/emergency.log'),
'level' => 'emergency',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 0,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'with' => [
'stream' => 'php://stderr',
],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
],
];

Related

Separate Log Files Laravel 8

I am trying to have Error messages and debug messages write to separate log files, laravel.log for error messages and debug.log for debug messages. As of now, debug messages are not writing to the error log, which is good but error messages are still writing to the debug log.
here is the config from logging.php:
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single', 'syslog'],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'error',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel-'.php_sapi_name().'-'.$processName.'.log'),
'level' => 'debug',
'days' => 7,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'syslog' => [
'driver' => 'single',
'level' => 'debug',
'path' => storage_path('logs/debug.log'),
],
'errorlog' => [
'driver' => 'errorlog',
'path' => storage_path('logs/laravel.log'),
'level' => 'error',
],
],
];
And when I am writing a debug message, I write to the specific channel:
Log::channel('syslog')->debug($message);
I want to stop error messages from writing to debug.log, and only write to laravel.log
Thanks!
Okay I figured this out for anyone who may need it in the future!
So Laravel's stack channel contains any other channel that you want to be active; and the default channel when writing something like Log::debug('message');
will look like this:
'default' => env('LOG_CHANNEL', 'stack')
With my configuration from above, changing the default to 'single', which I have set as the error level will look like this:
'default' => env('LOG_CHANNEL', 'single')
Just be sure to log to specific channels when logging( I built a helper function for this ) and you will be good!

Laravel: add `stdout` stream for logging

I want to add stdout stream for logging in conjunction with storage/logs/laravel.log file in my Laravel app.
So, I've added new stdout channel to config/logging.php file like this:
'channels' => [
...
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'stdout' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'with' => [
'stream' => 'php://stdout',
],
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
],
...
]
Is it correct? How can I monitor or check the work of php://stdout or php://stderr streams of my app from terminal? Unfortunately, I can't find any reliable example yet.

laravel log system with logstash

I have a laravel application that I want to store my logs into my logstash and see them in kibana i searched a lot over the net to find a solution for it but I didnt find any good source for it, is there any package to use laravel logs into logstash ???
by the way I have my logstash and kibana running without any problem I just need a source of data now .
and here is my elstic search running :
{
name: "5351ced3b7a4",
cluster_name: "elasticsearch",
cluster_uuid: "Ej5TRN8CQyGvemZlT3gAFA",
version: {
number: "7.1.1",
build_flavor: "oss",
build_type: "tar",
build_hash: "7a013de",
build_date: "2019-05-23T14:04:00.380842Z",
build_snapshot: false,
lucene_version: "8.0.0",
minimum_wire_compatibility_version: "6.8.0",
minimum_index_compatibility_version: "6.0.0-beta1"
},
tagline: "You Know, for Search"
}
EDIT
as the answer explains the way I did and now I get this error in my logs in laravel :
[2019-08-05 14:16:17] laravel.INFO: Hello logstash!
EDIT :
The Logging Config file :
<?php
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "monolog",
| "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daily'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'papertrail' => [
'driver' => 'monolog',
'level' => 'debug',
'handler' => SyslogUdpHandler::class,
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
],
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
'logstash' => [
'driver' => 'custom',
'via' => \App\LogstashLogger::class,
'host' => env('LOGSTASH_HOST', '127.0.0.1'),
'port' => env('LOGSTASH_PORT', 9200),
],
],
];
As explained in this post it's quite easy to do.
Configure a logging channel in config/logging.php (docs)
'channels' => [
// ... other channels like stack or single
'logstash' => [
'driver' => 'custom',
'via' => \App\LogstashLogger::class,
'host' => env('LOGSTASH_HOST', '127.0.0.1'),
'port' => env('LOGSTASH_PORT', 4718),
],
],
Create a custom Logger factory (docs)
namespace App;
use Monolog\Formatter\LogstashFormatter;
use Monolog\Handler\SocketHandler;
use Monolog\Logger;
use Psr\Log\LoggerInterface;
class LogstashLogger {
/**
* #param array $config
* #return LoggerInterface
*/
public function __invoke(array $config): LoggerInterface
{
$handler = new SocketHandler("udp://{$config['host']}:{$config['port']}");
$handler->setFormatter(new LogstashFormatter(config('app.name')));
return new Logger('logstash.main', [$handler]);
}
}
This will write logs via udp to the specified host and port using the monolog logstash formatter
To now write log entries to logstash specify the logging channel you just created (docs)
Log::channel('logstash')->info('Hello logstash!');
This wasn't working for me because of the UCP socket connection, rather than debugging it I just changed it to TCP and it worked.
I first tested it on the command line:
echo "hello world!" | nc 127.0.0.1 5000
If that doesn't work, then you need to update your elastic configuration, otherwise s/udp/tcp.
$handler = new SocketHandler("tcp://127.0.0.1:5000");
$formatter = new LogstashFormatter('EXAMPLE');
$handler->setFormatter($formatter);
$logger = new Logger('logstash.main', [$handler]);

Laravel Lumen Logging not working on production

I have a small project on Laravel/Lumen where I use logging messages like this
Log::info('User failed to login.',
['Env token' => $this->envToken, 'Request token' =>$request->header('Authorization')]);
I can check my log in storage/logs/lumen.log just fine. The problem is when I push it to my vps where the log stops working. In there I ran composer install --no-dev to install the production dependencies only.
Is there a required dev dependency for logging or it can be something else??
More info:
Vendor/laravel/lumen-framework/config/logging.php (I haven't change it, so it's by default)
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/lumen.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/lumen.log'),
'level' => 'debug',
'days' => 7,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Lumen Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
],
];
.env file
APP_ENV=local
APP_DEBUG=true
APP_KEY=stuffkey
APP_TIMEZONE=UTC
LOG_CHANNEL=stack
LOG_SLACK_WEBHOOK_URL=
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=stuffdb
DB_USERNAME=stuffuser
DB_PASSWORD=stuffkey
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
RESTTOKEN=blablablabla

How to save session in redis with cakephp 3.0?

Hello guy's I newbie in cakephp 3.0. I know little bit cakephp 2.0. I configured my redis with cakephp 2.0 with this help of url But I don't know how to configure in cakephp 3.0 please help me
Since Cakephp 4 is out, I am currently studying it (which seems exists in Cakphp 3 as well) and seems like there is a way to do it. Not tested yet.
Following this: https://book.cakephp.org/4/en/development/sessions.html#cache-sessions
app.php
'Session' => [
'defaults' => 'cache', //Use the Cache class to save session
'handler' => [
'config' => 'session'
]
],
Following this link: https://book.cakephp.org/4/en/core-libraries/caching.html#redisengine-options
app.php
/*
* Configure the cache adapters.
*/
'Cache' => [
'session' => [
'className' => RedisEngine::class,
//`port` The port your Redis server is running on.
//`host` The host your Redis server is running on.
//`database` The database number to use for connection.
//`password` Redis server password.
//`persistent` Should a persistent connection be made to Redis.
//`timeout` Connection timeout for Redis.
//`unix_socket` Path to a unix socket for Redist.
],
],
I am going to test this out later on and make update if needed, but it really seems promising.
Update 2020-05-20: Tested, it work fine
You would set your session to use cache sessions inside the app.php file:
'Session' => [
'defaults' => 'cache'
]
Then, you would set your cache to redis:
'Cache' => [
'default' => [
'className' => 'Redis',
],
]
In vendor\cakephp\cakephp\src\Network\Session.php
you can see the default type of session.
They are listed as php, cake,cache , database.
$defaults = [
'php' => [
'cookie' => 'CAKEPHP',
'ini' => [
'session.use_trans_sid' => 0,
]
],
'cake' => [
'cookie' => 'CAKEPHP',
'ini' => [
'session.use_trans_sid' => 0,
'session.serialize_handler' => 'php',
'session.use_cookies' => 1,
'session.save_path' => TMP . 'sessions',
'session.save_handler' => 'files'
]
],
'cache' => [
'cookie' => 'CAKEPHP',
'ini' => [
'session.use_trans_sid' => 0,
'session.use_cookies' => 1,
'session.save_handler' => 'user',
],
'handler' => [
'engine' => 'CacheSession',
'config' => 'default'
]
],
'database' => [
'cookie' => 'CAKEPHP',
'ini' => [
'session.use_trans_sid' => 0,
'session.use_cookies' => 1,
'session.save_handler' => 'user',
'session.serialize_handler' => 'php',
],
'handler' => [
'engine' => 'DatabaseSession'
]
]
]
Here is cache using default config of Cache. Maybe you want to use defualt as a File Cache.
In app.php
create a new cache config
'redis' => [
'className' => 'Redis',
'server'=>'127.0.0.1',
'port'=>6379
],
Then you can use your new cache config here.
'Session' => [
'cookie' => 'herewego',
'ini' => [
'session.use_trans_sid' => 0,
'session.use_cookies' => 1,
'session.save_handler' => 'user',
],
'handler' => [
'engine' => 'CacheSession',
'config' => 'redis'
]
],

Categories