# RamoopsLogger

[![Hex version]( "Hex version")](

An Elixir Logger backend for
[ramoops]( linux
kernel panic logger. This backend is useful to log oopses and panics into persistent
RAM so the logs can survive after a restart. This will enabled debugging of issues
after rebooting or rolling back the firmware.

## Configuration

RamoopsLogger uses the Linux `pstore` device driver, so it only works on
Linux-based platforms. The official Nerves Projects systems start the `pstore`
driver automatically and you can skip the Linux configuration.

### Linux configuration

The most important part of using the RamoopsLogger is ensuring that the `pstore`
device driver is enabled and configured in your Linux kernel. The device driver
writes logs to a fixed location in DRAM that is platform-specific. If you are
lucky, someone will have determined a good place to store the logs. The official
Nerves Project systems all have a small amount of memory allocated for use by
the `pstore` driver. If you are not using Nerves, it's possible that one of the
device tree files (for ARM platforms) may be helpful.

One way of testing whether the `pstore` driver is available is to check whether
the `/dev/pmsg0` file exists.

### Update your Elixir project

Once you're satisfied with the Linux, add `ramoops_logger` to your project's
`mix.exs` dependencies list.

def deps do
    {:ramoops_logger, "~> 0.3.0"}

Next, update your `config.exs` to tell the Elixir Logger to send log messages to
the `RamoopsLogger`:

use Mix.Config

# Add the RamoopsLogger backend. If you already have a logger configuration, to add
# RamoopsLogger the only change needed is to add RamoopsLogger to the :backends list.
config :logger, backends: [RamoopsLogger, :console]

## IEx Session Usage

To read the last ramoops log to the console run:

iex> RamoopsLogger.dump()

To read the last ramoops log and it to a variable run:

iex> {:ok, contents} =

## Nerves Automatic Log Check

If you want to have your system check if there is an oops log available, and you
are using Nerves, you can add this to your `rootfs_overlay/etc/iex.exs` file in
your firmware project:

if RamoopsLogger.available_log?() do
  IO.puts("Oops! There's something in the oops log. Check with RamoopsLogger.dump()")