more logging

pull/251/head
connor rigby 2017-02-17 10:03:05 -08:00
parent c73714b52e
commit ff5c577641
10 changed files with 123 additions and 38 deletions

View File

@ -1,7 +1,7 @@
# THIS FILE WAS GENERATED BY `build_makefile.exs`
# f1a421a
# Thu Feb 16 12:42:27 2017 -0800
# fix-tests
# c73714b
# Thu Feb 16 13:42:21 2017 -0800
# fix-webpack-prepare-for-release
default: rpi3

View File

@ -8,7 +8,7 @@
# GPIO UART PORT
#-c ttyS0
# HDMI
-c tty1
-c ttyAMA0
# If more than one tty are available, always warn if the user is looking at
# the wrong one.

View File

@ -5,5 +5,31 @@ config :farmbot,
config :tzdata, :data_dir, "/tmp"
config :tzdata, :autoupdate, :disabled
config :nerves_interim_wifi, regulatory_domain: "US" #FIXME
config :quantum, cron: [ "5 1 * * *": {Farmbot.Updates.Handler, :do_update_check}]
config :nerves_interim_wifi, regulatory_domain: "US" #FIXME
config :logger,
backends: [
:console,
{ExSyslogger, :ex_syslogger_error},
{ExSyslogger, :ex_syslogger_info}
]
config :logger, :ex_syslogger_error,
level: :error,
format: "$date $time [$level] $levelpad $metadata $message\n",
metadata: [:module, :line, :function],
ident: "Farmbot",
facility: :kern,
formatter: Farmbot.SysFormatter,
option: [:pid, :cons]
config :logger, :ex_syslogger_info,
level: :info,
format: "$date $time [$level] $message\n",
ident: "Farmbot",
facility: :kern,
formatter: Farmbot.SysFormatter,
option: [:pid, :cons]

View File

@ -44,6 +44,7 @@ defmodule Farmbot do
@spec start(atom, [any]) :: {:ok, pid}
def start(_, [args]) do
Logger.debug ">> init!"
Logger.error "TEST"
Amnesia.start
Database.create! Keyword.put([], :memory, [node()])
Database.wait(15_000)

View File

@ -116,31 +116,31 @@ defmodule Farmbot.Logger do
_ -> nil
end
end)
str =
messages
|> Enum.map(fn(m) -> "#{m.created_at}: #{m.message}\n" end)
|> List.to_string
write_to_file(str)
# str =
# messages
# |> Enum.map(fn(m) -> "#{m.created_at}: #{m.message}\n" end)
# |> List.to_string
# write_to_file(str)
"/api/logs" |> HTTP.post(Poison.encode!(messages)) |> parse_resp
end
# Writes to a file in a transaction
@spec write_to_file(binary) :: no_return
defp write_to_file(str) do
Farmbot.System.FS.transaction fn() ->
path = Farmbot.System.FS.path <> "/log.txt"
case File.stat(path) do
# check the files size.
{:ok, %File.Stat{size: s}} when s > @max_file_size ->
File.write(path, "")
# if the file is there, we are fine.
{:ok, _stat} -> :ok
# if its not there create it. I dont think we HAVE to do this.
{:error, :enoent} -> File.write(path, "")
end
File.write(path, str, [:append])
end
end
# @spec write_to_file(binary) :: no_return
# defp write_to_file(str) do
# Farmbot.System.FS.transaction fn() ->
# path = Farmbot.System.FS.path <> "/log.txt"
# case File.stat(path) do
# # check the files size.
# {:ok, %File.Stat{size: s}} when s > @max_file_size ->
# File.write(path, "")
# # if the file is there, we are fine.
# {:ok, _stat} -> :ok
# # if its not there create it. I dont think we HAVE to do this.
# {:error, :enoent} -> File.write(path, "")
# end
# File.write(path, str, [:append])
# end
# end
# Parses what the api sends back. Will only ever return :ok even if there was
# an error.
@ -223,9 +223,19 @@ defmodule Farmbot.Logger do
# Couuld probably do this inline but wheres the fun in that. its a functional
# language isn't it?
# Takes Loggers time stamp and converts it into a unix timestamp.
defp parse_created_at({{year, month, day}, {hour, minute, second, _}}) do
dt = Timex.to_datetime({{year, month, day}, {hour, minute, second}})
f = DateTime.to_iso8601(dt)
defp parse_created_at({{year, month, day}, {hour, minute, second, _mil}}) do
f = %DateTime{year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second,
microsecond: {0,0},
std_offset: 0,
time_zone: "Etc/UTC",
utc_offset: 0,
zone_abbr: "UTC"}
|> DateTime.to_iso8601
{:ok, f}
end
defp parse_created_at({_,_}), do: {:ok, :os.system_time}

View File

@ -0,0 +1,37 @@
defmodule Farmbot.SysFormatter do
@moduledoc """
Formats sysmessages
"""
@doc """
Compiles a format string into an array that the `format/6` can handle.
It uses Logger.Formatter.
"""
@spec compile({atom, atom}) :: {atom, atom}
@spec compile(binary | nil) :: [Logger.Formatter.pattern | binary]
defdelegate compile(str), to: Logger.Formatter
@doc """
Formats a string
"""
@spec format({atom, atom} | [Logger.Formatter.pattern | binary],
Logger.level, Logger.message, Logger.Formatter.time,
Keyword.t, list(atom)) :: IO.chardata
def format(format, level, msg, timestamp, metadata, config_metadata) do
metadata = metadata |> Keyword.take(config_metadata)
msg_str = format
|> Logger.Formatter.format(level, msg, timestamp, metadata)
|> try_string()
end
defp try_string(stuff) do
try do
to_string(stuff)
rescue
_ -> inspect(stuff)
end
end
end

View File

@ -51,7 +51,7 @@ defmodule Farmbot.Transport.GenMqtt do
# Probably a good idea to restart mqtt here.
Logger.debug ">> needs to restart MQTT"
if Process.alive?(client) do
GenServer.stop(client, :authorization)
GenServer.stop(client, :normal)
end
{:ok, pid} = start_client(new_t)
{:noreply, [], {pid,new_t}}

View File

@ -43,7 +43,6 @@ defmodule Farmbot.Transport.GenMqtt.Client do
end
def handle_cast({:status, %Ser{} = ser}, %Token{} = token) do
# IO.puts "!!! sending state"
json = Poison.encode!(ser)
GenMQTT.publish(self(), status_topic(token), json, 0, false)
{:ok, token}
@ -56,14 +55,13 @@ defmodule Farmbot.Transport.GenMqtt.Client do
end
def handle_cast({:emit, msg}, %Token{} = token) do
# IO.puts "[!!! sending message]"
json = Poison.encode! msg
GenMQTT.publish(self(), frontend_topic(token), json, 0, false)
{:noreply, token}
end
@spec terminate(any, any) :: no_return
def terminate(:authorization, _), do: :ok
def terminate(:noamrl, _), do: :ok
def terminate(reason, _) do
Logger.error ">>`s mqtt client died. #{inspect reason}"
:ok

View File

