Coder Social home page Coder Social logo

laravel-log-enhancement's Introduction

laravel-log-enhancement

Software License CircleCI Total Downloads

A library with logging enhancement. Including:

  • Overriding Log facade

    • It extends default Laravel Log facade with logging adding class path and tracking id into context.
  • LogglyHandler class

    • It extends monolog's LogglyHandler with tags support
  • DatadogHandler class

    • It supports Datadog Logs

Install

composer require onramplab/laravel-log-enhancement
  • use Datadog APM to connect php logs and traces
curl -LO https://github.com/DataDog/dd-trace-php/releases/latest/download/datadog-setup.php
sudo php datadog-setup.php --php-bin=all

Usage

LoggerFacade

The log json will look like this:

{
  "message": "Test",
  "context": {
    "class_path": "App\\Fake",
    "tracking_id": "652c3456-1a17-42b8-9fa7-9bee65e655eb"
  },
  "level": 200,
  "level_name": "INFO",
  "channel": "local",
  "extra": {},
  "timestamp": "2021-01-04T22:47:56.598608-0800"
}

LogglyHandler

You can adding following block into config/logging.php.

use Monolog\Formatter\LogglyFormatter;
use Onramplab\LaravelLogEnhancement\Handlers\LogglyHandler;

return [
  //...


  'channels' => [
    //...

    'loggly' => [
        'driver' => 'monolog',
        'level' => 'info',
        'handler' => LogglyHandler::class,
        'handler_with' => [
            'token' => env('LOGGLY_TOKEN'),
            'tags' => env('LOGGLY_TAGS'),
        ],
        'formatter' => LogglyFormatter::class,
    ],
  ]
];

DatadogHandler

You can adding following block into config/logging.php.

use Monolog\Formatter\JsonFormatter;
use Onramplab\LaravelLogEnhancement\Handlers\DatadogHandler;

return [
  //...

  'channels' => [
    //...

    'datadog' => [
      'driver' => 'monolog',
      'level' => 'info',
      'handler' => DatadogHandler::class,
      'handler_with' => [
          'key' => env('DD_LOG_API_KEY'),
          'region' => env('DD_LOG_REGION', 'us5'),
          'attributes' => [
              'hostname' => gethostname(),
              'source' => env('DD_LOG_SOURCE', 'laravel'),
              'service' => env('DD_LOG_SERVICE'),
              'tags' => env('DD_LOG_TAG'),
          ],
      ],
      'formatter' => JsonFormatter::class,
    ],
  ]
];

Testing

Run the tests with:

vendor/bin/phpunit

Contributing

Please see CONTRIBUTING for details.

Security

If you discover any security-related issues, please email [email protected] instead of using the issue tracker.

License

The MIT License (MIT). Please see License File for more information.# laravel-log-enhancement

laravel-log-enhancement's People

Contributors

koshuang avatar musigm avatar

Watchers

 avatar  avatar  avatar  avatar

laravel-log-enhancement's Issues

LogFacade should fully be compatible with Laravel default Log Facade

Requirements

Because current LogFacade did not support usage of channel, it will cause error when adding log like Log::channel('daily')->info('test');.

So we need to make LogFacade compatible with Laravel Log Facade.

