From 86f7a06ed08b4d59999b35991ad752e0e1e32c5f Mon Sep 17 00:00:00 2001 From: Matthew Barbour Date: Tue, 2 Jun 2020 17:56:28 -0500 Subject: [PATCH] New options for cron uploader: Logging level Including all logs in output Stop on error instead of continuing --- core/logging.php | 9 +++++++ ext/cron_uploader/config.php | 15 ++++++++---- ext/cron_uploader/main.php | 47 +++++++++++++++++++++++++++--------- ext/log_db/main.php | 10 ++++---- 4 files changed, 60 insertions(+), 21 deletions(-) diff --git a/core/logging.php b/core/logging.php index ae76d01c..7faa3cf8 100644 --- a/core/logging.php +++ b/core/logging.php @@ -10,6 +10,15 @@ define("SCORE_LOG_INFO", 20); define("SCORE_LOG_DEBUG", 10); define("SCORE_LOG_NOTSET", 0); +const LOGGING_LEVEL_NAMES = [ + SCORE_LOG_NOTSET=>"Not Set", + SCORE_LOG_DEBUG=>"Debug", + SCORE_LOG_INFO=>"Info", + SCORE_LOG_WARNING=>"Warning", + SCORE_LOG_ERROR=>"Error", + SCORE_LOG_CRITICAL=>"Critical", +]; + /** * A shorthand way to send a LogEvent * diff --git a/ext/cron_uploader/config.php b/ext/cron_uploader/config.php index 18add862..57598e57 100644 --- a/ext/cron_uploader/config.php +++ b/ext/cron_uploader/config.php @@ -3,17 +3,22 @@ abstract class CronUploaderConfig { - const DEFAULT_PATH = "cron_uploader"; + public const DEFAULT_PATH = "cron_uploader"; - const KEY = "cron_uploader_key"; - const DIR = "cron_uploader_dir"; - const USER = "cron_uploader_user"; + public const KEY = "cron_uploader_key"; + public const DIR = "cron_uploader_dir"; + public const USER = "cron_uploader_user"; + public const STOP_ON_ERROR = "cron_uploader_stop_on_error"; + public const INCLUDE_ALL_LOGS = "cron_uploader_include_all_logs"; + public const LOG_LEVEL = "cron_uploader_log_level"; public static function set_defaults(): void { global $config; $config->set_default_string(self::DIR, data_path(self::DEFAULT_PATH)); - + $config->set_default_bool(self::INCLUDE_ALL_LOGS, false); + $config->set_default_bool(self::STOP_ON_ERROR, false); + $config->set_default_int(self::LOG_LEVEL, SCORE_LOG_INFO); $upload_key = $config->get_string(self::KEY, ""); if (empty($upload_key)) { $upload_key = self::generate_key(); diff --git a/ext/cron_uploader/main.php b/ext/cron_uploader/main.php index 48395d90..b5dade95 100644 --- a/ext/cron_uploader/main.php +++ b/ext/cron_uploader/main.php @@ -15,6 +15,8 @@ class CronUploader extends Extension const UPLOADED_DIR = "uploaded"; const FAILED_DIR = "failed_to_upload"; + private static $IMPORT_RUNNING = false; + public function onInitExt(InitExtEvent $event) { // Set default values @@ -58,6 +60,15 @@ class CronUploader extends Extension $sb->add_text_option(CronUploaderConfig::DIR, "Root dir", true); $sb->add_text_option(CronUploaderConfig::KEY, "Key", true); $sb->add_choice_option(CronUploaderConfig::USER, $users, "User", true); + $sb->add_bool_option(CronUploaderConfig::STOP_ON_ERROR, "Stop On Error", true); + $sb->add_choice_option(CronUploaderConfig::LOG_LEVEL, [ + LOGGING_LEVEL_NAMES[SCORE_LOG_DEBUG] => SCORE_LOG_DEBUG, + LOGGING_LEVEL_NAMES[SCORE_LOG_INFO] => SCORE_LOG_INFO, + LOGGING_LEVEL_NAMES[SCORE_LOG_WARNING] => SCORE_LOG_WARNING, + LOGGING_LEVEL_NAMES[SCORE_LOG_ERROR] => SCORE_LOG_ERROR, + LOGGING_LEVEL_NAMES[SCORE_LOG_CRITICAL] => SCORE_LOG_CRITICAL, + ], "Output Log Level: ", true); + $sb->add_bool_option(CronUploaderConfig::INCLUDE_ALL_LOGS, "Include All Logs", true); $sb->end_table(); $sb->add_label("Read the documentation for cron setup instructions."); @@ -105,6 +116,23 @@ class CronUploader extends Extension } } + public function onLog(LogEvent $event) + { + global $config; + if (self::$IMPORT_RUNNING && + $event->priority >= $config->get_int(CronUploaderConfig::LOG_LEVEL) && + ($event->section==self::NAME || $config->get_bool(CronUploaderConfig::INCLUDE_ALL_LOGS)) + ) { + $output = "[" . date('Y-m-d H:i:s') . "] [" . LOGGING_LEVEL_NAMES[$event->priority] . "] " . $event->message ; + + echo $output . "\r\n"; + flush_output(); + + $log_path = $this->get_log_file(); + file_put_contents($log_path, $output); + } + } + private function restage_folder(string $folder) { global $page; @@ -275,7 +303,7 @@ class CronUploader extends Extension */ public function process_upload(string $key, ?int $upload_count = null): bool { - global $database, $_shm_load_start; + global $database, $config, $_shm_load_start; $max_time = intval(ini_get('max_execution_time'))*.8; @@ -301,6 +329,7 @@ class CronUploader extends Extension throw new SCoreException("Cron upload process is already running"); } + self::$IMPORT_RUNNING = true; try { //set_time_limit(0); @@ -338,9 +367,13 @@ class CronUploader extends Extension } $failed++; - $this->move_uploaded($img[0], $img[1], $output_subdir, true); $this->log_message(SCORE_LOG_ERROR, "(" . gettype($e) . ") " . $e->getMessage()); $this->log_message(SCORE_LOG_ERROR, $e->getTraceAsString()); + if ($config->get_bool(CronUploaderConfig::STOP_ON_ERROR)) { + break; + } else { + $this->move_uploaded($img[0], $img[1], $output_subdir, true); + } } } @@ -357,6 +390,7 @@ class CronUploader extends Extension return true; } finally { + self::$IMPORT_RUNNING = false; flock($lockfile, LOCK_UN); fclose($lockfile); } @@ -494,14 +528,6 @@ class CronUploader extends Extension private function log_message(int $severity, string $message): void { log_msg(self::NAME, $severity, $message); - - $time = "[" . date('Y-m-d H:i:s') . "]"; - - echo $time . " " . $message."\r\n"; - flush_output(); - - $log_path = $this->get_log_file(); - file_put_contents($log_path, $time . " " . $message); } private function get_log_file(): string @@ -517,5 +543,4 @@ class CronUploader extends Extension $page->set_type(MIME_TYPE_TEXT); $page->send_headers(); } - } diff --git a/ext/log_db/main.php b/ext/log_db/main.php index b3d16e51..300e31ac 100644 --- a/ext/log_db/main.php +++ b/ext/log_db/main.php @@ -234,11 +234,11 @@ class LogDatabase extends Extension { $sb = new SetupBlock("Logging (Database)"); $sb->add_choice_option("log_db_priority", [ - "Debug" => SCORE_LOG_DEBUG, - "Info" => SCORE_LOG_INFO, - "Warning" => SCORE_LOG_WARNING, - "Error" => SCORE_LOG_ERROR, - "Critical" => SCORE_LOG_CRITICAL, + LOGGING_LEVEL_NAMES[SCORE_LOG_DEBUG] => SCORE_LOG_DEBUG, + LOGGING_LEVEL_NAMES[SCORE_LOG_INFO] => SCORE_LOG_INFO, + LOGGING_LEVEL_NAMES[SCORE_LOG_WARNING] => SCORE_LOG_WARNING, + LOGGING_LEVEL_NAMES[SCORE_LOG_ERROR] => SCORE_LOG_ERROR, + LOGGING_LEVEL_NAMES[SCORE_LOG_CRITICAL] => SCORE_LOG_CRITICAL, ], "Debug Level: "); $event->panel->add_block($sb); }