Назад | Перейти на главную страницу

Как настроить ведение журнала GELF в Docker для Windows

Я запускаю Windows 10 Pro 1909 (18363.657) и хотел бы передать стандартный вывод контейнеров на локально установленный монитор журнала, принимающий GELF через UDP (в моем случае это seq). Я протестировал свою локальную установку seq, отправив вручную созданное сообщение udp в формате GELF с помощью powershell:

function Send-UdpDatagram
{
  Param ([string] $EndPoint, 
  [int] $Port, 
  [string] $Message)

  if (!$Message) {
       $Message = '{"version": "1.1","host":"test.net","short_message":"A short message that helps you identify what is going on","full_message":"Backtrace here\n\nmore stuff","level":1,"_user_id":9001,"_some_info":"foo","_some_env_var":"bar"}' 
  }


  $IP = [System.Net.Dns]::GetHostAddresses($EndPoint) 
  $Address = [System.Net.IPAddress]::Parse($IP) 
  $EndPoints = New-Object System.Net.IPEndPoint($Address, $Port) 
  $Socket = New-Object System.Net.Sockets.UDPClient 
  $EncodedText = [Text.Encoding]::ASCII.GetBytes($Message) 
  $SendMessage = $Socket.Send($EncodedText, $EncodedText.Length, $EndPoints) 
  Write-Output "Send Message:" $SendMessage
  $Socket.Close() 
} 

Вызов этой функции с помощью Send-UdpDatagram --EndPoint 127.0.0.1 --Port 12201 работает, т.е. сообщение приходит в seq.

Затем я обновил конфигурацию Docker для Windows следующим образом:

{
 "registry-mirrors": [],
 "insecure-registries": [],
 "debug": true,
 "experimental": true,
 "log-driver": "gelf",
 "log-opts": {
   "gelf-address": "udp://127.0.0.1:12201"
 }
}

После перезапуска выводится информация докера:

    Client:
    Debug Mode: false

    Server:
    Containers: 23
    Running: 3
    Paused: 0
    Stopped: 20
    Images: 125
    Server Version: 19.03.5
    Storage Driver: overlay2
    Backing Filesystem: extfs
    Supports d_type: true
    Native Overlay Diff: true
    Logging Driver: gelf
    Cgroup Driver: cgroupfs
    Plugins:
    Volume: local
    Network: bridge host ipvlan macvlan null overlay
    Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
    Swarm: inactive
    Runtimes: runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
    runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
    init version: fec3683
    Security Options:
    seccomp
    Profile: default
    Kernel Version: 4.19.76-linuxkit
    Operating System: Docker Desktop
    OSType: linux
    Architecture: x86_64
    CPUs: 6
    Total Memory: 3.846GiB
    Name: docker-desktop
    ID: PJYX:ZQ7D:4Y3O:3LZR:YCXL:KHUG:WEOT:R2AA:RDPH:TYRL:KWEU:NWXG
    Docker Root Dir: /var/lib/docker
    Debug Mode: true
    File Descriptors: 56
    Goroutines: 65
    System Time: 2020-03-02T22:37:13.800351765Z
    EventsListeners: 4
    Registry: https://index.docker.io/v1/
    Labels:
    Experimental: true
    Insecure Registries:
    127.0.0.0/8
    Live Restore Enabled: false
    Product License: Community Engine

Итак, кажется, все настроено так, как должно, но я все еще не получаю сообщения GELF в seq через udp из любого запускаемого контейнера. Я тестировал следующее:

docker container run -p 8080:80 -d nginx

Посещение http: // локальный: 8080 / Я получаю приветствия от nginx, но в seq нет сообщений журнала. Я знаю, что должен, потому что если я

docker container run -p 8080:80 -it nginx

Я вижу журналы запросов от nginx в выводе консоли.

Я предполагаю, что GELF поддерживается в Docker для Windows, но я не могу понять, как дальше устранять неполадки с потоком UDP. К сожалению, Docker не поддерживает TCP, afaik.