Implementation

  • We copy same idea from Laravel LogManager and Logger structure. Bring the logic of appending extra data into Logger and then replace it in LogManager when LogManager tries to get a Logger instance.
  • Since there are two ways to log (Log::info('test'); or Log::channel('daily')->info('test');, the way we get class path from call stack will need to adapt.

It's not working when use Illuminate\Support\Facades\Log

Issue

When using Illuminate\Support\Facades\Log to log, it will use the default LogManager even we set Log alias to \Onramplab\LaravelLogEnhancement\Facades\LoggerFacade::class in config/app.php. So it won't log extra context like tracking_id and class_path.

Daemon Job will use same Log Facade

Issue

因為 Daemon Job 會重用同一個 php process ,所以會導致兩個不同的 Job 所 log 的 tracking_id 是一樣的。

Solution

需要在每次 Job 被建立時,把 Laravel IoC Container 裡的 instance 釋放掉,順便再把 Facade 的 binding 清掉。如下:

Queue::before(function () {
    $this->app->forgetInstance('laravel-log-enhancement-logger');
    Facade::clearResolvedInstance('laravel-log-enhancement-logger');
});

Reference

incompatible with newer version of laravel.

/html/vendor/onramplab/laravel-log-enhancement/src/LogManager.php on line 57
neo-backend-php-1  | 
neo-backend-php-1  |    Symfony\Component\ErrorHandler\Error\FatalError 
neo-backend-php-1  | 
neo-backend-php-1  |   Declaration of Onramplab\LaravelLogEnhancement\LogManager::get($name) must be compatible with Illuminate\Log\LogManager::get($name, ?array $config = null)
neo-backend-php-1  | 
neo-backend-php-1  |   at vendor/onramplab/laravel-log-enhancement/src/LogManager.php:57
neo-backend-php-1  |      53▕      *
neo-backend-php-1  |      54▕      * @param  string  $name
neo-backend-php-1  |      55▕      * @return \Psr\Log\LoggerInterface
neo-backend-php-1  |      56▕      */
neo-backend-php-1  |   ➜  57▕     protected function get($name)
neo-backend-php-1  |      58▕     {
neo-backend-php-1  |      59▕         try {
neo-backend-php-1  |      60▕             return $this->channels[$name] ?? with($this->resolve($name), function ($logger) use ($name) {
neo-backend-php-1  |      61▕                 return $this->channels[$name] = $this->tap($name, new Logger($logger, $this->app['events']));
neo-backend-php-1  | PHP Fatal error:  Uncaught Whoops\Exception\ErrorException: Using ${var} in strings is deprecated, use {$var} instead in /var/www/html/vendor/facade/ignition/src/SolutionProviders/MergeConflictSolutionProvider.php:52
neo-backend-php-1  | Stack trace:
neo-backend-php-1  | #0 /var/www/html/vendor/composer/ClassLoader.php(578): Whoops\Run->handleError()
neo-backend-php-1  | #1 /var/www/html/vendor/composer/ClassLoader.php(578): include()
neo-backend-php-1  | #2 /var/www/html/vendor/composer/ClassLoader.php(432): Composer\Autoload\ClassLoader::Composer\Autoload\{closure}()
neo-backend-php-1  | #3 [internal function]: Composer\Autoload\ClassLoader->loadClass()
neo-backend-php-1  | #4 /var/www/html/vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php(50): class_implements()
neo-backend-php-1  | #5 [internal function]: Facade\Ignition\SolutionProviders\SolutionProviderRepository->Facade\Ignition\SolutionProviders\{closure}()
neo-backend-php-1  | #6 /var/www/html/vendor/laravel/framework/src/Illuminate/Collections/Arr.php(717): array_filter()
neo-backend-php-1  | #7 /var/www/html/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(358): Illuminate\Support\Arr::where()
neo-backend-php-1  | #8 /var/www/html/vendor/facade/ignition/src/SolutionProviders/SolutionProviderRepository.php(49): Illuminate\Support\Collection->filter()
neo-backend-php-1  | #9 /var/www/html/vendor/nunomaduro/collision/src/Adapters/Laravel/IgnitionSolutionsRepository.php(36): Facade\Ignition\SolutionProviders\SolutionProviderRepository->getSolutionsForThrowable()
neo-backend-php-1  | #10 /var/www/html/vendor/nunomaduro/collision/src/Writer.php(244): NunoMaduro\Collision\Adapters\Laravel\IgnitionSolutionsRepository->getFromThrowable()
neo-backend-php-1  | #11 /var/www/html/vendor/nunomaduro/collision/src/Writer.php(123): NunoMaduro\Collision\Writer->renderSolution()
neo-backend-php-1  | #12 /var/www/html/vendor/nunomaduro/collision/src/Handler.php(39): NunoMaduro\Collision\Writer->write()
neo-backend-php-1  | #13 /var/www/html/vendor/nunomaduro/collision/src/Adapters/Laravel/ExceptionHandler.php(72): NunoMaduro\Collision\Handler->handle()
neo-backend-php-1  | #14 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(185): NunoMaduro\Collision\Adapters\Laravel\ExceptionHandler->renderForConsole()
neo-backend-php-1  | #15 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(171): Illuminate\Foundation\Bootstrap\HandleExceptions->renderForConsole()
neo-backend-php-1  | #16 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(209): Illuminate\Foundation\Bootstrap\HandleExceptions->handleException()
neo-backend-php-1  | #17 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleShutdown()
neo-backend-php-1  | #18 {main}
neo-backend-php-1  |   thrown in /var/www/html/vendor/facade/ignition/src/SolutionProviders/MergeConflictSolutionProvider.php on line 52

Add LogglyHandler

Monolog's LogglyLogger did not support tags config. So we want to extend it to let us can set tags in config/logging.php file.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.