Packages
log_reset
0.1.70
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Resets configured log files.
Current section
Files
Jump to
Current section
Files
lib/log/reset/log_paths.ex
defmodule Log.Reset.LogPaths do
@moduledoc """
A map of configured log paths and functions.
"""
use PersistConfig
# Must be in that order given the common 'Log' part...
alias Log.Reset
alias Log.Reset.Log
@typedoc "A map assigning configured log paths to their log levels"
@type t :: %{:logger.level() => Path.t()}
@doc """
Creates a map assigning each configured log path to its log level.
"""
@spec new :: t
def new do
import :logger, only: [get_handler_ids: 0, get_handler_config: 1]
for id <- get_handler_ids(),
id not in [:default, :ssl_handler],
into: %{} do
{:ok, %{config: %{file: path}, level: level}} = get_handler_config(id)
{level, path}
end
end
@doc """
Resets the configured log files of the given `levels`.
## Examples
iex> alias Log.Reset.LogPaths
iex> LogPaths.reset_logs(%{}, :all) # No handlers configured?
:ok
iex> alias Log.Reset.LogPaths
iex> LogPaths.reset_logs(%{}, [:info, :error]) # No handlers either?
:ok
"""
@spec reset_logs(t, Reset.levels()) :: :ok
def reset_logs(log_paths, :all) when is_map(log_paths) do
log_paths |> Map.values() |> reset_logs()
end
def reset_logs(_log_paths, :none), do: :ok
def reset_logs(log_paths, levels)
when is_map(log_paths) and is_list(levels) do
for {level, log_path} <- log_paths, level in levels do
log_path
end
|> reset_logs()
end
def reset_logs(_log_paths, _levels), do: :ok
## Private functions
@spec reset_logs([Path.t()]) :: :ok
defp reset_logs(log_paths) do
log_paths
# Truncate log files first...
|> Enum.map(&Task.async(fn -> reset_log(&1) end))
|> Enum.map(&Task.await/1)
# Log reset results second...
|> log_results()
end
@spec log_results([tuple]) :: :ok
defp log_results(results) do
for result <- results, reduce: :ok do
:ok ->
case result do
{:ok, log_path} ->
:ok = Log.debug(:log_reset, {log_path, __ENV__})
{:error, reason, log_path} ->
:ok = Log.error(:log_not_reset, {log_path, reason, __ENV__})
end
end
end
@spec reset_log(Path.t()) :: tuple
defp reset_log(log_path) do
log_path = Path.expand(log_path)
# `File.rm/1` would prevent logging results when file_check > 0.
case File.open(log_path, [:write]) do
{:ok, _pid} -> {:ok, log_path}
{:error, :enoent} -> {:ok, log_path}
{:error, reason} -> {:error, reason, log_path}
end
end
end