Esta é uma má ideia, eu sei, mas ... Quero configurar log4net programaticamente do zero, sem arquivo de configuração. Estou trabalhando em um aplicativo de registro simples para mim e minha equipe para usar em um monte de aplicativos departamentais relativamente pequenos pelos quais somos responsáveis. Quero que todos eles façam login no mesmo banco de dados. O aplicativo de registro é apenas um invólucro do log4net com o AdoNetAppender pré-configurado.
Todos os aplicativos são implantados com ClickOnce, o que apresenta um pequeno problema com a implantação do arquivo de configuração. Se o arquivo de configuração fizesse parte do projeto principal, eu poderia definir suas propriedades para implantar com o assembly. Mas é parte de um aplicativo vinculado, então não tenho a opção de implantá-lo com o aplicativo principal. (Se isso não for verdade, alguém por favor me avise).
Provavelmente por ser uma má ideia, não parece haver muitos códigos de amostra disponíveis para configurar programaticamente o log4net do zero. Aqui está o que eu tenho até agora.
Dim apndr As New AdoNetAppender()
apndr.CommandText = "INSERT INTO LOG_ENTRY (LOG_DTM, LOG_LEVEL, LOGGER, MESSAGE, PROGRAM, USER_ID, MACHINE, EXCEPTION) VALUES (@log_date, @log_level, @logger, @message, @program, @user, @machine, @exception)"
apndr.ConnectionString = connectionString
apndr.ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
apndr.CommandType = CommandType.Text
Dim logDate As New AdoNetAppenderParameter()
logDate.ParameterName = "@log_date"
logDate.DbType = DbType.DateTime
logDate.Layout = New RawTimeStampLayout()
apndr.AddParameter(logDate)
Dim logLevel As New AdoNetAppenderParameter()
logLevel.ParameterName = "@log_level"
'And so forth...
Depois de configurar todos os parâmetros para apndr
, tentei primeiro isso ...
Dim hier As Hierarchy = DirectCast(LogManager.GetRepository(), Hierarchy)
hier.Root.AddAppender(apndr)
Não funcionou. Então, como um tiro no escuro, tentei fazer isso.
BasicConfigurator.Configure(apndr)
Isso também não funcionou. Alguém tem boas referências sobre como configurar log4net programaticamente do zero, sem arquivo de configuração?
Respostas:
Uma maneira de fazer isso no passado é incluir o arquivo de configuração como um recurso incorporado e usar apenas log4net.Config.Configure (Stream) .
Dessa forma, eu poderia usar a sintaxe de configuração com a qual estava familiarizado e não precisava me preocupar em implantar um arquivo.
fonte
Aqui está um exemplo de classe que cria a configuração log4net completamente em código. Devo mencionar que criar um logger por meio de um método estático geralmente é visto como ruim, mas no meu contexto, era isso que eu queria. Independentemente disso, você pode dividir o código para atender às suas necessidades.
}
fonte
hierarchy.Configured = true;
qual funciona para mimSolução mais concisa:
Não se esqueça de chamar o método ActivateOptions :
fonte
ActivateOptions()
Definitivamente, a chamada está faltando ou pelo menos não foi apontada o suficiente nos documentos.Como diz Jonathan , usar um recurso é uma boa solução.
É um pouco restritivo, pois o conteúdo do recurso embutido será corrigido no momento da compilação. Eu tenho um componente de registro que gera um XmlDocument com uma configuração Log4Net básica, usando variáveis definidas como appSettings (por exemplo, nome de arquivo para um RollingFileAppender, nível de registro padrão, talvez nome de string de conexão se você quiser usar um AdoNetAppender). E então eu chamo
log4net.Config.XmlConfigurator.Configure
para configurar o Log4Net usando o elemento raiz do XmlDocument gerado.Em seguida, os administradores podem personalizar a configuração "padrão", modificando alguns appSettings (normalmente nível, nome do arquivo, ...) ou podem especificar um arquivo de configuração externo para obter mais controle.
fonte
Não posso dizer no trecho de código da pergunta se o "'E assim por diante ..." inclui o apndr.ActivateOptions () muito importante que é indicado na resposta de Todd Stout. Sem ActivateOptions (), o Appender fica inativo e não fará nada que possa explicar por que está falhando.
fonte
Um pouco tarde para a festa. Mas aqui está uma configuração mínima que funcionou para mim.
Classe de amostra
Configuração mínima de rastreamento log4net (dentro do teste NUnit)
Imprime para o ouvinte de rastreamento
fonte
Dr. Netjes tem isso para definir a cadeia de conexões de forma programática:
fonte
// Eu embuti três arquivos de configuração como um recurso embutido e os acessei assim:
fonte
É estranho que
BasicConfigurator.Configure(apndr)
não funcionou. No meu caso, fez o seu trabalho ... Mas, de qualquer forma, aqui vai a resposta - você deveria ter escritohier.Configured = true;
(código c #) depois de terminar toda a configuração.fonte
Acabei usando este:
http://www.mikebevers.be/blog/2010/09/log4net-custom-adonetappender/
Após 4 horas mexendo na configuração e ficando cada vez mais frustrado.
Espero que ajude alguém.
fonte
Aqui está um exemplo de como você pode criar e usar um
AdoNetAdapter
inteiramente em código, completamente na ausência de qualquerApp.config
arquivo (nem mesmo paraCommon.Logging
). Vá em frente, exclua!Isso tem o benefício adicional de ser resiliente contra atualizações sob as novas convenções de nomenclatura , onde o nome do assembly agora reflete a versão. (
Common.Logging.Log4Net1213
, etc.)[SQL]
[A Principal]
[DbAppender]
[DbParameter]
[DbPatternLayout]
[DbExceptionLayout]
fonte
'Solução para Vb.Net
fonte