Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions apps/engine/lib/engine/bootstrap.ex
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ defmodule Engine.Bootstrap do
document_store_entropy,
app_configs,
manager_node,
logger_global_metadata
logger_global_metadata,
log_level \\ :debug
) do
:logger.update_primary_config(%{metadata: logger_global_metadata})

Expand All @@ -40,7 +41,7 @@ defmodule Engine.Bootstrap do
Mix.env(:test)
set_mix_build_path(project)
ExUnit.start()
start_logger(project)
start_logger(project, log_level)
maybe_change_directory(project)
:ok
end
Expand Down Expand Up @@ -73,7 +74,7 @@ defmodule Engine.Bootstrap do
end
end

defp start_logger(%Project{} = project) do
defp start_logger(%Project{} = project, log_level) do
log_file_name =
project
|> Project.workspace_path("project.log")
Expand All @@ -88,7 +89,7 @@ defmodule Engine.Bootstrap do
max_no_files: 1
},
formatter: Logger.Formatter.new(metadata: [:instance_id]),
level: :info
level: log_level
}

:logger.add_handler(handler_name, :logger_std_h, config)
Expand Down
35 changes: 34 additions & 1 deletion apps/expert/lib/expert/application.ex
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,13 @@ defmodule Expert.Application do

{opts, _argv, _invalid} =
OptionParser.parse(argv,
strict: [version: :boolean, help: :boolean, stdio: :boolean, port: :integer]
strict: [
version: :boolean,
help: :boolean,
stdio: :boolean,
port: :integer,
log_level: :string
]
)

help_text = """
Expand All @@ -63,6 +69,7 @@ defmodule Expert.Application do

--stdio Use stdio as the transport mechanism
--port <port> Use TCP as the transport mechanism, with the given port
--log-level <level> Set log level for log files (debug, info, warning, error). Default: debug
--help Show this help message
--version Show Expert version

Expand All @@ -85,19 +92,26 @@ defmodule Expert.Application do
:noop
end

log_level = parse_log_level(opts[:log_level])
Application.put_env(:expert, :log_level, log_level)

buffer_opts =
cond do
opts[:stdio] ->
:ok = Expert.Logging.ProjectLogFile.attach()
:ok = mute_default_log_handler()
Logger.info("Expert v#{Expert.vsn()} starting on stdio")
apply_log_level(log_level)
[]

is_integer(opts[:port]) ->
:ok = Expert.Logging.ProjectLogFile.attach()
:ok = mute_default_log_handler()
IO.puts("Starting on port #{opts[:port]}")

Logger.info("Expert v#{Expert.vsn()} starting on port #{opts[:port]}")

apply_log_level(log_level)
[communication: {GenLSP.Communication.TCP, [port: opts[:port]]}]

true ->
Expand Down Expand Up @@ -152,6 +166,25 @@ defmodule Expert.Application do
{Document.Store, derive: [analysis: &Forge.Ast.analyze/1]}
end

defp apply_log_level(log_level) do
Logger.info("Log level set to #{log_level}")

handler_name = Expert.Logging.ProjectLogFile.handler_name()
:logger.update_handler_config(handler_name, :level, log_level)
:logger.set_primary_config(:level, log_level)
end

defp parse_log_level(nil), do: :debug
defp parse_log_level("debug"), do: :debug
defp parse_log_level("info"), do: :info
defp parse_log_level("warning"), do: :warning
defp parse_log_level("error"), do: :error

defp parse_log_level(other) do
Logger.error("Invalid log level '#{other}'. Must be one of: debug, info, warning, error")
System.halt(2)
end

defp mute_default_log_handler do
case :logger.update_handler_config(:default, :level, :none) do
:ok -> :ok
Expand Down
3 changes: 2 additions & 1 deletion apps/expert/lib/expert/engine_node.ex
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,8 @@ defmodule Expert.EngineNode do
Node.self(),
# Copy logger global metadata to engine instances.
# Everything spawned from single expert instance will use same `instance_id`
:logger.get_primary_config().metadata
:logger.get_primary_config().metadata,
Application.get_env(:expert, :log_level, :debug)
]

with {:ok, node_pid} <- EngineSupervisor.start_project_node(project),
Expand Down
11 changes: 7 additions & 4 deletions apps/expert/lib/expert/logging/project_log_file.ex
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@ defmodule Expert.Logging.ProjectLogFile do
:expert_project_log
end

def attach(root_path \\ File.cwd!()) when is_binary(root_path) do
def attach(opts \\ []) do
root_path = Keyword.get(opts, :root_path, File.cwd!())
level = Keyword.get(opts, :level, :debug)

with :ok <- ensure_workspace(root_path) do
add_handler(log_config(root_path))
add_handler(log_config(root_path, level))
end
end

Expand All @@ -36,7 +39,7 @@ defmodule Expert.Logging.ProjectLogFile do
|> :logger.add_handler(:logger_std_h, config)
end

defp log_config(root_path) do
defp log_config(root_path, level) do
log_file_name =
root_path
|> Path.join(".expert")
Expand All @@ -50,7 +53,7 @@ defmodule Expert.Logging.ProjectLogFile do
max_no_files: @max_no_files
},
formatter: Logger.Formatter.new(metadata: [:instance_id]),
level: :debug
level: level
}
end
end
10 changes: 9 additions & 1 deletion apps/expert/test/expert/logging/project_log_file_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ defmodule Expert.Logging.ProjectLogFileTest do
log_path = Path.join([tmp_dir, ".expert", "expert.log"])
gitignore_path = Path.join([tmp_dir, ".expert", ".gitignore"])

assert :ok = ProjectLogFile.attach(tmp_dir)
assert :ok = ProjectLogFile.attach(root_path: tmp_dir)

Logger.info("project log file test")
Logger.flush()
Expand All @@ -26,4 +26,12 @@ defmodule Expert.Logging.ProjectLogFileTest do
assert File.read!(gitignore_path) == "*\n"
assert File.regular?(log_path)
end

@tag :tmp_dir
test "attach/1 applies the given log level to the handler", %{tmp_dir: tmp_dir} do
assert :ok = ProjectLogFile.attach(root_path: tmp_dir, level: :warning)

{:ok, config} = :logger.get_handler_config(ProjectLogFile.handler_name())
assert config.level == :warning
end
end
Loading