diff --git a/CHANGELOG.md b/CHANGELOG.md index d5a65b9b2..d8581c3c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Drop support for PostgreSQL EOL version 12 by @wolfgangwalther in #3865 - Replaced `jwt-cache-max-lifetime` config with `jwt-cache-max-entries` by @mkleczek in #4084 +- `log-query` config now takes a boolean instead of a string value by @steve-chavez in #3934 ## [13.0.7] - 2025-09-14 diff --git a/docs/references/configuration.rst b/docs/references/configuration.rst index fbdcfb9a3..c3b563f1f 100644 --- a/docs/references/configuration.rst +++ b/docs/references/configuration.rst @@ -714,23 +714,14 @@ log-query --------- =============== ================================= - **Type** String - **Default** "disabled" + **Type** Boolean + **Default** False **Reloadable** Y **Environment** PGRST_LOG_QUERY **In-Database** `n/a` =============== ================================= - Logs the SQL query for the corresponding request at the current :ref:`log-level`. - See :ref:`sql_query_logs`. - - .. code:: bash - - # Logs the main SQL query - log-query = "main-query" - - # Disables logging the SQL query - log-query = "disabled" + Logs the SQL query for the corresponding request at the current :ref:`log-level`. See :ref:`sql_query_logs`. .. _openapi-mode: diff --git a/docs/references/observability.rst b/docs/references/observability.rst index f73890b80..fbc333bdd 100644 --- a/docs/references/observability.rst +++ b/docs/references/observability.rst @@ -52,14 +52,12 @@ For diagnostic information about the server itself, PostgREST logs to ``stderr`` SQL Query Logs -------------- -To log the :ref:`main SQL query ` executed for a request, set the :ref:`log-query` to ``main-query``. -It will be logged based on the current :ref:`log-level` setting. -For example, with this configuration: +To log the SQL queries executed for a request, set the :ref:`log-query` to ``true``. It will be logged based on the current :ref:`log-level` setting. .. code-block:: bash log-level = "warn" - log-query = "main-query" + log-query = "true" The SQL queries will only be logged on ``400`` HTTP errors and up. So, if the user requests a resource without sufficient privileges: diff --git a/src/PostgREST/App.hs b/src/PostgREST/App.hs index e6d6fd037..c62a24086 100644 --- a/src/PostgREST/App.hs +++ b/src/PostgREST/App.hs @@ -44,8 +44,7 @@ import qualified PostgREST.Unix as Unix (installSignalHandlers) import PostgREST.ApiRequest (ApiRequest (..)) import PostgREST.AppState (AppState) import PostgREST.Auth.Types (AuthResult (..)) -import PostgREST.Config (AppConfig (..), LogLevel (..), - LogQuery (..)) +import PostgREST.Config (AppConfig (..), LogLevel (..)) import PostgREST.Error (Error) import PostgREST.Network (resolveSocketToAddress) import PostgREST.Observation (Observation (..)) @@ -146,7 +145,7 @@ postgrestResponse appState conf@AppConfig{..} maybeSchemaCache authResult@AuthRe let mainQ = Query.mainQuery plan conf apiReq authResult configDbPreRequest tx = MainTx.mainTx mainQ conf authResult apiReq plan sCache observer = AppState.getObserver appState - obsQuery s = when (configLogQuery /= LogQueryDisabled) $ observer $ QueryObs mainQ s + obsQuery s = when configLogQuery $ observer $ QueryObs mainQ s (txTime, txResult) <- withTiming $ do case tx of diff --git a/src/PostgREST/Config.hs b/src/PostgREST/Config.hs index 3f6ea6d3b..c316812e3 100644 --- a/src/PostgREST/Config.hs +++ b/src/PostgREST/Config.hs @@ -17,7 +17,6 @@ module PostgREST.Config , JSPathExp(..) , FilterExp(..) , LogLevel(..) - , LogQuery(..) , OpenAPIMode(..) , Proxy(..) , toText @@ -99,7 +98,7 @@ data AppConfig = AppConfig , configJwtSecretIsBase64 :: Bool , configJwtCacheMaxEntries :: Int , configLogLevel :: LogLevel - , configLogQuery :: LogQuery + , configLogQuery :: Bool , configOpenApiMode :: OpenAPIMode , configOpenApiSecurityActive :: Bool , configOpenApiServerProxyUri :: Maybe Text @@ -128,14 +127,6 @@ dumpLogLevel = \case LogInfo -> "info" LogDebug -> "debug" -data LogQuery = LogQueryMain | LogQueryDisabled - deriving (Eq) - -dumpLogQuery :: LogQuery -> Text -dumpLogQuery = \case - LogQueryMain -> "main-query" - LogQueryDisabled -> "disabled" - data OpenAPIMode = OAFollowPriv | OAIgnorePriv | OADisabled deriving Eq @@ -179,7 +170,7 @@ toText conf = ,("jwt-secret-is-base64", T.toLower . show . configJwtSecretIsBase64) ,("jwt-cache-max-entries", show . configJwtCacheMaxEntries) ,("log-level", q . dumpLogLevel . configLogLevel) - ,("log-query", q . dumpLogQuery . configLogQuery) + ,("log-query", T.toLower . show . configLogQuery) ,("openapi-mode", q . dumpOpenApiMode . configOpenApiMode) ,("openapi-security-active", T.toLower . show . configOpenApiSecurityActive) ,("openapi-server-proxy-uri", q . fromMaybe mempty . configOpenApiServerProxyUri) @@ -289,7 +280,7 @@ parser optPath env dbSettings roleSettings roleIsolationLvl = (optBool "secret-is-base64")) <*> (fromMaybe 1000 <$> optInt "jwt-cache-max-entries") <*> parseLogLevel "log-level" - <*> parseLogQuery "log-query" + <*> (fromMaybe False <$> optBool "log-query") <*> parseOpenAPIMode "openapi-mode" <*> (fromMaybe False <$> optBool "openapi-security-active") <*> parseOpenAPIServerProxyURI "openapi-server-proxy-uri" @@ -365,14 +356,6 @@ parser optPath env dbSettings roleSettings roleIsolationLvl = Just "debug" -> pure LogDebug Just _ -> fail "Invalid logging level. Check your configuration." - parseLogQuery :: C.Key -> C.Parser C.Config LogQuery - parseLogQuery k = - optString k >>= \case - Nothing -> pure LogQueryDisabled - Just "disabled" -> pure LogQueryDisabled - Just "main-query" -> pure LogQueryMain - Just _ -> fail "Invalid SQL logging value. Check your configuration." - parseTxEnd :: C.Key -> ((Bool, Bool) -> Bool) -> C.Parser C.Config Bool parseTxEnd k f = optString k >>= \case diff --git a/test/io/configs/expected/aliases.config b/test/io/configs/expected/aliases.config index f7bb9ac6e..0655e5c4b 100644 --- a/test/io/configs/expected/aliases.config +++ b/test/io/configs/expected/aliases.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = true jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/boolean-numeric.config b/test/io/configs/expected/boolean-numeric.config index a6b6bed23..53a13a7b8 100644 --- a/test/io/configs/expected/boolean-numeric.config +++ b/test/io/configs/expected/boolean-numeric.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = true jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/boolean-string.config b/test/io/configs/expected/boolean-string.config index a6b6bed23..53a13a7b8 100644 --- a/test/io/configs/expected/boolean-string.config +++ b/test/io/configs/expected/boolean-string.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = true jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/defaults.config b/test/io/configs/expected/defaults.config index 86bd6416b..87909425e 100644 --- a/test/io/configs/expected/defaults.config +++ b/test/io/configs/expected/defaults.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = false jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/jwt-role-claim-key1.config b/test/io/configs/expected/jwt-role-claim-key1.config index 2ffcc6c17..319a4932c 100644 --- a/test/io/configs/expected/jwt-role-claim-key1.config +++ b/test/io/configs/expected/jwt-role-claim-key1.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = false jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/jwt-role-claim-key2.config b/test/io/configs/expected/jwt-role-claim-key2.config index 757300445..535dc9e24 100644 --- a/test/io/configs/expected/jwt-role-claim-key2.config +++ b/test/io/configs/expected/jwt-role-claim-key2.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = false jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/jwt-role-claim-key3.config b/test/io/configs/expected/jwt-role-claim-key3.config index 7bad74166..c052f2dfc 100644 --- a/test/io/configs/expected/jwt-role-claim-key3.config +++ b/test/io/configs/expected/jwt-role-claim-key3.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = false jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/jwt-role-claim-key4.config b/test/io/configs/expected/jwt-role-claim-key4.config index 6002d1f24..a3f8e8df5 100644 --- a/test/io/configs/expected/jwt-role-claim-key4.config +++ b/test/io/configs/expected/jwt-role-claim-key4.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = false jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/jwt-role-claim-key5.config b/test/io/configs/expected/jwt-role-claim-key5.config index ae609af1e..0cfcd55da 100644 --- a/test/io/configs/expected/jwt-role-claim-key5.config +++ b/test/io/configs/expected/jwt-role-claim-key5.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = false jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/expected/no-defaults-with-db-other-authenticator.config b/test/io/configs/expected/no-defaults-with-db-other-authenticator.config index c616e398d..ebb54e0ea 100644 --- a/test/io/configs/expected/no-defaults-with-db-other-authenticator.config +++ b/test/io/configs/expected/no-defaults-with-db-other-authenticator.config @@ -25,7 +25,7 @@ jwt-secret = "ODERREALLYREALLYREALLYREALLYVERYSAFE" jwt-secret-is-base64 = false jwt-cache-max-entries = 86400 log-level = "info" -log-query = "main-query" +log-query = true openapi-mode = "disabled" openapi-security-active = false openapi-server-proxy-uri = "https://otherexample.org/api" diff --git a/test/io/configs/expected/no-defaults-with-db.config b/test/io/configs/expected/no-defaults-with-db.config index 9444b9390..9077fdbde 100644 --- a/test/io/configs/expected/no-defaults-with-db.config +++ b/test/io/configs/expected/no-defaults-with-db.config @@ -25,7 +25,7 @@ jwt-secret = "OVERRIDE=REALLY=REALLY=REALLY=REALLY=VERY=SAFE" jwt-secret-is-base64 = false jwt-cache-max-entries = 86400 log-level = "info" -log-query = "main-query" +log-query = true openapi-mode = "ignore-privileges" openapi-security-active = true openapi-server-proxy-uri = "https://example.org/api" diff --git a/test/io/configs/expected/no-defaults.config b/test/io/configs/expected/no-defaults.config index 666bf046c..2b0ab43a9 100644 --- a/test/io/configs/expected/no-defaults.config +++ b/test/io/configs/expected/no-defaults.config @@ -25,7 +25,7 @@ jwt-secret = "c2VjdXJpdHl0aHJvdWdob2JzY3VyaXR5aW5iYXNlNjQ=" jwt-secret-is-base64 = true jwt-cache-max-entries = 86400 log-level = "info" -log-query = "main-query" +log-query = true openapi-mode = "ignore-privileges" openapi-security-active = true openapi-server-proxy-uri = "https://postgrest.org" diff --git a/test/io/configs/expected/types.config b/test/io/configs/expected/types.config index b9ed5bc55..cb474bcdd 100644 --- a/test/io/configs/expected/types.config +++ b/test/io/configs/expected/types.config @@ -25,7 +25,7 @@ jwt-secret = "" jwt-secret-is-base64 = false jwt-cache-max-entries = 1000 log-level = "error" -log-query = "disabled" +log-query = false openapi-mode = "follow-privileges" openapi-security-active = false openapi-server-proxy-uri = "" diff --git a/test/io/configs/no-defaults-env.yaml b/test/io/configs/no-defaults-env.yaml index fafb4d16f..bda8e9b28 100644 --- a/test/io/configs/no-defaults-env.yaml +++ b/test/io/configs/no-defaults-env.yaml @@ -28,7 +28,7 @@ PGRST_JWT_SECRET: c2VjdXJpdHl0aHJvdWdob2JzY3VyaXR5aW5iYXNlNjQ= PGRST_JWT_SECRET_IS_BASE64: true PGRST_JWT_CACHE_MAX_ENTRIES: 86400 PGRST_LOG_LEVEL: info -PGRST_LOG_QUERY: 'main-query' +PGRST_LOG_QUERY: true PGRST_OPENAPI_MODE: 'ignore-privileges' PGRST_OPENAPI_SECURITY_ACTIVE: true PGRST_OPENAPI_SERVER_PROXY_URI: 'https://postgrest.org' diff --git a/test/io/configs/no-defaults.config b/test/io/configs/no-defaults.config index 467bc9e18..ceeb5dbdb 100644 --- a/test/io/configs/no-defaults.config +++ b/test/io/configs/no-defaults.config @@ -25,7 +25,7 @@ jwt-secret = "c2VjdXJpdHl0aHJvdWdob2JzY3VyaXR5aW5iYXNlNjQ=" jwt-secret-is-base64 = true jwt-cache-max-entries = 86400 log-level = "info" -log-query = "main-query" +log-query = true openapi-mode = "ignore-privileges" openapi-security-active = true openapi-server-proxy-uri = "https://postgrest.org" diff --git a/test/io/test_io.py b/test/io/test_io.py index 6446400df..a62c19383 100644 --- a/test/io/test_io.py +++ b/test/io/test_io.py @@ -1013,7 +1013,7 @@ def test_log_query(level, defaultenv): env = { **defaultenv, "PGRST_LOG_LEVEL": level, - "PGRST_LOG_QUERY": "main-query", + "PGRST_LOG_QUERY": "true", } with run(env=env) as postgrest: diff --git a/test/spec/SpecHelper.hs b/test/spec/SpecHelper.hs index 91e9d5a56..f22999751 100644 --- a/test/spec/SpecHelper.hs +++ b/test/spec/SpecHelper.hs @@ -33,7 +33,6 @@ import Data.String (String) import PostgREST.Config (AppConfig (..), JSPathExp (..), LogLevel (..), - LogQuery (..), OpenAPIMode (..), parseSecret) import PostgREST.SchemaCache.Identifiers (QualifiedIdentifier (..)) @@ -142,7 +141,7 @@ baseCfg = let secret = encodeUtf8 "reallyreallyreallyreallyverysafe" in , configJwtSecretIsBase64 = False , configJwtCacheMaxEntries = 10 , configLogLevel = LogCrit - , configLogQuery = LogQueryDisabled + , configLogQuery = False , configOpenApiMode = OAFollowPriv , configOpenApiSecurityActive = False , configOpenApiServerProxyUri = Nothing