[ASP.NET Core] 筆記 - Graylog

筆記 - Graylog

Graylog 是開源的紀錄集中管理系統,可以集中管理各個應用程式的執行 Log,並且帶有強大的查詢功能,不再需要時時連上Server翻找 Log,難找又有安全性問題

Garylog 使用了 Elasticsearch 以及 MongoDb,易於做橫向擴展 ; 本身不支援 Windows,官方強烈建議在 Linux 上執行(Docker 也是一個選擇)

本篇會直接使用官方教學的 docker-compose.yml,技術性趨近於0(XD


1. Docker

docker-compose.yml

  • 管理者帳號為 admin
  • 管理者密碼為 GRAYLOG_ROOT_PASSWORD_SHA2,內容是Sha256加密
  • 如果要讓其他裝置連接, GRAYLOG_HTTP_EXTERNAL_URI 需要設定為對外的 Uri
version: '2'
services:
  mongodb:
    image: mongo:3
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.5
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
  graylog:
    image: graylog/graylog:3.2
    environment:
      - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
      - GRAYLOG_ROOT_PASSWORD_SHA2=<Sha256 Password>
      - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
    links:
      - mongodb:mongo
      - elasticsearch
    depends_on:
      - mongodb
      - elasticsearch
    ports:
      - 9000:9000
      - 1514:1514
      - 1514:1514/udp
      - 12201:12201
      - 12201:12201/udp

然後在 docker-compose.yml 所在的目錄下執行 cmd

docker-compose up

如果要停止,則執行這段

docker-compose down

接著從 localhost:9000 進入(如果進不去可能是還在初始化中,可以看 up 時印出的執行紀錄是不是遇到了 exception)

2. Garylog

  • 登入後需要先設定 inputs 讓 Garylog有輸入來源,從 System => inputs
  • 接著這邊選擇 “GELF UDP”(也有不少其他的可以選擇),然後點選 “Launch new input”
  • 比較需要注意的是 Port 的部分,對應的是在 docker-compose 上設定的 Port

  • Save 後大致就完成了,其餘的設定先不管

3. ASP.NET Core

安裝 nuget 套件

dotnet add package Gelf.Extensions.Logging

在 Startup 上加入Garylog服務

  • 這邊有從 appsettings.json 取出設定,下一步會過去添加
  • AdditionalFields 可以加入自定義的資訊進去
services.AddLogging(config =>
{
    services.Configure<GelfLoggerOptions>(Configuration.GetSection("Graylog"));

    config.AddGelf(options =>
    {
        options.AdditionalFields["machine_name"] = Environment.MachineName;
        options.AdditionalFields["app_version"] = Assembly.GetEntryAssembly()
            ?.GetCustomAttribute<AssemblyInformationalVersionAttribute>()
            ?.InformationalVersion;
    });
});

appSettings.json

  "Graylog": {
    "Host": "127.0.0.1",
    "Port": 12201,
    "LogSource": "GraylogSample"
  },

接著測試一下

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        _logger.LogError("Test");
        return View();
    }
}

回到 Graylog 後,就能看到 Log順利的丟上去了

點開每個 Log 裡面也存著非常詳細的資訊,若有需要找到某一次 Request 的相關 Log,只需要點開後點選 “TraceId” 並且 “Add to Query”,這樣就只會列著該 Request 的相關 Log了


Garlog docs https://docs.graylog.org/en/3.2/pages/installation/docker.html