Quais são as configurações melhores ou mais úteis para fazer logon com o NLog? (Eles podem ser simples ou complexos, desde que sejam úteis.)
Estou pensando em exemplos como rolar automaticamente arquivos de log em um determinado tamanho, alterar o layout (mensagem de log) se há ou não uma exceção, aumentar o nível de log quando ocorrer um erro etc.
Aqui estão alguns links:
Respostas:
Algumas delas se enquadram na categoria de dicas gerais sobre NLog (ou log), em vez de sugestões estritamente de configuração.
Aqui estão alguns links gerais de registro aqui no SO (você já deve ter visto alguns ou todos esses):
log4net vs. Nlog
Práticas recomendadas de log
Qual o sentido de uma fachada de madeira?
Por que os registradores recomendam o uso de um registrador por classe?
Use o padrão comum de nomear seu criador de logs com base na classe
Logger logger = LogManager.GetCurrentClassLogger()
. Isso proporciona um alto grau de granularidade em seus criadores de logs e oferece grande flexibilidade na configuração dos registradores (controle global, por espaço de nome, por nome específico do registrador, etc.).Use loggers não baseados em nome de classe, quando apropriado. Talvez você tenha uma função para a qual realmente deseja controlar o log separadamente. Talvez você tenha algumas preocupações transversais de log (log de desempenho).
Se você não usar o log baseado em nome de classe, considere nomear seus loggers em algum tipo de estrutura hierárquica (talvez por área funcional), para que você possa manter uma maior flexibilidade em sua configuração. Por exemplo, você pode ter uma área funcional "banco de dados", uma FA "análise" e uma FA "ui". Cada um desses pode ter subáreas. Portanto, você pode solicitar registradores como este:
E assim por diante. Com os registradores hierárquicos, você pode configurar o registro globalmente (o "*" ou o registrador raiz), por FA (banco de dados, análise, interface do usuário) ou por subárea (Database.Connect, etc).
Os registradores têm muitas opções de configuração:
Consulte a ajuda do NLog para obter mais informações sobre exatamente o que cada uma das opções significa. Provavelmente, os itens mais notáveis aqui são a capacidade de regras do agente curinga, o conceito de que várias regras do agente podem "executar" para uma única instrução de registro e que uma regra do agente pode ser marcada como "final", para que as regras subsequentes não sejam executadas por um dada declaração de log.
Use GlobalDiagnosticContext, MappedDiagnosticContext e NestedDiagnosticContext para adicionar contexto adicional à sua saída.
Use "variável" no seu arquivo de configuração para simplificar. Por exemplo, você pode definir variáveis para seus layouts e depois referenciar a variável na configuração de destino, em vez de especificar o layout diretamente.
Ou, você pode criar um conjunto "personalizado" de propriedades para adicionar a um layout.
Ou você pode fazer coisas como criar renderizadores de layout "dia" ou "mês" estritamente via configuração:
Você também pode usar renderizações de layout para definir seu nome de arquivo:
Se você rolar o arquivo diariamente, cada arquivo poderá ter o nome "Monday.log", "Tuesday.log" etc.
Não tenha medo de escrever seu próprio renderizador de layout. É fácil e permite adicionar suas próprias informações de contexto ao arquivo de log via configuração. Por exemplo, aqui está um renderizador de layout (baseado no NLog 1.x, não 2.0) que pode adicionar Trace.CorrelationManager.ActivityId ao log:
Informe ao NLog onde suas extensões do NLog (que montagem) estão assim:
Use o renderizador de layout personalizado como este:
Use destinos assíncronos:
E wrappers de destino padrão:
onde apropriado. Consulte os documentos do NLog para obter mais informações sobre eles.
Diga ao NLog para assistir e recarregar automaticamente a configuração se ela mudar:
Existem várias opções de configuração para ajudar na solução de problemas do NLog
Consulte a Ajuda do NLog para obter mais informações.
O NLog 2.0 adiciona wrappers LayoutRenderer que permitem que um processamento adicional seja executado na saída de um renderizador de layout (como aparar espaços em branco, maiúsculas, minúsculas etc.).
Não tenha medo de quebrar o logger se você quiser isolar seu código de uma forte dependência do NLog, mas envolva-o corretamente. Existem exemplos de como agrupar no repositório github do NLog. Outro motivo para quebrar pode ser que você deseja adicionar automaticamente informações de contexto específicas a cada mensagem registrada (colocando-a em LogEventInfo.Context).
Existem prós e contras no empacotamento (ou abstração) do NLog (ou em qualquer outra estrutura de registro para esse assunto). Com um pouco de esforço, você pode encontrar muitas informações aqui, apresentando os dois lados.
Se você estiver pensando em quebrar , considere usar o Common.Logging . Funciona muito bem e permite que você alterne facilmente para outra estrutura de log, se desejar. Além disso, se você estiver pensando em agrupar, pense em como manipulará os objetos de contexto (GDC, MDC, NDC). No momento, o Common.Logging não oferece suporte a uma abstração, mas supostamente está na fila de recursos a serem adicionados.
fonte
NewLine
layout realiza a tarefa. Aqui está o que eu criei. Com certeza, é muito mais simples do que eu esperava.Tratar exceções de maneira diferente
Muitas vezes, queremos obter mais informações quando há uma exceção. A configuração a seguir possui dois destinos, um arquivo e o console, que filtram se há ou não informações de exceção. (Edição: Jarek postou sobre um novo método para fazer isso no vNext .)
A chave é ter um destino de wrapper com
xsi:type="FilteringWrapper" condition="length('${exception}')>0"
fonte
condition="length('${exception}')=0
(ou talvez seja==
) atarget name="file"
.Aparentemente, agora você pode usar o NLog com Growl para Windows .
fonte
Configure o NLog via XML, mas programaticamente
O que? Você sabia que pode especificar o XML do NLog diretamente para o NLog do seu aplicativo, em vez de fazer com que o NLog o leia no arquivo de configuração? Bem, você pode. Digamos que você tenha um aplicativo distribuído e deseje usar a mesma configuração em qualquer lugar. Você pode manter um arquivo de configuração em cada local e mantê-lo separadamente, você pode manter um em um local central e enviá-lo para os locais de satélite, ou você provavelmente poderia fazer muitas outras coisas. Ou então, você pode armazenar seu XML em um banco de dados, obtê-lo na inicialização do aplicativo e configurar o NLog diretamente com esse XML (talvez retorne periodicamente para verificar se ele foi alterado).
Não tenho certeza de quão robusto isso é, mas este exemplo fornece um ponto de partida útil para pessoas que podem querer tentar configurar assim.
fonte
<?xml version='1.0' encoding='utf-8' ?><nlog xmlns='http://nlog-project.org/schemas/NLog.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
Registrando níveis diferentes, dependendo se há ou não um erro
Este exemplo permite que você obtenha mais informações quando houver um erro no seu código. Basicamente, ele armazena em buffer as mensagens e apenas as emite em um determinado nível de log (por exemplo, Avisar), a menos que uma determinada condição seja atendida (por exemplo, houve um erro, portanto, o nível de log é> = Erro) e, em seguida, gera mais informações (por exemplo, todas as mensagens dos níveis de log> = Rastreio). Como as mensagens são armazenadas em buffer, isso permite coletar informações de rastreamento sobre o que aconteceu antes do registro de um Error or ErrorException - muito útil!
Eu adaptei este a partir de um exemplo no código fonte . Fui jogado inicialmente porque deixei de fora o
AspNetBufferingWrapper
(já que o meu não é um aplicativo ASP) - acontece que o PostFilteringWrapper requer algum destino em buffer. Observe que otarget-ref
elemento usado no exemplo vinculado acima não pode ser usado no NLog 1.0 (estou usando o 1.0 Refresh para um aplicativo .NET 4.0); é necessário colocar seu alvo dentro do bloco de invólucro. Observe também que a sintaxe lógica (ou seja, maior ou menor que símbolos, <e>) deve usar os símbolos, e o XML não escapa para esses símbolos (ou seja,>
e<
) ou o NLog irá erro.app.config:
fonte
fileAsCsv
target-ref é apenas um artefato dos meus testes. Acredito que o NLog 2 tenha tido / teve problemas com o CsvLayouts que o NLog 1 / Refresh não teve.Forneci algumas respostas razoavelmente interessantes para esta pergunta:
Nlog - Gerando Seção de Cabeçalho para um Arquivo de Log
Adicionando um cabeçalho:
A pergunta queria saber como adicionar um cabeçalho ao arquivo de log. O uso de entradas de configuração como essa permite definir o formato do cabeçalho separadamente do formato do restante das entradas de log. Use um único logger, talvez chamado de "headerlogger", para registrar uma única mensagem no início do aplicativo e você obtém seu cabeçalho:
Defina os layouts de cabeçalho e arquivo:
Defina os destinos usando os layouts:
Defina os registradores:
Escreva o cabeçalho, provavelmente no início do programa:
Essa é apenas mais uma versão da idéia "Tratar exceções de maneira diferente".
Registrar cada nível de log com um layout diferente
Da mesma forma, o pôster queria saber como alterar o formato por nível de log. Não estava claro para mim qual era o objetivo final (e se poderia ser alcançado de uma maneira "melhor"), mas pude fornecer uma configuração que fizesse o que ele pediu:
Novamente, muito parecido com Tratar exceções de maneira diferente .
fonte
GlobalDiagnosticsContext
antes.Entrar no Twitter
Baseado neste post sobre um log4net Twitter Appender, Pensei em tentar escrever um NLog Twitter Target (usando a atualização do NLog 1.0, não a 2.0). Infelizmente, até agora não consegui que um Tweet fosse publicado com êxito. Não sei se há algo errado no meu código, no Twitter, na conexão com a Internet da empresa / firewall ou o quê. Estou postando o código aqui, caso alguém esteja interessado em experimentá-lo. Observe que existem três métodos "Post" diferentes. O primeiro que eu tentei é PostMessageToTwitter. PostMessageToTwitter é essencialmente o mesmo que PostLoggingEvent na postagem original. Se eu usar isso, recebo uma exceção 401. PostMessageBasic recebe a mesma exceção. O PostMessage é executado sem erros, mas a mensagem ainda não chega ao Twitter. PostMessage e PostMessageBasic são baseados em exemplos que encontrei aqui no SO.
FYI - Acabei de encontrar um comentário de @Jason Diller para uma resposta neste post que diz que o twitter desativará a autenticação básica "no próximo mês". Isso foi em maio de 2010 e agora é dezembro de 2010, então acho que pode ser por isso que isso não está funcionando.
Configure-o assim:
Informe ao NLog o assembly que contém o destino:
Configure o destino:
Se alguém tentar fazer isso e tiver sucesso, poste de volta com suas descobertas.
fonte
Relatórios para um site / banco de dados externo
Eu queria uma maneira simples e automática de relatar erros (já que os usuários geralmente não o fazem) de nossos aplicativos. A solução mais fácil que eu consegui encontrar foi uma URL pública - uma página da web que poderia receber e armazenar em um banco de dados - que envia dados após um erro de aplicativo. (O banco de dados pode ser verificado por um desenvolvedor ou um script para saber se há novos erros.)
Eu escrevi a página da web em PHP e criei um banco de dados mysql, usuário e tabela para armazenar os dados. Decidi sobre quatro variáveis de usuário, um ID e um carimbo de data e hora. As variáveis possíveis (incluídas na URL ou como dados POST) são:
app
(Nome da Aplicação)msg
(mensagem - por exemplo, ocorreu uma exceção ...)dev
(desenvolvedor - por exemplo, Pat)src
(origem - isso viria de uma variável pertencente à máquina na qual o aplicativo estava sendo executado, por exemplo,Environment.MachineName
ou algo assim)log
(um arquivo de log ou mensagem detalhada)(Todas as variáveis são opcionais, mas nada é relatado se nenhuma delas estiver definida - portanto, se você apenas visitar o URL do site, nada será enviado ao banco de dados.)
Para enviar os dados para o URL, usei o
WebService
destino do NLog . (Observe, no início, tive alguns problemas com esse destino. Foi só depois de olhar para a fonte que descobri que o meuurl
não podia terminar com um/
.)Em suma, não é um sistema ruim para controlar as aplicações externas. (Obviamente, a coisa mais educada a fazer é informar aos usuários que você estará relatando dados possivelmente confidenciais e dar a eles uma maneira de ativar / desativar.)
Coisas do MySQL
(O usuário db possui apenas
INSERT
privilégios nessa tabela em seu próprio banco de dados.)Código do site
(PHP 5.3 ou 5.2 com DOP ativado , o arquivo está
index.php
na/report
pasta)Código do aplicativo (arquivo de configuração NLog)
Nota: pode haver alguns problemas com o tamanho do arquivo de log, mas não descobri uma maneira simples de truncá-lo (por exemplo, o
tail
comando de um la * nix ).fonte
url
: InnerException: System.InvalidCastException Message = conversão inválida de 'System.String' para 'System.Uri'. Origem = mscorlib StackTrace: no System.Convert.DefaultToType (valor IConvertible, Tipo targetType, provedor IFormatProvider) em System.String.System.IConvertible.ToType (Tipo de tipo, provedor IFormatProvider) em System.Convert.ChangeType (Valor do objeto, Tipo conversionType , Provedor IFormatProvider)Maneira mais fácil de registrar cada nível de log com um layout diferente usando layouts condicionais
Consulte https://github.com/NLog/NLog/wiki/When-Filter para obter sintaxe
fonte
Log do Silverlight
Ao usar o NLog com o Silverlight, você pode enviar o rastreamento para o lado do servidor por meio do serviço da web fornecido . Você também pode gravar em um arquivo local no Armazenamento Isolado, que será útil se o servidor da Web estiver indisponível. Veja aqui para detalhes, ou seja, use algo como isto para tornar-se um alvo:
fonte