Logging: Add filter to modify the list of expired logs to be deleted (#44380)

* Logging: Add filter to modify the list of expired logs to be deleted

This provides a way for extensions to ensure that some log files are
retained for a different time period than the normal
retention period setting.

* phpcs cleanup

* Add changelog file

* Add note to settings view when hook has filter on it

Also remove the note about retention days from the log entry that's
generated when expired log files are deleted
This commit is contained in:
Corey McKrill 2024-02-13 12:42:38 -08:00 committed by GitHub
parent a619aba5ee
commit b2d9d6f118
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 28 deletions

View File

@ -0,0 +1,4 @@
Significance: minor
Type: add
Add a filter to allow preventing an expired log file from being deleted

View File

@ -237,7 +237,29 @@ class LogHandlerFileV2 extends WC_Log_Handler {
)
);
if ( is_wp_error( $files ) || count( $files ) < 1 ) {
if ( is_wp_error( $files ) ) {
return 0;
}
$files = array_filter(
$files,
function( $file ) use ( $timestamp ) {
/**
* Allows preventing an expired log file from being deleted.
*
* @param bool $delete True to delete the file.
* @param File $file The log file object.
* @param int $timestamp The expiration threshold.
*
* @since 8.7.0
*/
$delete = apply_filters( 'woocommerce_logger_delete_expired_file', true, $file, $timestamp );
return boolval( $delete );
}
);
if ( count( $files ) < 1 ) {
return 0;
}
@ -253,8 +275,6 @@ class LogHandlerFileV2 extends WC_Log_Handler {
$this->handle(
time(),
'info',
sprintf(
'%s %s',
sprintf(
esc_html(
// translators: %s is a number of log files.
@ -267,19 +287,6 @@ class LogHandlerFileV2 extends WC_Log_Handler {
),
number_format_i18n( $deleted )
),
sprintf(
esc_html(
// translators: %s is a number of days.
_n(
'The retention period for log files is %s day.',
'The retention period for log files is %s days.',
$retention_days,
'woocommerce'
)
),
number_format_i18n( $retention_days )
)
),
array(
'source' => 'wc_logger',
)

View File

@ -154,18 +154,28 @@ class Settings {
'step' => 1,
);
$desc = array();
$hardcoded = has_filter( 'woocommerce_logger_days_to_retain_logs' );
$desc = '';
if ( $hardcoded ) {
$custom_attributes['disabled'] = 'true';
$desc = sprintf(
$desc[] = sprintf(
// translators: %s is the name of a filter hook.
__( 'This setting cannot be changed here because it is being set by a filter on the %s hook.', 'woocommerce' ),
'<code>woocommerce_logger_days_to_retain_logs</code>'
);
}
$file_delete_has_filter = LogHandlerFileV2::class === $this->get_default_handler() && has_filter( 'woocommerce_logger_delete_expired_file' );
if ( $file_delete_has_filter ) {
$desc[] = sprintf(
// translators: %s is the name of a filter hook.
__( 'The %s hook has a filter set, so some log files may have different retention settings.', 'woocommerce' ),
'<code>woocommerce_logger_delete_expired_file</code>'
);
}
return array(
'title' => __( 'Retention period', 'woocommerce' ),
'desc_tip' => __( 'This sets how many days log entries will be kept before being auto-deleted.', 'woocommerce' ),
@ -181,7 +191,7 @@ class Settings {
' %s',
__( 'days', 'woocommerce' ),
),
'desc' => $desc,
'desc' => implode( '<br><br>', $desc ),
);
}