Files
2026-04-28 15:13:50 +02:00

118 lines
3.3 KiB
PHP

<?php
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
*
* This source code is licensed under the license found in the
* LICENSE file in the root directory of this source tree.
*
* @package MetaCommerce
*/
namespace WooCommerce\Facebook\Framework;
use WC_Facebookcommerce_Utils;
use Throwable;
defined( 'ABSPATH' ) || exit;
/**
* The ErrorLog handler.
*
* @since 3.5.0
*/
class ErrorLogHandler extends LogHandlerBase {
/**
* Hook name for Meta Log API.
*/
const META_LOG_API = 'facebook_for_woocommerce_log_api';
/**
* Constructs a new ErrorLog handler.
*
* @since 3.5.0
*/
public function __construct() {
add_action( self::META_LOG_API, array( $this, 'process_error_log' ), 10, 1 );
}
/**
* Function that calls log_to_meta api.
*
* @internal
*
* @param array $raw_context log context
* @since 3.5.0
*/
public function process_error_log( $raw_context ) {
$context = self::set_core_log_context( $raw_context );
try {
$response = facebook_for_woocommerce()->get_api()->log_to_meta( $context );
if ( ! $response->success ) {
Logger::log(
'Bad response from log_to_meta request',
[],
array(
'should_send_log_to_meta' => false,
'should_save_log_in_woocommerce' => true,
'woocommerce_log_level' => \WC_Log_Levels::ERROR,
)
);
}
} catch ( \Exception $e ) {
Logger::log(
'Error persisting error logs: ' . $e->getMessage(),
[],
array(
'should_send_log_to_meta' => false,
'should_save_log_in_woocommerce' => true,
'woocommerce_log_level' => \WC_Log_Levels::ERROR,
)
);
}
}
/**
* Utility function for sending exception logs to Meta.
*
* @since 3.5.0
*
* @param Throwable $error error object
* @param array $context optional error message attributes
*/
public static function log_exception_to_meta( Throwable $error, array $context = [] ) {
$extra_data = WC_Facebookcommerce_Utils::get_context_data( $context, 'extra_data', [] );
$extra_data['php_version'] = phpversion();
$request_data = [
'event' => WC_Facebookcommerce_Utils::get_context_data( $context, 'event', 'error_log' ),
'event_type' => WC_Facebookcommerce_Utils::get_context_data( $context, 'event_type' ),
'exception_message' => $error->getMessage(),
'exception_trace' => $error->getTraceAsString(),
'exception_code' => $error->getCode(),
'exception_class' => get_class( $error ),
'order_id' => WC_Facebookcommerce_Utils::get_context_data( $context, 'order_id' ),
'promotion_id' => WC_Facebookcommerce_Utils::get_context_data( $context, 'promotion_id' ),
'incoming_params' => WC_Facebookcommerce_Utils::get_context_data( $context, 'incoming_params' ),
'extra_data' => $extra_data,
];
// Check if Action Scheduler is available
if ( function_exists( 'as_enqueue_async_action' ) ) {
as_enqueue_async_action( 'facebook_for_woocommerce_log_api', array( $request_data ) );
} else {
// Handle the absence of the Action Scheduler
Logger::log(
'Action Scheduler is not available.',
[],
array(
'should_send_log_to_meta' => false,
'should_save_log_in_woocommerce' => true,
'woocommerce_log_level' => \WC_Log_Levels::DEBUG,
)
);
}
}
}