diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cc835572..e66900543 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. - Add searching sites by domain in /sites view - Add last 24h plots to /sites view - Add site pinning to /sites view +- Add support for JSON logger, via LOG_FORMAT=json environment variable ### Removed - Removed the nested custom event property breakdown UI when filtering by a goal in Goal Conversions diff --git a/config/config.exs b/config/config.exs index 616384313..1bd85b9e4 100644 --- a/config/config.exs +++ b/config/config.exs @@ -13,11 +13,6 @@ config :plausible, PlausibleWeb.Endpoint, accepts: ~w(html json) ] -# Configures Elixir's Logger -config :logger, :console, - format: "$time $metadata[$level] $message\n", - metadata: [:request_id] - # Use Jason for JSON parsing in Phoenix config :phoenix, :json_library, Jason diff --git a/config/dev.exs b/config/dev.exs index 42b5caec1..5b80c4c19 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -21,6 +21,5 @@ config :plausible, PlausibleWeb.Endpoint, ] ] -config :logger, :console, format: "[$level] $message\n" config :phoenix, :stacktrace_depth, 20 config :phoenix, :plug_init_mode, :runtime diff --git a/config/runtime.exs b/config/runtime.exs index fb79d4d30..7e92329d4 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -8,6 +8,36 @@ end config_dir = System.get_env("CONFIG_DIR", "/run/secrets") +log_format = + get_var_from_path_or_env(config_dir, "LOG_FORMAT", "standard") + +log_level = + config_dir + |> get_var_from_path_or_env("LOG_LEVEL", "warn") + |> String.to_existing_atom() + +config :logger, + level: log_level, + backends: [:console] + +config :logger, Sentry.LoggerBackend, + capture_log_messages: true, + level: :error + +case String.downcase(log_format) do + "standard" -> + config :logger, :console, + format: "$time $metadata[$level] $message\n", + metadata: [:request_id] + + "json" -> + config :logger, :console, + format: {ExJsonLogger, :format}, + metadata: [ + :request_id + ] +end + # Listen IP supports IPv4 and IPv6 addresses. listen_ip = ( @@ -167,7 +197,6 @@ maxmind_edition = get_var_from_path_or_env(config_dir, "MAXMIND_EDITION", "GeoLi maxmind_cache_dir = get_var_from_path_or_env(config_dir, "PERSISTENT_CACHE_DIR") if System.get_env("DISABLE_AUTH") do - require Logger Logger.warning("DISABLE_AUTH env var is no longer supported") end @@ -196,11 +225,6 @@ end hcaptcha_sitekey = get_var_from_path_or_env(config_dir, "HCAPTCHA_SITEKEY") hcaptcha_secret = get_var_from_path_or_env(config_dir, "HCAPTCHA_SECRET") -log_level = - config_dir - |> get_var_from_path_or_env("LOG_LEVEL", "warn") - |> String.to_existing_atom() - custom_script_name = config_dir |> get_var_from_path_or_env("CUSTOM_SCRIPT_NAME", "script") @@ -293,10 +317,6 @@ config :sentry, filter: Plausible.SentryFilter, before_send_event: {Plausible.SentryFilter, :before_send} -config :logger, Sentry.LoggerBackend, - capture_log_messages: true, - level: :error - config :plausible, :paddle, vendor_auth_code: paddle_auth_code, vendor_id: paddle_vendor_id @@ -328,7 +348,6 @@ ch_transport_opts = end config :plausible, Plausible.ClickhouseRepo, - loggers: [Ecto.LogEntry], queue_target: 500, queue_interval: 2000, url: ch_db_url, @@ -338,7 +357,6 @@ config :plausible, Plausible.ClickhouseRepo, ] config :plausible, Plausible.IngestRepo, - loggers: [Ecto.LogEntry], queue_target: 500, queue_interval: 2000, url: ch_db_url, @@ -348,7 +366,6 @@ config :plausible, Plausible.IngestRepo, pool_size: ingest_pool_size config :plausible, Plausible.AsyncInsertRepo, - loggers: [Ecto.LogEntry], queue_target: 500, queue_interval: 2000, url: ch_db_url, @@ -360,7 +377,6 @@ config :plausible, Plausible.AsyncInsertRepo, ] config :plausible, Plausible.ImportDeletionRepo, - loggers: [Ecto.LogEntry], queue_target: 500, queue_interval: 2000, url: ch_db_url, @@ -593,10 +609,6 @@ if geonames_source_file do config :location, :geonames_source_file, geonames_source_file end -config :logger, - level: log_level, - backends: [:console] - if honeycomb_api_key && honeycomb_dataset do config :opentelemetry, resource: Plausible.OpenTelemetry.resource_attributes(runtime_metadata), diff --git a/mix.exs b/mix.exs index 6d57471f5..dfdc36c87 100644 --- a/mix.exs +++ b/mix.exs @@ -126,7 +126,8 @@ defmodule Plausible.MixProject do {:paginator, git: "https://github.com/duffelhq/paginator.git"}, {:scrivener_ecto, "~> 2.0"}, {:esbuild, "~> 0.7", runtime: Mix.env() == :dev}, - {:tailwind, "~> 0.2.0", runtime: Mix.env() == :dev} + {:tailwind, "~> 0.2.0", runtime: Mix.env() == :dev}, + {:ex_json_logger, "~> 1.3.0"} ] end diff --git a/mix.lock b/mix.lock index 91bddcdd4..d5090d0f2 100644 --- a/mix.lock +++ b/mix.lock @@ -42,6 +42,7 @@ "ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.15.0", "aadd34e91cfac7ef6b03fe8f47f8c6fa8c5daf3f89b5d9fee64ec545ded839cf", [:mix], [{:ex_cldr, "~> 2.34", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "0521316396c66877a2d636219767560bb2397c583341fcb154ecf9f3000e6ff8"}, "ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.31.3", "6ec8b18c395c0e8788d46da806f8f2abcbe4b0d809226d2a91363e9ccd85f2f5", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:digital_token, "~> 0.3 or ~> 1.0", [hex: :digital_token, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.37", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, ">= 2.14.2", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "b519de08ecc4a6402038f3aa75e8654f78ebd6fa714b7e585531504e648588fd"}, "ex_doc": {:hex, :ex_doc, "0.30.3", "bfca4d340e3b95f2eb26e72e4890da83e2b3a5c5b0e52607333bf5017284b063", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "fbc8702046c1d25edf79de376297e608ac78cdc3a29f075484773ad1718918b6"}, + "ex_json_logger": {:hex, :ex_json_logger, "1.3.0", "d1027c7086ce3a0b2234fe321707c09058cd511923f81875d6cdd9dd8b13741b", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "75b58ac2b82babcbb604a4a23a5880f1b835aa410a33f7940179a98aee386294"}, "ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"}, "ex_money": {:hex, :ex_money, "5.15.0", "677dcd8466fcc8b91ac134a6414587dbed5420391f6dc3d42f71b049a3414d39", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.31", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:gringotts, "~> 1.1", [hex: :gringotts, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.0 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "802728b06e004b42db784d84cd1417b2aaf9ba116051149edc08fe184c838f06"}, "exactor": {:hex, :exactor, "2.2.4", "5efb4ddeb2c48d9a1d7c9b465a6fffdd82300eb9618ece5d34c3334d5d7245b1", [:mix], [], "hexpm", "1222419f706e01bfa1095aec9acf6421367dcfab798a6f67c54cf784733cd6b5"}, @@ -134,7 +135,6 @@ "sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "tailwind": {:hex, :tailwind, "0.2.1", "83d8eadbe71a8e8f67861fe7f8d51658ecfb258387123afe4d9dc194eddc36b0", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "e8a13f6107c95f73e58ed1b4221744e1eb5a093cd1da244432067e19c8c9a277"}, - "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"}, "telemetry_metrics_prometheus_core": {:hex, :telemetry_metrics_prometheus_core, "1.1.0", "4e15f6d7dbedb3a4e3aed2262b7e1407f166fcb9c30ca3f96635dfbbef99965c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "0dd10e7fe8070095df063798f82709b0a1224c31b8baf6278b423898d591a069"},