Logstash-форвардер как служба Windows

Я изо всех сил пытаюсь создать службу Windows для пересылки logstash на сервере Windows 2008 R2.

Моя установка выглядит следующим образом:

Сервер Ubuntu 14.04 LTS

  • Эластичный поиск
  • Логсташ
  • Кибана

Windows Server 2008 R2:

  • Регистрация приложения по определенному пути.
  • Отправка журналов в стек ELK через Logstash-forwarder

В настоящее время я успешно отправляю журналы в ELK-Stack через программу пересылки Logstash, скомпилированную для Windows, с помощью приведенных здесь инструкций... https://github.com/elastic/logstash-forwarder. Единственная проблема в том, что мне нужно запустить пересылку logstash в окне CLI, и я не могу настроить ее как службу Windows.

Я пробовал следующую команду SC, служба создается, но служба вообще не запускается. Просто возвращаю следующую ошибку: Служба своевременно не ответила на запрос запуска или управления.

sc create LogstashForwarder binpath= "\"C:\_Logstash\logstash-forwarder.exe\" -config=\"C:\_Logstash\logstash-forwarder.conf\"" start= Auto displayname= "Logstash forwarder" 

К сожалению, Google тоже не знает ответа.

Кто-нибудь смог запустить пересылку logstash в Windows как службу Windows с помощью команды SC? Некоторые хорошие советы будут очень признательны.


person Darkglow    schedule 13.04.2015    source источник


Ответы (3)


Если ваша конфигурация logstash верна, попробуйте выполнить следующие действия.

  1. Получите программное обеспечение nssm
  2. Распакуйте nssm zip в папку bin logstash.
  3. Выполнить из командной строки nssm install logstash

  4. Добавьте путь к вашей летучей мыши на запущенном экране конфигурации

  5. Добавьте также свой каталог запуска.

Здесь вы можете получить дополнительную помощь

https://blog.basefarm.com/blog/how-to-install-logstash-on-windows-server-2012-with-kibana-in-iis/

https://github.com/verbosemode/public-notes/blob/master/logstash-windows.md

Надеюсь, это поможет

person Rys    schedule 13.04.2015
comment
Работает как шарм! Благодарю вас! - person Darkglow; 24.04.2015

Чтобы добавить к ответу Рыса, Logstash-Forwarder изначально не читает журнал событий Windows. Пытаясь обойти это, я наткнулся на эту суть от Sean-M.

Я изменил его исходный сценарий так, чтобы сценарий Powershell запускал LSF, а затем перенаправлял журнал событий в стандартный ввод. Затем я указываю NSSM на сценарий и запускаю его как службу. Если у вас настроен файл конфигурации следующим образом:

        {
          "network": {
            "servers": [ "<logstash IP>:5000" ],
            "timeout": 15,
            "ssl ca": "C:/path/to/logstash-forwarder.crt"
          },
          "files": [
                {
                  "paths": [
                     "C:/inetpub/logs/LogFiles/W3SVC*/*.log"
                   ],
                   "fields": { "type": "iis-w3svc" }
                },
                {
                  "paths": [
                    "-"
                  ],
                  "fields": { "type": "windows-event" }
                }
          ]
        }

LSF захватит ввод JSON и отправит его в Logstash. Код Powershell ниже**:

#Requires -Version 3
param (
    [string]$lognames
)

#reading security log requires elevated privileges so only read Application and System for now
[string[]]$logname = $("Application", "System" )

if ($lognames)
{
    [string[]]$logname = $lognames -split ", "
}


##################################
#            Functions           #
##################################

function EvenSpace{
    param ($word) 

    $tabWidth = 48

    $wordTabs = $tabWidth - $word.Length
    $tabNum = [Math]::Floor($($wordTabs/4)) / 2

    ("`t" * $tabNum)
}


