dmitriid

dmitriid

How to: Only enable Ecto logging on errors?

      {:ecto_sql, "~> 3.4"},
      {:phoenix, "~> 1.5.8"},
      {:phoenix_ecto, "~> 4.1"},
      {:myxql, "~> 0.4.0"},

Currently Ecto is driving me crazy in development by outputting hundreds of lines of [debug] code into the console (running iex -S mix phx.server). [1] If I put log: :error into adapter config, this only makes those same hundreds of lines to output with [error] :slight_smile: [2]

I don’t want to disable ecto logging entirely though. If there’s an error happening, I want Ecto to log the error. I don’t think the docs cover how to do it. Do I somehow configure Telemetry to achieve what I need?

Send help! :slight_smile:

[1]

[2]

Marked As Solved

RudManusachi

RudManusachi

Those logs are just printing “query”. If error happens before query executed - you’ll see the error logged. If error happens after query executed - you’ll see both [deug] QUERY... and the error. You could set log: false and only errors, are supposed to be logged anyway.

Also Liked

03juan

03juan

Just tried my own advice and this unfortunately won’t work! :sob:

Docs say that

  • :function - purges all messages with the “function/arity” Remember that if you want to purge log calls from a dependency, the dependency must be recompiled.

So I first modified my logger config to find the logging function:

config :logger, :console,
  format: "$time\n[$level] $metadata\n$message\n\n",
  metadata: [:mfa, :file, :line]

That resulted in

[debug] mfa=Ecto.Adapters.SQL.log/4 file=lib/ecto/adapters/sql.ex line=938
QUERY OK …

But the ecto_sql library at line 938 invokes Logger.log/3 which warns that

The macros debug/2, info/2, notice/2, warning/2, error/2, critical/2, alert/2, and emergency/2 are preferred over this macro as they can automatically eliminate the call to Logger altogether at compile time if desired (see the documentation for the Logger module).

I added an explicit :debug case option to the log/4 source code in my deps folder and recompiled as instructed with mix deps.compile ecto_sql but it’s still logging?

:debug ->
  IO.puts("SQL debug")
  Logger.debug(
    fn -> log_iodata(measurements, metadata) end,
    ansi_color: sql_color(query_string)
  )

config.exs

config :logger, :console,
  format: "$time\n[$level] $metadata\n$message\n\n",
  metadata: [:mfa, :file, :line],
  compile_time_purge_matching: [
    [module: Ecto.Adapters.SQL, function: "log/4", level_lower_than: :info]
  ]
iex(1)> Repo.all(User)
SQL debug
14:02:05.547
[debug] mfa=Ecto.Adapters.SQL.log/4 file=lib/ecto/adapters/sql.ex line=939 
QUERY OK source="users" ...

Hopefully someone with more experience can provide some insight :pray:

dmitriid

dmitriid

Ok, this works, at least for me, and in my particular case.

Given log: false in the config, I made a deliberate error in a query (idd instead of id):

  def get_page_data(id) do
    Quire.Repo.one(from(p in Page, where: p.idd == ^id, select: p))
  end

Ecto failed and printed the following error:

[error] #PID<0.1021.0> running QuireWeb.Endpoint (connection #PID<0.967.0>, stream id 8) terminated
Server: localhost:4000 (http)
Request: GET /admin/pages/33
** (exit) an exception was raised:
    ** (Ecto.QueryError) lib/quire/cms.ex:186: field `idd` in `where` does not exist in schema Quire.CMS.Page in query:

from p0 in Quire.CMS.Page,
  where: p0.idd == ^33,
  select: p0

No other debug logs. At this point this probably covers 99.999% of my needs.

@KristerV Give it a try. Quite possible if it wasn’t working for you it was a bug that was solved at one point.

John-Goff

John-Goff

You should set your log level in your dev.exs file. See Logger — Logger v1.12.2 and Logger — Logger v1.12.2 for more info.

03juan

03juan

Take a look at the application configuration section of the Logger docs where it describes the :compile_time_purge_matching option. Find the corresponding Ecto function that’s printing the debug log, then just silence that module + function with level_lower_than: :info

config :logger,
  compile_time_purge_matching: [
    [module: Bar, function: "foo/3", level_lower_than: :error]
  ]

This is the beauty of Elixir separation of concerns that I’m still learning and coming across these great examples: instead of trying to cater for many different logging requirements by trying to configure Ecto, reconfigure at the Logger side!

fuelen

fuelen

The first thing that comes to my mind is to disable default ecto logs and provide custom handler for [:myapp, :repo, :query] telemetry events.

Where Next?

Popular in Questions Top

shahryarjb
Hello, I get Persian date from my client and convert it to normal calendar like this: def jalali_string_to_miladi_english_number(persi...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Phillipp
Hey, I have a NanoPi-M3 and try to install Elixir on their Ubuntu image. I followed the Raspberry Pi installation instructions from the ...
New
makeitrein
Hey all, just started picking up Elixir last week and am writing a scraper as a learning project. Baby step #1 is extracting the number ...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
Exadra37
Sometimes I want to check if the input into a function is not a blank string. My first approach: defmodule Example do def do_stuff(s...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
sabri
Can someone explain the settings of pool_size of Ecto in config file? and what is the recommend size? Thanks
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
William
I would like to know that is there any online source for learning Phoenix Framework for building E-Commerce Store? Any advantage on build...
New
sergio
I couldn’t find any guides that worked well with Phoenix 1.6.0 and esbuild. I hope this helps people test the waters and eases you into t...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 49522 488
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
quazar
How to set Jason to encode all fields in ecto schema, I don’t care about security and implementing only is taking long list of attributes...
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New

We're in Beta

About us Mission Statement