# ExAliyunSls
## Description
Push your logs to aliyun sls(阿里云日志服务), let your logs be more convenient for statistics.
## Installation
If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `ex_aliyun_sls` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:ex_aliyun_sls, "~> 0.3.0"}
]
end
```
## You should log in this way
In elixir, you can log as below.
```elixir
Logger.debug "test1" #1
Logger.info fn -> "test2" end #2
Logger.info fn -> {"test3", [meta1: "meta1", meta2: "meta2", meta3: "meta3"]} end #3
```
In #1, the content will be pushed as `msg`. #2 is same as #1, but it may be better for performance. #3 is the way we encourage, the first element of the tuple will be set as `msg`, the second element - the list is a k-v list, the metadatas can be pushed as a independent field like `meta1`, `meta2`, `meta3`
## Configuration
### Add `YOUR` aliyun sls information into `config/config.exs`
`package_count` means the max logs to push per time, the count will be set default to 100. `package_timeout` means the max time to push logs once, if you want to clear logs by time, you can set it.
```elixir
config :ex_aliyun_sls, :backend,
endpoint: "YOUR SLS ENDPOINT",
access_key_id: "YOUR ACCESS KEY ID",
access_key: "YOUR ACCESS KEY",
project: "YOUR SLS PROJECT NAME",
logstore: "YOUR LOG STORE NAME",
package_count: 100, # Default to 100
package_timeout: 10_000 # You can choose whether to set it
```
### Config elixir logger
Add ExAliyunSls.LoggerBackend to logger backends, `:sls_log` is just the name of our backend, you can use any atom u like. You can also add other backends to logger.
```elixir
config :logger,
backends: [
{ExAliyunSls.LoggerBackend, :sls_log},
]
```
Add metadata you may want to push to sls, only the metadata in the list can be handled.
```elixir
config :logger, :sls_log,
metadata: [:pid, :module, :file, :line, :test_meta]
```
`metadata` can also be set to `:all`, so that all the metadata can be pushed. But in this way `[:pid, :module, :file, :line]` will be pushed by default.
## Change the log format in Plug
Your logs through phoenix endpoint are set default by Plug.Logger. If you want to push it to aliyunsls, you should use our plug instead.
### Replace the plug logger handler
```elixir
# This is the endpoint.ex in your phoenix project
#plug Plug.Logger
plug ExAliyunSls.Plug.Logger
```
With this config, your logs are same as
```elixir
Logger.info fn ->
{
"GET: /login, status=200, duration=0.443ms",
[
duration: "0.443ms",
status: 200,
method: "GET",
state: "set",
request_path: "/login",
params: "{your params will be formatted to json}"
]
}
end
```
Your logs for plug will turn to "GET: /login, Sent 200 in 0.443ms", and it will push the metadatas `duration, method, request_path, status, state, params` to aliyunsls.
### Filter params
If you have some params that should not be logged into logs, you can filter them by setting `filtered_params` in the config file.
```elixir
config :ex_aliyun_sls, :backend,
endpoint: "YOUR SLS ENDPOINT",
access_key_id: "YOUR ACCESS KEY ID",
access_key: "YOUR ACCESS KEY",
project: "YOUR SLS PROJECT NAME",
logstore: "YOUR LOG STORE NAME",
package_count: 100,
package_timeout: 10_000,
filtered_params: ["name", "card"] # Add your filtered params here
```
Then your params of http request will filter the `filtered_params`, they will be replaced by `******`.
## Use Embedded Page of Aliyun Sls
To check and search logs in aliyun sls dashboard, we can add an embedded page to our own website.
### Configuration
You should create a role in Aliyun Console to make an `sts` role.
```elixir
access_key_id: "YOUR SLS ACCESS KEY ID",
access_key_secret: "YOUR SLS ACCESS KEY SECRET"
```
Attention, the `access_key_id` and `access_key_secret` are not same as your sls account. It is an `Aliyun STS` account. It is used to assume to another Aliyun Role.
```elixir
config :ex_aliyun_sls, :embed_page,
access_key_id: "YOUR SLS ACCESS KEY ID",
access_key_secret: "YOUR SLS ACCESS KEY SECRET",
role_arn: "YOUR ROLE ARN",
login_page: "YOUR LOGIN PAGE URL",
destination: "YOUR DESTINATION URL"
```
### How to use it
You can use ExAliyunSls.EmbedPage.get_url/5 to get the embedded page's url.
```elixir
get_url(access_key_id, access_key_secret, role_arn, login_page, destination_page, duration_seconds \\ 3600, role_session_name \\ "default")
```
#### role_arn
`role_arn`: it is Aliyun Resource Name's role, the format is `acs:ram::$accountID:role/$roleName`, such as `acs:ram::1234567890123456:role/samplerole`
#### login_page
`login_page`: it should be the page to redirect to when the embed_page failed.
#### destination_page
`destination_page`: it should be the sls dashboard page you want to add to your page. These types are supported:
`Full log search page`: `https://sls.console.aliyun.com/next/project/<Project名称>/logsearch/<日志库名称>?hideTopbar=true&hideSidebar=true`
`Log search page`: `https://sls.console.aliyun.com/next/project/<Project名称>/logsearch/<日志库名称>?isShare=true&hideTopbar=true&hideSidebar=true`
`Dashboard page`: `https://sls.console.aliyun.com/next/project/<Project名称>/dashboard/<仪表盘名称>?isShare=true&hideTopbar=true&hideSidebar=true`
------
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/ex_aliyun_sls](https://hexdocs.pm/ex_aliyun_sls).