Skip to content
Snippets Groups Projects
Commit 3989dae4 authored by Dyszczo's avatar Dyszczo
Browse files

Merge branch 'feature/unified' into 'master'

PB-499 Unified logger

See merge request !9
parents 0eaf62bf f9ae1170
No related branches found
No related tags found
1 merge request!9PB-499 Unified logger
Pipeline #6462 failed
## [1.5.0] - 2019-04-18
### Changed
- Log file is unified with old way logger and all is logged in /wp-content/uploads/wpdesk-logs/wpdesk_debug.log
- Old static logger methods are deprecated
### Added
- All old way loggers are in deprecated dir and should work for old plugins
- Support for $shouldLoggerBeActivated static flag in factory - can return null logger
## [1.4.0] - 2019-01-21 ## [1.4.0] - 2019-01-21
### Changed ### Changed
- WC integration now considers broken WC_Logger implementation - WC integration now considers broken WC_Logger implementation
......
...@@ -9,7 +9,8 @@ ...@@ -9,7 +9,8 @@
"require": { "require": {
"php": ">=5.6", "php": ">=5.6",
"psr/log": "^1.0.1", "psr/log": "^1.0.1",
"monolog/monolog": "^1.23" "monolog/monolog": "^1.23",
"wpdesk/wp-notice": "^2.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^5", "phpunit/phpunit": "^5",
...@@ -18,6 +19,7 @@ ...@@ -18,6 +19,7 @@
"wimg/php-compatibility": "^8" "wimg/php-compatibility": "^8"
}, },
"autoload": { "autoload": {
"classmap": ["src/deprecated"],
"psr-4": {"WPDesk\\Logger\\": "src/"} "psr-4": {"WPDesk\\Logger\\": "src/"}
}, },
"autoload-dev": { "autoload-dev": {
......
...@@ -10,6 +10,8 @@ use Exception; ...@@ -10,6 +10,8 @@ use Exception;
/** /**
* Facilitates creation of logger with default WPDesk settings * Facilitates creation of logger with default WPDesk settings
* *
* @deprecated Only for backward compatibility. Please use injected Logger compatible with PSR
*
* @package WPDesk\Logger * @package WPDesk\Logger
*/ */
class LoggerFacade class LoggerFacade
......
<?php
namespace WPDesk\Logger\WP;
class WPCapture {
/** @var string */
private $filename;
public function __construct($filename) {
$this->filename = $filename;
}
/**
* Add notice for directory.
*
* @param string $dir Directory.
*/
private function add_notice_for_dir( $dir ) {
new \WPDesk\Notice\Notice(
sprintf(
// Translators: directory.
__(
'Can not enable WP Desk Debug log! Cannot create directory %s or this directory is not writeable!',
'wpdesk-helper'
),
$dir
),
WPDesk\Notice\Notice::NOTICE_TYPE_ERROR
);
}
/**
* Add notice for file.
*
* @param string $file File..
*/
private function add_notice_for_file( $file ) {
new \WPDesk\Notice\Notice(
sprintf(
// Translators: directory.
__(
'Can not enable WP Desk Debug log! Cannot create file %s!',
'wpdesk-helper'
),
$file
),
WPDesk\Notice\Notice::NOTICE_TYPE_ERROR
);
}
/**
* Is debug log writable.
*
* @return bool
*/
private function is_debug_log_writable_or_show_notice() {
$log_dir = $this->get_log_dir();
$log_file = $this->get_log_file();
$index_file = $this->get_index_file();
if ( ! file_exists( $log_dir ) ) {
if ( ! mkdir( $log_dir, 0777, true ) ) {
$this->add_notice_for_dir( $log_dir );
return false;
}
}
if ( ! file_exists( $index_file ) ) {
$index_html = fopen( $index_file, 'w' );
if ( false === $index_html ) {
$this->add_notice_for_file( $index_file );
return false;
} else {
fclose( $index_html );
}
}
if ( ! file_exists( $log_file ) ) {
$log = fopen( $log_file, 'w' );
if ( false === $log ) {
$this->add_notice_for_file( $log_file );
return false;
} else {
fclose( $log );
}
}
return true;
}
/**
* Init debug log file.
*/
public function init_debug_log_file() {
if ( $this->is_debug_log_writable_or_show_notice() ) {
ini_set( 'log_errors', 1 );
ini_set( 'error_log', $this->get_log_file() );
}
}
/**
* Get uploads dir.
*
* @return string
*/
private function get_uploads_dir() {
$upload_dir = wp_upload_dir();
return untrailingslashit( $upload_dir['basedir'] );
}
/**
* Get log dir.
*
* @return string
*/
private function get_log_dir() {
return trailingslashit( $this->get_uploads_dir() ) . 'wpdesk-logs';
}
/**
* Get log file.
*
* @return string
*/
public function get_log_file() {
return trailingslashit( $this->get_log_dir() ) . $this->filename;
}
/**
* Get log file.
*
* @return string
*/
private function get_index_file() {
return trailingslashit( $this->get_log_dir() ) . 'index.html';
}
}
\ No newline at end of file
...@@ -2,15 +2,16 @@ ...@@ -2,15 +2,16 @@
namespace WPDesk\Logger; namespace WPDesk\Logger;
use Monolog\Handler\AbstractHandler; use Exception;
use InvalidArgumentException;
use LogicException;
use Monolog\Handler\NullHandler; use Monolog\Handler\NullHandler;
use Monolog\Logger; use Monolog\Logger;
use Monolog\Registry; use Monolog\Registry;
use Monolog\ErrorHandler;
use Monolog\Handler\StreamHandler; use Monolog\Handler\StreamHandler;
use Psr\Log\LogLevel; use Psr\Log\LogLevel;
use WPDesk\Logger\Filter\BooleanFilter;
use WPDesk\Logger\WC\WooCommerceCapture; use WPDesk\Logger\WC\WooCommerceCapture;
use WPDesk\Logger\WP\WPCapture;
/** /**
* Manages and facilitates creation of logger * Manages and facilitates creation of logger
...@@ -27,6 +28,9 @@ class WPDeskLoggerFactory extends BasicLoggerFactory ...@@ -27,6 +28,9 @@ class WPDeskLoggerFactory extends BasicLoggerFactory
/** @var string Log to wc logger when level is */ /** @var string Log to wc logger when level is */
const LEVEL_WC = LogLevel::ERROR; const LEVEL_WC = LogLevel::ERROR;
/** @var bool Will factory return null logger or not */
public static $shouldLoggerBeActivated = true;
/** /**
* Remove static instances. In general should be use only testing purposes. * Remove static instances. In general should be use only testing purposes.
* *
...@@ -72,23 +76,44 @@ class WPDeskLoggerFactory extends BasicLoggerFactory ...@@ -72,23 +76,44 @@ class WPDeskLoggerFactory extends BasicLoggerFactory
*/ */
public function createWPDeskLogger($name = self::DEFAULT_LOGGER_CHANNEL_NAME) public function createWPDeskLogger($name = self::DEFAULT_LOGGER_CHANNEL_NAME)
{ {
if (!self::$shouldLoggerBeActivated) {
return new Logger($name);
}
if (Registry::hasLogger($name)) { if (Registry::hasLogger($name)) {
return Registry::getInstance($name); return Registry::getInstance($name);
} }
$logger = $this->createLogger($name); $logger = $this->createLogger($name);
$wpCapture = $this->captureWPLog($name);
$this->captureWooCommerce($logger); $this->captureWooCommerce($logger);
$this->captureErrorHandle($logger);
try { try {
$this->pushFileHandle($name, $logger); $this->pushFileHandle($wpCapture->get_log_file(), $logger);
} catch (\InvalidArgumentException $e) { } catch (InvalidArgumentException $e) {
$logger->emergency('File log could not be created - invalid filename.'); $logger->emergency('File log could not be created - invalid filename.');
} catch (\Exception $e) { } catch (Exception $e) {
$logger->emergency('File log could not be written.'); $logger->emergency('File log could not be written.');
} }
return $logger; return $logger;
} }
/**
* @param $name
*
* @return WPCapture
*/
private function captureWPLog($name) {
static $wpCapture;
if (!$wpCapture) {
$wpCapture = new WPCapture($this->getFileName($name));
$wpCapture->init_debug_log_file();
}
return $wpCapture;
}
/** /**
* Capture WooCommerce and add handle * Capture WooCommerce and add handle
* *
...@@ -104,36 +129,24 @@ class WPDeskLoggerFactory extends BasicLoggerFactory ...@@ -104,36 +129,24 @@ class WPDeskLoggerFactory extends BasicLoggerFactory
$wcIntegration->captureWcLogger(); $wcIntegration->captureWcLogger();
} }
/**
* Add WordPress(standard PHP) errors handle
*
* @param Logger $logger
*/
private function captureErrorHandle(Logger $logger)
{
$errorHandler = new ErrorHandler($logger);
$errorHandler->registerErrorHandler();
}
/** /**
* Add WPDesk log file handle * Add WPDesk log file handle
* *
* @param Logger $logger * @param Logger $logger
* @param string $name Name of the logger * @param string $filename Name of file with path
* *
* @throws \Exception If a missing directory is not buildable * @throws Exception If a missing directory is not buildable
* @throws \InvalidArgumentException If stream is not a resource or string * @throws InvalidArgumentException If stream is not a resource or string
*/ */
private function pushFileHandle($name, Logger $logger) private function pushFileHandle($filename, Logger $logger)
{ {
$filename = $this->getFileName($name);
$logger->pushHandler(new StreamHandler($filename, self::LEVEL_WPDESK_FILE)); $logger->pushHandler(new StreamHandler($filename, self::LEVEL_WPDESK_FILE));
} }
/** /**
* Get filename old way * Get filename old way
* *
* @deprecated * @deprecated not sure if can remove
*/ */
public function getWPDeskFileName() public function getWPDeskFileName()
{ {
...@@ -141,7 +154,7 @@ class WPDeskLoggerFactory extends BasicLoggerFactory ...@@ -141,7 +154,7 @@ class WPDeskLoggerFactory extends BasicLoggerFactory
} }
/** /**
* Returns WPDesk filename with path. * Returns WPDesk filename.
* *
* @param string $name Name of the logger * @param string $name Name of the logger
* *
...@@ -149,7 +162,7 @@ class WPDeskLoggerFactory extends BasicLoggerFactory ...@@ -149,7 +162,7 @@ class WPDeskLoggerFactory extends BasicLoggerFactory
*/ */
public function getFileName($name = self::DEFAULT_LOGGER_CHANNEL_NAME) public function getFileName($name = self::DEFAULT_LOGGER_CHANNEL_NAME)
{ {
return WP_CONTENT_DIR . '/uploads/logs/' . $name . '_debug.log'; return $name . '_debug.log';
} }
/** /**
...@@ -165,7 +178,7 @@ class WPDeskLoggerFactory extends BasicLoggerFactory ...@@ -165,7 +178,7 @@ class WPDeskLoggerFactory extends BasicLoggerFactory
while (true) { while (true) {
$logger->popHandler(); $logger->popHandler();
} }
} catch (\LogicException $e) { } catch (LogicException $e) {
$logger->pushHandler(new NullHandler()); $logger->pushHandler(new NullHandler());
} }
} }
......
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'WPDesk_Logger_Factory' ) ) {
/**
* @deprecated Only for backward compatibility. Please use injected Logger compatible with PSR
*/
class WPDesk_Logger_Factory {
/**
* Static logger storage
*
* @var WPDesk_Logger
*/
static private $logger = null;
const BACKTRACE_FILENAME_KEY = 'file';
const WPDESK_LOG_ACTION_NAME = 'wpdesk_log';
/**
* Creates and returns a logger
*
* @return WPDesk_Logger
*/
public static function create_logger() {
if ( empty( self::$logger ) ) {
$logger = new WPDesk_Logger();
$logger->attach_hooks();
self::$logger = $logger;
}
return self::$logger;
}
/**
* Log this exception into wpdesk logger
*
* @param WP_Error $e Error to log.
* @param array $backtrace Backtrace information with snapshot of error env.
*
* @see http://php.net/manual/en/function.debug-backtrace.php
*/
public static function log_wp_error( WP_Error $e, array $backtrace ) {
$message = 'Error: ' . get_class( $e ) . ' Code: ' . $e->get_error_code() . ' Message: ' . $e->get_error_message();
self::log_message_backtrace( $message, WPDesk_Logger::ERROR, $backtrace );
}
/**
* Log this exception into WPDesk logger
*
* @param Exception $e Exception to log.
*/
public static function log_exception( Exception $e ) {
$message = 'Exception: ' . get_class( $e ) . ' Code: ' . $e->getCode() . ' Message: ' . $e->getMessage() . ' Stack: ' . $e->getTraceAsString();
self::log_message( $message, $e->getFile(), WPDesk_Logger::ERROR );
}
/**
* Log message into WPDesk logger
*
* @param string $message Message to log.
* @param string $source Source of the message - can be file name, class name or whatever.
* @param string $level Level of error.
*/
public static function log_message( $message, $source = 'unknown', $level = WPDesk_Logger::DEBUG ) {
self::create_logger();
do_action( self::WPDESK_LOG_ACTION_NAME, $level, $source, $message );
self::$logger->wpdesk_log($level, $source, $message);
}
/**
* Log message into WPDesk logger
*
* @param string $message Message to log.
* @param string $level Level of error.
* @param array $backtrace Backtrace information with snapshot of error env.
*/
public static function log_message_backtrace( $message, $level = WPDesk_Logger::DEBUG, array $backtrace ) {
$message .= ' Backtrace: ' . json_encode( $backtrace );
if (isset($backtrace[ self::BACKTRACE_FILENAME_KEY ])) {
$filename = $backtrace[ self::BACKTRACE_FILENAME_KEY ];
} else {
$filename = 'unknown';
}
self::log_message( $message, $filename, $level );
}
}
}
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'WPDesk_Logger' ) ) {
/**
* @deprecated Only for backward compatibility. Please use injected Logger compatible with PSR
*/
class WPDesk_Logger {
/** @var \Psr\Log\LoggerInterface */
static $logger;
const EMERGENCY = 'emergency';
const ALERT = 'alert';
const CRITICAL = 'critical';
const ERROR = 'error';
const WARNING = 'warning';
const NOTICE = 'notice';
const INFO = 'info';
const DEBUG = 'debug';
public function __construct() {
if (!self::$logger) {
$loggerFactroy = new \WPDesk\Logger\WPDeskLoggerFactory();
self::$logger = $loggerFactroy->createWPDeskLogger();
}
}
/**
* Level strings mapped to integer severity.
*
* @var array
*/
protected $level_to_severity = [
self::EMERGENCY => 800,
self::ALERT => 700,
self::CRITICAL => 600,
self::ERROR => 500,
self::WARNING => 400,
self::NOTICE => 300,
self::INFO => 200,
self::DEBUG => 100,
];
/**
* Attach hooks
*
* @return void
*/
public function attach_hooks() {
add_action( 'plugins_loaded', [ $this, 'plugins_loaded' ] );
add_filter( 'wpdesk_logger_level_options', [ $this, 'wpdesk_logger_level_options' ] );
}
public function plugins_loaded() {
if ( defined( 'WC_VERSION' ) ) {
if ( version_compare( WC_VERSION, '3.0', '<' ) ) {
add_action( 'wpdesk_log', [ $this, 'wpdesk_log' ], 10, 4 );
} else {
add_action( 'wpdesk_log', [ $this, 'wpdesk_log_30' ], 10, 4 );
}
}
}
public function wpdesk_logger_level_options( array $options ) {
return [
'disabled' => __( 'Disabled', 'wpdesk-helper' ),
'emergency' => __( 'Emergency', 'wpdesk-helper' ),
'alert' => __( 'Alert', 'wpdesk-helper' ),
'critical' => __( 'Critical', 'wpdesk-helper' ),
'error' => __( 'Error', 'wpdesk-helper' ),
'warning' => __( 'Warning', 'wpdesk-helper' ),
'notice' => __( 'Notice', 'wpdesk-helper' ),
'info' => __( 'Info', 'wpdesk-helper' ),
'debug' => __( 'Debug', 'wpdesk-helper' ),
];
}
/**
* @param string $level
* @param string $source
* @param string $message
* @param string $settings_level
*/
public function wpdesk_log( $level, $source, $message, $settings_level = 'debug' ) {
if ( ! isset( $this->level_to_severity[ $settings_level ] ) || ! isset( $this->level_to_severity[ $level ] ) ) {
return;
}
if ( $this->level_to_severity[ $settings_level ] > $this->level_to_severity[ $level ] ) {
return;
}
if ( is_array( $message ) || is_object( $message ) ) {
$message = print_r( $message, true );
}
self::$logger->log( $level, $message, ['source' => $source]);
}
public function wpdesk_log_30( $level, $source, $message, $settings_level = 'debug' ) {
if ( ! isset( $this->level_to_severity[ $settings_level ] ) || ! isset( $this->level_to_severity[ $level ] ) ) {
return;
}
if ( $this->level_to_severity[ $settings_level ] > $this->level_to_severity[ $level ] ) {
return;
}
if ( is_array( $message ) || is_object( $message ) ) {
$message = print_r( $message, true );
}
self::$logger->log( $level, $message, ['source' => $source]);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment