README.md

# LoggerBackendSqlite
[![CircleCI](https://circleci.com/gh/ConnorRigby/logger_backend_sqlite.svg?style=svg)](https://circleci.com/gh/ConnorRigby/logger_backend_sqlite)
[![Hex version](https://img.shields.io/hexpm/v/logger_backend_sqlite.svg "Hex version")](https://hex.pm/packages/logger_backend_sqlite)

## What is it?
LoggerBackendSqlite will allow you to save all of your logs to an sqlite3 database.

## Why is it?
This is very helpful for [Nerves](https://nerves-project.org) devices which
don't always have network access, or console access.

## Usage is it?

Add logger backend ecto to your deps:

```elixir
def deps do
  [
    {:logger_backend_sqlite, "~> 2.0"},
  ]
end
```

Configure `:logger`:

```elixir
use Mix.Config

config :logger, [
  utc_log: true,
  handle_otp_reports: true,
  handle_sasl_reports: true,
  backends: [:console, LoggerBackendSqlite]
]

config :logger, LoggerBackendSqlite,
  database: 'debug_logs.sqlite3',
  max_logs: 9000, # defaults to 1000
```

You can also add the backend at runtime.

```elixir
iex()> {:ok, _} = Logger.add_backend(LoggerBackendSqlite)
iex()> :ok = Logger.configure_backend(LoggerBackendSqlite, database: ":memory:", max_logs: 20)
```

Seeing logs:

```elixir
iex(1)> require Logger
Logger
iex(2)> Logger.debug "hey!!"
:ok
iex(3)>
01:33:16.341 [debug] hey!!
iex(4)> LoggerBackendSqlite.all_logs
[
  %LoggerBackendSqlite.Log{
    application: nil,
    file: "iex",
    function: nil,
    group_leader_node: "nonode@nohost",
    id: 1,
    inserted_at: "2018-09-12 01:33:16.341631",
    level: "debug",
    line: 8,
    logged_at_dt: "2018-09-12 01:33:16Z",
    logged_at_ndt: "2018-09-12 01:33:16",
    message: "hey!!",
    module: nil,
    registered_name: nil,
    updated_at: "2018-09-12 01:33:16.341661"
  }
]
```

## Nerves is it?
Using this on Nerves is pretty straightforward, but there is a gotcha.
Nerves devices use a read only filesystem, so you need to ensure you store
the database on a writable filesystem. You have two options.

### /tmp
`/tmp` is read write, but will be cleared _every_ boot and has a pretty
small size constraint. This can be useful if you only want a few logs from
a specific time.

### /root
`/root` is the default location for your application data. There is another
gotcha on this one, that on first boot, this partition will not be ready yet.
A simple work can be found below:

in your config.exs
```elixir
  use Mix.Config
  config :logger, LoggerBackendSqlite, [
    database: "/tmp/logs.sqlite"
  ]
```

then in your application code somewhere:
```elixir
defmodule MyApp.FileSystemCheckup do
  @database "/root/logs.sqlite"
  @check_file "/root/check"
  require Logger

  def checkup do
    case File.write(@check_file, "any ole data") do
      :ok -> Logger.configure_backend(LoggerBackendSqlite, [database: @database])
      {:error, _} ->
        Logger.warn "Application data partition not ready yet"
        Proess.sleep(2000)
        checkup()
    end
  end
end
```

## Why 2.0 is it?
This is a hard fork of [logger_backend_ecto](https://github.com/ConnorRigby/logger_backend_ecto).
It is 1.0, and I didn't want any confusion that these are not the same thing, even
tho they share the same public API.