ProductPromotion
Logo

Elixir

made by https://0x3d.site

GitHub - mneudert/plug_accesslog: Plug for writing access logs
Plug for writing access logs. Contribute to mneudert/plug_accesslog development by creating an account on GitHub.
Visit Site

GitHub - mneudert/plug_accesslog: Plug for writing access logs

GitHub - mneudert/plug_accesslog: Plug for writing access logs

Plug.AccessLog

Plug for writing access logs.

Setup

To use the plug in your projects, edit your mix.exs file and add the project as a dependency:

defp deps do
  [
    # ...
    {:plug_accesslog, "~> 0.15.0"},
    # ...
  ]
end

Usage

Add the plug to your plug pipeline/router:

defmodule AppRouter do
  use Plug.Router

  plug Plug.AccessLog,
    format: :clf,
    file: "/path/to/your/logs/access.log"

  plug :match
  plug :dispatch

  get "/hello" do
    send_resp(conn, 200, "world")
  end

  match _ do
    send_resp(conn, 404, "oops")
  end
end

Note: The usage examples apply to a usecase where your are using plug directly without any framework. Using the plug Plug.AccessLog line in a framework based on plug should be no problem. Please refer to your frameworks individual documentation or source to find a suitable place.

WAL Configuration

All log messages that will be written to a file are collected in a WAL process before actual writing. The messages will be fetched in a configurable interval to be written to the logfiles:

config :plug_accesslog,
  :wal,
    flush_interval: 100

The time is configured as "milliseconds between writing and flushing". The default value is 100 milliseconds.

Custom Formatters

If you want to extend the formatting capabilities or replace existing ones you can define a custom formatter pipeline to use:

defmodule CustomFormatter do
  @behaviour Plug.AccessLog.Formatter

  def format(format, conn) do
    # manipulate to your liking
    format
  end
end

defmodule Router do
  use Plug.Router

  plug Plug.AccessLog,
    format: :clf,
    formatters: [CustomFormatter, Plug.AccessLog.DefaultFormatter],
    file: "/path/to/your/logs/access.log"
end

If you do not configure a list of formatters only the DefaultFormatter will be used. If you define an empty list then no formatting will take place.

All formatters are called in the order they are defined in.

File Configuration

There are two ways to define the file you want log entries to be written to:

defmodule Router do
  use Plug.Router

  plug Plug.AccessLog, file: "/static/configuration.log"
  plug Plug.AccessLog, file: {:system, "SYS_ENV_VAR_WITH_FILE_PATH"}
  plug Plug.AccessLog, file: {:system, "SYS_ENV_VAR", "/path/to/default.log"}
end

Do Not Log Filter

To filter the requests before logging you can configure a "do not log" filter function:

defmodule LogFilter do
  def dontlog?(%{request_path: "/favicon.ico"}), do: true
  def dontlog?(_conn), do: false
end

defmodule Router do
  use Plug.Router

  plug Plug.AccessLog,
    dontlog: &LogFilter.dontlog?/1,
    format: :clf,
    file: "/path/to/your/logs/access.log"
end

If the function you pass to the plug returns true the request will not be logged.

Logging Functions

To have the parsed log message sent to a logging function instead of writing it to a file you can configure a logging function:

defmodule InfoLogger do
  def log(msg), do: Logger.log(:info, msg)
end

defmodule Router do
  use Plug.Router

  plug Plug.AccessLog,
    format: :clf,
    fun: &InfoLogger.log/1
end

If a logging function is configured the configured file (if any) will be ignored.

Log Format

The default format is CLF.

Available formats

Besides a self defined format you can use one of the predefined aliases:

:agent
> %{User-Agent}i
> curl/7.35.0

:clf
> %h %l %u %t "%r" %>s %b
> 127.0.0.1 - - [10/Jan/2015:14:46:18 +0100] "GET / HTTP/1.1" 200 31337

:clf_vhost
> %v %h %l %u %t "%r" %>s %b
> www.example.com 127.0.0.1 - - [10/Jan/2015:14:46:18 +0100] "GET / HTTP/1.1" 200 31337

:combined
> %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"
> 127.0.0.1 - - [22/Jan/2015:19:33:58 +0100] "GET / HTTP/1.1" 200 2 "http://www.example.com/previous_page" "curl/7.35.0"

:combined_vhost
> %v %h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"
> www.example.com 127.0.0.1 - - [22/Jan/2015:19:33:58 +0100] "GET / HTTP/1.1" 200 2 "http://www.example.com/previous_page" "curl/7.35.0"

:referer
> %{Referer}i -> %U
> http://www.example.com/previous_page -> /

For more details about each formatting token and potential modifications please refer to the Plug.AccessLog.DefaultFormatter module.

Benchmarking

A small utility script is provided to check how long it might take to process requests and write the log messages to your disk:

mix run utils/bench.exs

This call will send of a total of 10k requests and wait for them to be written to the disk.

Looking at the data written to utils/bench.log might give a hint at what overhead the log writing is introducing. As with all "benchmarks" of any kind: take the measurements with a pinch of salt and run them in dozens of different conditions yourself.

License

Apache License, Version 2.0

Articles
to learn more about the elixir concepts.

Resources
which are currently available to browse on.

mail [email protected] to add your project or resources here 🔥.

FAQ's
to know more about the topic.

mail [email protected] to add your project or resources here 🔥.

Queries
or most google FAQ's about Elixir.

mail [email protected] to add more queries here 🔍.

More Sites
to check out once you're finished browsing here.

0x3d
https://www.0x3d.site/
0x3d is designed for aggregating information.
NodeJS
https://nodejs.0x3d.site/
NodeJS Online Directory
Cross Platform
https://cross-platform.0x3d.site/
Cross Platform Online Directory
Open Source
https://open-source.0x3d.site/
Open Source Online Directory
Analytics
https://analytics.0x3d.site/
Analytics Online Directory
JavaScript
https://javascript.0x3d.site/
JavaScript Online Directory
GoLang
https://golang.0x3d.site/
GoLang Online Directory
Python
https://python.0x3d.site/
Python Online Directory
Swift
https://swift.0x3d.site/
Swift Online Directory
Rust
https://rust.0x3d.site/
Rust Online Directory
Scala
https://scala.0x3d.site/
Scala Online Directory
Ruby
https://ruby.0x3d.site/
Ruby Online Directory
Clojure
https://clojure.0x3d.site/
Clojure Online Directory
Elixir
https://elixir.0x3d.site/
Elixir Online Directory
Elm
https://elm.0x3d.site/
Elm Online Directory
Lua
https://lua.0x3d.site/
Lua Online Directory
C Programming
https://c-programming.0x3d.site/
C Programming Online Directory
C++ Programming
https://cpp-programming.0x3d.site/
C++ Programming Online Directory
R Programming
https://r-programming.0x3d.site/
R Programming Online Directory
Perl
https://perl.0x3d.site/
Perl Online Directory
Java
https://java.0x3d.site/
Java Online Directory
Kotlin
https://kotlin.0x3d.site/
Kotlin Online Directory
PHP
https://php.0x3d.site/
PHP Online Directory
React JS
https://react.0x3d.site/
React JS Online Directory
Angular
https://angular.0x3d.site/
Angular JS Online Directory