Start-Service не возвращает достаточно информации о сбое - PullRequest
1 голос
/ 03 апреля 2020

Проблема в том, что когда я запускаю службу Windows из-под OctopusDeploy, то, если служба не запускается - сообщение об ошибке недостаточно описательно. Я использую .net core 3.1 и Microsoft.Extensions.Hosting.WindowsServices пакет для создания windows сервиса. Локально воспроизвести проблему легко:

Start-Service MySvc

следующая ошибка отображается из PowerShell

Start-Service: Service 'MySv c (MySv c) 'невозможно запустить из-за следующей ошибки: Не удается запустить службу MySv c на компьютере'. '. В строке: 1 символ: 1

Start-Service MySv c

+ CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service], ServiceCommandException

+ FullyQualifiedErrorId : CouldNotStartService,Microsoft.PowerShell.Commands.StartServiceCommand

Как видите, отсутствует какая-либо информация о сообщении об ошибке.

Конструктор выглядит так:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseWindowsService()
            .ConfigureServices((hostContext, services) =>
            {
                services.DoCustomLogic();
                services.AddHostedService<Mysvc>();
            })
            .ConfigureLogging(loggingBuilder =>
            {
                loggingBuilder
                    .AddConsole(options => { options.IncludeScopes = true; })
                    .AddEventLog();
            });

На самом деле я точно знаю, какое исключение выдается в методе DoCustomLogic() (реальный код для простоты очищен ):

    public static void DoCustomLogic(this IServiceCollection services)
    {
        string exMsg = "my custom exception";
        throw new Exception(exMsg);
    }

Кроме того, после неудачного запуска - в Event Viewer есть 2 новые записи: enter image description here Выводы .Net runtime:

Application: MySvc.exe
CoreCLR Version: 4.700.19.60701
.NET Core Version: 3.1.1
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Exception: my custom exception
...

Exception Info: System.Exception: my custom exception

Так что, в принципе, я тот, кто на самом деле выдает исключение, и я точно знаю, в чем заключается ошибка. Мой вопрос: возможно ли вывести на консоль powershell более значимую информацию об исключениях такого типа?

Для пользователей, использующих Octopus Deploy, - интуитивно понятно, что нет фактическое сообщение об ошибке отображается в журналах, поэтому они должны войти на сервер и проверить журналы просмотра событий.

Я думаю, что одним из возможных решений было бы создание сценария после сборки, который проверял бы события .. но я бы лучше решил это с C# если возможно ..

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

В итоге я создал сценарий octopus deploy, который печатает последние 3 ошибки из событий Windows.

$EntryType = 'Error'
$LogName = 'Application'
$Source = '.NET Runtime'
$EventCount = 3

Write-Host ' '
Write-Host "Searching for the last $EventCount events of source $Source.."
$evts = Get-EventLog -LogName $LogName -Newest $EventCount -EntryType $EntryType -Source $Source -ErrorAction SilentlyContinue # | Format-List -Property *
if($evts){
    Write-Host ' '
    $i = 1;
    $evts | ForEach-Object -Process {
        Write-Host "`tPrinting event $i"

        $obj = $_#$evts | Select-Object -Property TimeGenerated, Message
        $time = $obj."TimeGenerated"
        $message = $obj."Message" # or $obj | Select -ExpandProperty "SomeProp"

        Write-Host "`tTime: $time"
        Write-Host "`tMessage: $message"
        Write-Host ' '
        $i++;
    }

} else{
    Write-Host "No events found with the name $Source"
}

Write-Host ' '
Exit 0
0 голосов
/ 03 апреля 2020

К сожалению, я не могу проверить это для вас, но как насчет добавления -ErrorAction Stop и перехвата исключения?

try {
    Start-Service MySvc -ErrorAction Stop
} catch {
    # Examine and play with one of the following objects
    Write-Host "$($error[0].Exception)"
    Write-Host "$($_.exception)"
}
...