Pergunta

Temos um serviço de C # que é implantado em um sistema de cliente remoto. O aplicativo grava uma quantidade substancial de informações "diagnóstico" para o console (ou seja Console.WriteLine ()). O serviço não está "fazendo o que deveria." Como podemos capturar a saída do console do serviço em outro aplicativo?

Uma versão WinForm a aplicação pode ser carregado no local do cliente. É, infelizmente, funciona corretamente.

Update:

Nós somos capazes de mudar a mudança do serviço, mas prefere não fazer grandes mudanças neste momento.

Nós também estão registrando para MSMQ, mas apenas para eventos "importantes". Este serviço não interage com MSMQ para suas operações normais. Ou pelo menos deveria. O serviço não parece estar puxando itens de MSMQ quando a versão WinForm faz. Então, escrever as mensagens que estão indo para o console poderia ser problemático.

Foi útil?

Solução

Você é capaz de alterar o código de serviço em tudo ? Se assim for, usando Console.SetOut para escrever para um arquivo em vez seria o primeiro porto mais óbvia de chamada. Em seguida, mudar para a utilização de uma biblioteca de registro apropriada para o próximo lançamento:)

Outras dicas

Em geral, você deve evitar escrever informações de diagnóstico diretamente para Console, o log de eventos, MSMQ ou em outra parte do seu código do aplicativo. Em vez disso chamar uma API de registro e configuração de uso para redirecionar a saída para onde quiser.

Por exemplo, você poderia substituir todo o Console.WriteLine por Trace.WriteLine (*). Depois, você pode redirecionar a saída para o console, um arquivo ou em outro lugar, modificando o arquivo de configuração do aplicativo: por exemplo, para a saída para o console, use um ConsoleTraceListener, algo como:

<configuration>
  <system.diagnostics>
    <trace autoflush="false" indentsize="4">
      <listeners>
        <add name="configConsoleListener"
             type="System.Diagnostics.ConsoleTraceListener" />
      </listeners>
    </trace>
  </system.diagnostics>
 </configuration>

Durante a depuração, você vai ter a sua saída no console -. No site do cliente que você configurá-lo para redirecionar a saída de rastreamento para um arquivo, o log de eventos ou similar

Mesmo melhor, use uma estrutura de log 3rd party (eu recomendo Log4Net) que lhe dará mais opções do que System.Diagnostics.Trace.

(*) Trace.Write / Trace.WriteLine são os mesmos que Debug.Write / Debug.WriteLine, exceto que o último só são compilados se o símbolo de depuração está definido. Então, preferem rastreamento para depuração se você deseja que a saída para estar disponível em compilações.

Você tem um monte de opções; redirecionando a saída do console para um arquivo e usando uma biblioteca de registro adequado como mencionado são dois os bons. Aqui está uma opção do meio:. Gravação para o log de eventos

EventLog log;
string logsource = "MyService";

// execute once per invocation
if (!System.Diagnostics.EventLog.SourceExists(logsource))
{
    System.Diagnostics.EventLog.CreateEventSource(
        logsource, "Application");
}
log = new EventLog();
log.Source = logsource;
log.Log = "Application";

// replace console logging with this
log.WriteEntry(message, EventLogEntryType.Information);

Em seguida, procure entradas no log de eventos do aplicativo (Ferramentas administrativas -> Visualizador de eventos). Onde Source = "MyService"

Eu não usaria Console.WriteLine em tudo a partir de um serviço de janela. Você provavelmente deve registrar esses erros para um arquivo de log.

Outra maneira de fazer isso para que múltiplas aplicações podem consumir os logs está postando as mensagens de log para uma fila MSMQ.

uso Debug.WriteLine e uso sysinternals DebugView?

este postar no MSDN que liga a saída do console para uma caixa de texto rico, trabalhou para mim muito rapidamente e facilmente.

Ela substitui WriteLine, e poderia ser expandida para substituir outros métodos.

Aqui está como eu visto a saída do console de um serviço em execução no Windows 7. Essa ajuda pode se você são absolutamente incapazes de modificar o código fonte do serviço para fazer logon em um arquivo.

  1. Executar services.msc e editar as propriedades do serviço. Na guia "Log On", marque a opção "Permitir serviço para interagir com área de trabalho"

  2. Use o Editor do Registro para modificar o ImagePath do seu serviço: Vá para HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ [seu nome de serviço] e editar ImagePath. Anexar cmd.exe /c ao início da cadeia ImagePath. Portanto, se seu ImagePath original está c:\myService\myservice.exe seu novo ImagePath deve ser cmd.exe /c c:\myService\myservice.exe.

  3. Comece o seu serviço. Você deverá receber uma janela pop-up intitulado "Detecção de Serviços Interativa". Selecione "Ver a mensagem". Sua tela deve mudar contextos e exibir a janela de console. Quando terminar, clique no botão "Return agora".

  4. Quando a depuração acabado, modificar ImagePath de volta ao seu valor original. Em seguida, desmarque a caixa de seleção "Permitir serviço para interagir com área de trabalho" nas propriedades do serviço e reiniciar o serviço.

Atenção: Eu só fiz isso com um serviço e ele trabalhou para mim. Eu não sei se ele vai trabalhar para qualquer serviço ou se ele irá causar quaisquer resultados inesperados, então eu sugiro fortemente que você só faça isso em um ambiente de não-produção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top