From 16d4d5b54859fc813bbcf5e6f54787c5fb915549 Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Mon, 16 Mar 2020 16:25:44 -0400 Subject: [PATCH] Log failed queries --- spec/spec_helper.cr | 8 ++++++++ src/avram.cr | 1 + src/avram/pool_statement_logging.cr | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/spec/spec_helper.cr b/spec/spec_helper.cr index af3d27145..66d8b88f2 100644 --- a/spec/spec_helper.cr +++ b/spec/spec_helper.cr @@ -13,6 +13,14 @@ Spec.before_each do TestDatabase.truncate end +# Keep log level high so we can only show failed logs in test +logger = Dexter::Logger.new(STDERR, level: Logger::Severity::FATAL) + +Avram.configure do |settings| + settings.logger = logger + settings.failed_query_log_level = Logger::Severity::FATAL +end + class SampleBackupDatabase < Avram::Database end diff --git a/src/avram.cr b/src/avram.cr index 451caba96..aad73a9a9 100644 --- a/src/avram.cr +++ b/src/avram.cr @@ -21,6 +21,7 @@ module Avram setting logger : Dexter::Logger = Dexter::Logger.new(nil) setting query_log_level : ::Logger::Severity? setting save_failed_log_level : ::Logger::Severity? = ::Logger::Severity::WARN + setting query_failed_log_level : ::Logger::Severity? = ::Logger::Severity::ERROR setting database_to_migrate : Avram::Database.class, example: "AppDatabase" setting time_formats : Array(String) = [] of String end diff --git a/src/avram/pool_statement_logging.cr b/src/avram/pool_statement_logging.cr index 95696aff0..34b9e4a68 100644 --- a/src/avram/pool_statement_logging.cr +++ b/src/avram/pool_statement_logging.cr @@ -3,26 +3,41 @@ module DB def exec : ExecResult log_query statement_with_retry &.exec + rescue e : PQ::PQError + log_error + raise e end def exec(*args_, args : Array? = nil) : ExecResult log_query(*args_, args: args) statement_with_retry &.exec(*args_, args: args) + rescue e : PQ::PQError + log_error(*args_, args: args) + raise e end def query : ResultSet log_query statement_with_retry &.query + rescue e : PQ::PQError + log_error + raise e end def query(*args_, args : Array? = nil) : ResultSet log_query(*args_, args: args) statement_with_retry &.query(*args_, args: args) + rescue e : PQ::PQError + log_error(*args_, args: args) + raise e end def scalar(*args_, args : Array? = nil) log_query(*args_, args: args) statement_with_retry &.scalar(*args_, args: args) + rescue e : PQ::PQError + log_error(*args_, args: args) + raise e end private def log_query(*args_, args : Array? = nil) @@ -32,5 +47,13 @@ module DB Avram.logger.log(level, {query: @query, args: logging_args}) end end + + private def log_error(*args_, args : Array? = nil) + Avram.settings.query_failed_log_level.try do |level| + logging_args = EnumerableConcat.build(args_, args) + logging_args = logging_args.to_a if logging_args.is_a?(EnumerableConcat) + Avram.logger.log(level, {failed_query: @query, args: logging_args}) + end + end end end