## Read events, write to file
function ReadEvents {
    param ([hashtable]$filter, [string]$OutFile=[String]::Empty)

    ## Make it look pretty if writting to stdout    
    try {
        [object[]]$data = Get-WinEvent -FilterHashtable $filter -ErrorAction SilentlyContinue | sort RecordId

        [int]$count = 0
        if ((-not $data -eq $null) -or ($data.Count -gt 0)) {            
            $count = $data.Count
        }


        Write-Verbose ("Log: $($filter["LogName"])" + (EvenSpace -word $filter["LogName"]) + "Count: $count")
    }
    catch {
        $Error[0]
        Write-Verbose ""
        Write-Verbose "Filter:"
        $filter
        return
    }


    if ($data.Count -gt 0) {

        foreach ($event in $data) {
            $json = $event | ConvertTo-Json -Compress
            #$jsonbytes = @($json)
            #$process.StandardInput.BaseStream.Write($jsonbytes,0,$jsonbytes.Count)

            Write-Verbose $json

            $process.StandardInput.WriteLine($json)
        }
    }
}

## Use a try/catch/finally to allow for the inputs to be closed and the process stopped
[System.Diagnostics.Process]$process = $null
$endTime = Get-Date

try
{
    ## Prepare to invoke the process
    $processStartInfo = New-Object System.Diagnostics.ProcessStartInfo
    $processStartInfo.FileName = (Get-Command .\logstash-forwarder.exe).Definition
    $processStartInfo.WorkingDirectory = (Get-Location).Path
    $processStartInfo.Arguments = "-config logstash-forwarder.conf"
    $processStartInfo.UseShellExecute = $false

    ## Always redirect the input and output of the process.
    ## Sometimes we will capture it as binary, other times we will
    ## just treat it as strings.
    $processStartInfo.RedirectStandardOutput = $true
    $processStartInfo.RedirectStandardInput = $true

    $process = [System.Diagnostics.Process]::Start($processStartInfo)

    ##################################
    #           Main Logic           #
    ##################################

    ## Loop to capture events
    while ($true) {
        [String]::Empty | Write-Verbose

        Start-Sleep -Seconds 5

        $startTime = $endTime

        [TimeSpan]$diff = (Get-Date) - $startTime
        if ($diff.TotalHours -gt 1) {
            $endTime = $startTime + (New-TimeSpan -Minutes 30)
        }
        else {
            $endTime = Get-Date
        }

        Write-Verbose "Starting timespan $($startTime) -> $($endTime)"

        ## Supports reading multiple logs
        if ($logname.Count -gt 1) {
            foreach ($log in $logname) {
                ReadEvents -filter @{LogName=$log; StartTime=$startTime; EndTime=$endTime} -OutFile $output
            }
        }
        else {
            ReadEvents -filter @{LogName=$logname; StartTime=$startTime; EndTime=$endTime} -OutFile $output
        }
    }
}
catch
{
    Write-Error $error[0]|format-list -force
    throw $_.Exception
}
finally
{
    if($process)
    {
        $process.StandardInput.Close()
        $process.Close()
    }
}

** Сценарий на самом деле не справляется с ошибкой LSF, но пока он служит моим целям.

person Dan    schedule 18.06.2015

Пытался добавить это в ответ с помощью nssm. Вы также можете использовать следующее для создания службы из командной строки без пользовательского интерфейса.

Просто убедитесь, что nssm.exe находится в том же каталоге, и вы запускаете скрипт оттуда (или просто редактируете скрипт).

@echo off
set BASE_DIR=C:\temp\logstash-forwarder
nssm install Logstash-Forwarder "%BASE_DIR%\logstash-forwarder.exe"
nssm set Logstash-Forwarder AppDirectory "%BASE_DIR%"
nssm set Logstash-Forwarder AppStopMethodSkip "6"
nssm set Logstash-Forwarder AppParameters "-config %BASE_DIR%\logstash-forwarder.conf"
person leeman24    schedule 17.02.2016