@ -47,7 +47,7 @@ defmodule Farmbot.Mixfile do
version: @version,
commit: commit()}]},
applications: applications(),
included_applications: [:gen_mqtt, :ex_json_schema]]
included_applications: [:gen_mqtt, :ex_json_schema, :ex_syslogger]]
end
# common for test, prod, and dev
@ -77,17 +77,27 @@ defmodule Farmbot.Mixfile do
defp deps do
[
{:nerves_uart, "~> 0.1.0"}, # uart handling
{:nerves_lib, github: "nerves-project/nerves_lib"}, # this has a good uuid
{:poison, "~> 3.0"}, # json
{:httpoison, github: "edgurgel/httpoison"},
{:nerves_lib, github: "nerves-project/nerves_lib"}, # this has a good uuid
{:ex_json_schema, "~> 0.5.3"},
{:gen_mqtt, "~> 0.3.1"}, # for rpc transport
{:vmq_commons, "1.0.0", manager: :rebar3}, # This is for mqtt to work.
{:mustache, "~> 0.0.2"}, # string templating
{:timex, "~> 3.0"}, # managing time. for the scheduler mostly.
{:quantum, ">= 1.8.1"}, # cron jobs
{:amnesia, github: "meh/amnesia"}, # database implementation
{:gen_stage, "0.11.0"},
{:ex_json_schema, "~> 0.5.3"},
# Database
{:amnesia, github: "meh/amnesia"}, # database implementation
# Log to syslog
{:ex_syslogger, "~> 1.3.3", only: :prod},
# Test/Dev only
{:credo, "0.6.0-rc1", only: [:dev, :test]},
{:ex_doc, "~> 0.14", only: :dev},
{:dialyxir, "~> 0.4", only: [:dev], runtime: false},
@ -98,6 +108,7 @@ defmodule Farmbot.Mixfile do
{:cors_plug, "~> 1.1"},
{:cowboy, "~> 1.0.0"},
{:ex_webpack, "~> 0.1.1", runtime: false},
# Farmbot Stuff
{:"farmbot_system_#{@target}", in_umbrella: true},
{:farmbot_system, in_umbrella: true},

View File

@ -13,6 +13,7 @@
"elixir_make": {:hex, :elixir_make, "0.4.0", "992f38fabe705bb45821a728f20914c554b276838433349d4f2341f7a687cddf", [:mix], []},
"ex_doc": {:hex, :ex_doc, "0.14.5", "c0433c8117e948404d93ca69411dd575ec6be39b47802e81ca8d91017a0cf83c", [:mix], [{:earmark, "~> 1.0", [hex: :earmark, optional: false]}]},
"ex_json_schema": {:hex, :ex_json_schema, "0.5.3", "f2db8eb71ca7a836607d67021d1b9c24f192dd5d1ec6b6b1c89bc934fec3bf5e", [:mix], []},
"ex_syslogger": {:hex, :ex_syslogger, "1.3.3", "914be2c8d759d60d853790815e6cf853e4cea9e24922c01b488c172ba0b7e105", [:mix], [{:poison, ">= 1.5.0", [hex: :poison, optional: true]}, {:syslog, "~> 1.0.2", [hex: :syslog, optional: false]}]},
"ex_webpack": {:hex, :ex_webpack, "0.1.1", "d9deca1f9adfa1fa99ee2630f79756d741f17d4865bc808cd44577304fd053e3", [:mix], []},
"exjsx": {:hex, :exjsx, "3.2.1", "1bc5bf1e4fd249104178f0885030bcd75a4526f4d2a1e976f4b428d347614f0f", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, optional: false]}]},
"exquisite": {:hex, :exquisite, "0.1.7", "4106503e976f409246731b168cd76eb54262bd04f4facc5cba82c2f53982aaf0", [:mix], []},
@ -29,7 +30,7 @@
"mime": {:hex, :mime, "1.0.1", "05c393850524767d13a53627df71beeebb016205eb43bfbd92d14d24ec7a1b51", [:mix], []},
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], []},
"mustache": {:hex, :mustache, "0.0.2", "870fbef411c47d17df06a57b8b3f69e26eb110cba0177c34e273db5d94369d9b", [:mix], []},
"nerves": {:hex, :nerves, "0.4.7", "c8d08348e6f717cf140da26dc374bcf2f6f7c2bec646073aeab049e08b588173", [:mix], [{:distillery, "~> 1.0", [hex: :distillery, optional: false]}]},
"nerves": {:git, "https://github.com/nerves-project/nerves.git", "084e3acecdc0d838671441bd75a9f4b1250bb689", [branch: "target"]},
"nerves_firmware": {:git, "https://github.com/nerves-project/nerves_firmware.git", "b783df3867c82dc0abe6770079077a6f922c00a9", []},
"nerves_firmware_http": {:git, "https://github.com/nerves-project/nerves_firmware_http.git", "aec1a9301f965e9fdd6c76d0e435c3cc48d38425", []},
"nerves_interim_wifi": {:hex, :nerves_interim_wifi, "0.1.1", "88c65ced1440e96b954189ccfc8a55cb4575cb64a8725907c3e8a9900adb2a70", [:make, :mix], [{:elixir_make, "~> 0.3", [hex: :elixir_make, optional: false]}, {:nerves_network_interface, "~> 0.3.1", [hex: :nerves_network_interface, optional: false]}, {:nerves_wpa_supplicant, "~> 0.2.2", [hex: :nerves_wpa_supplicant, optional: false]}]},
@ -48,6 +49,7 @@
"ranch": {:hex, :ranch, "1.2.1", "a6fb992c10f2187b46ffd17ce398ddf8a54f691b81768f9ef5f461ea7e28c762", [:make], []},
"rsa": {:hex, :rsa, "0.0.1", "a63069f88ce342ffdf8448b7cdef4b39ba7dee3c1510644a39385c7e63ba246f", [:mix], []},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], []},
"syslog": {:hex, :syslog, "1.0.2", "9cf72c0986675a170c03b210e49700845a0f7b61e96d302a3ba0df82963daf60", [:rebar], []},
"timex": {:hex, :timex, "3.1.7", "71f9c32e13ff4860e86a314303757cc02b3ead5db6e977579a2935225ce9a666", [:mix], [{:combine, "~> 0.7", [hex: :combine, optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, optional: false]}]},
"tzdata": {:hex, :tzdata, "0.5.10", "087e8dfe8c0283473115ad8ca6974b898ecb55ca5c725427a142a79593391e90", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, optional: false]}]},
"vmq_commons": {:hex, :vmq_commons, "1.0.0", "5f5005c12db33f92f40e818a3617fb148972d59adcf99298c9d3808ef3582e34", [:rebar3], []}}