log4net não está funcionando

123

Ei, eu tenho essa configuração no meu web.config

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
        <param name="File" value="mylog.log" />
        <param name="AppendToFile" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="" />
            <param name="Footer" value="" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <param name="Header" value="[Header]\r\n" />
            <param name="Footer" value="[Footer]\r\n" />
            <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
        </layout>
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="LogFileAppender" />
        <appender-ref ref="ConsoleAppender" />
    </root>
</log4net>

mas o log4net não está funcionando. Meu projeto é compilado e também não recebo erros de depuração. As linhas para as quais eu digo log.debug("somemessage")ficam bem, mas não consigo encontrar o mylog.logarquivo, então onde está?

Jakob
fonte
Certifique-se de verificar isso também: stackoverflow.com/a/24617269/114029 #
Leniel Maccaferri

Respostas:

298

Uma dica para esse tipo de coisa é certificar-se de adicionar o XmlConfiguratoratributo ao assembly, colocando a seguinte linha no seu AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator]

Caso contrário, o log4net nunca será ativado.

Kirk Woll
fonte
5
Esse método costumava funcionar no meu projeto, mas parou de funcionar de alguma forma. Eu tive que usar esse método stackoverflow.com/a/1479343/193634 para fazê-lo funcionar novamente.
precisa saber é o seguinte
Eu apenas tentei novamente e funciona bem. Provavelmente você não está AssemblyInfofazendo referência / carregando a montagem que contém a logo que pensou.
precisa
Para aqueles que usam o ELMAH appender, este é o caminho a percorrer. Eu tinha 'log4net.Config.XmlConfigurator.Configure ();' em global.asax.cs e estava funcionando bem para o aplicativo Fileender, mas não para os anexadores ELMAH.
user3885927
Marquei esta resposta e descobri que precisava ajustá-la com `[assembly: log4net.Config.XmlConfigurator (Watch = true)]`
David Savage
49

Eu acho que o log4net não está registrando nada ou o arquivo não está terminando onde você espera.

Em primeiro lugar, você realmente ligou

XmlConfigurator.Configure()

em qualquer lugar do seu código? Se o trecho xml acima estiver no arquivo de configuração do aplicativo, esta chamada fará o truque. Se o snippet xml estiver em seu próprio arquivo, você precisará usar a .Configure(string)sobrecarga que leva ao caminho do arquivo. Sem essa chamada (ou aparentemente o atributo de nível de montagem mencionado por Kirk Woll), o log4net não estará registrando nada.

Se você acredita que tudo isso foi feito, e o log4net deve estar registrando, talvez você deva colocar um caminho totalmente qualificado para o arquivo de log enquanto faz a depuração. Isso permitirá que você tenha certeza de onde o arquivo deve estar.

Rob Levine
fonte
33

Há outra pequena pegadinha, veja aqui: http://logging.apache.org/log4net/release/manual/configuration.html#dot-config

o [assembly: log4net.Config.XmlConfigurator]método não funciona com app.config. Se você configurar o log4net a partir do app.config, deverá usar o log4net.Config.XmlConfigurator.Configure()método

Amir Abiri
fonte
Apenas para constar, os dois métodos funcionaram para mim em um aplicativo de console.
Rogeit #
Confirmo a solução acima - tive que chamar log4net.Config.XmlConfigurator.Configure (); no meu código (que usa o app.config para que o log4net funcione efetivamente. As linhas que são impressas com eficácia são aquelas subsequentes à execução do método Configure ().)
luisa rosi 23/03
19

Aqui está minha lista de verificação para quando o log4net está se mostrando recalcitrante:

  • certifique-se de que o arquivo log4net.config seja copiado para a pasta bin \ ao criar (defina como 'Copiar se for mais novo' no compilador)
    • ao lidar com o código instalado, verifique se o log4net.config veio para a viagem (definido como 'Conteúdo' no compilador)
  • verifique se o usuário que o processo executa como possui direitos de gravação na pasta em que os logs devem ser gravados
  • em caso de dúvida, conceda permissões promíscuas para c: \ temp \ e faça com que tudo faça logon para lá ()
  • inicie o Sysinternal / Dbgview.exe para ver se isso diz alguma coisa
earthling42
fonte
3
"certifique-se de que o arquivo log4net.config seja copiado para a pasta bin \ ao criar (defina como 'Copiar se for mais novo' no compilador)" -> salve o meu dia! Muito obrigado!
Hoang Nguyen Huu
8

Para um projeto ASP.NET MVC, adicionar

log4net.Config.XmlConfigurator.Configure();

para o Global.asax.cs também ajuda a:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        log4net.Config.XmlConfigurator.Configure();
    }
}
Oladipo Olasemo
fonte
1
Tive um problema muito estranho com isso: na produção e no computador do meu chefe, os madeireiros funcionaram bem dessa maneira, mas não até a resposta de Kirk ter funcionado no meu computador. Só pensei em avisar as pessoas caso tenham problemas semelhantes (projeto MVC entre).
Shelby115
@ Shelby115, muito obrigado! Eu estava tentando colocar minhas entradas do log4Net no ELMAH. Eu tinha tudo correto no web.config. Eu já tinha 'log4net.Config.XmlConfigurator.Configure ();' no meu global.asax.cs, mas não está funcionando. Chegou a este post do SO e adicionou a linha ao assemblyInfo.cs com base nos Kirk. Ainda não funcionou! Depois de ler seu comentário, excluí a entrada anterior de global.asax.cs e ela começou a funcionar. Passei várias horas nisso e seu comentário foi uma grande ajuda. Obrigado novamente!
user3885927
A entrada no arquivo global.asax.cs estava funcionando bem para o File Appender, mas não para os anexadores ELMAH. Maneira de Kirk trabalhou para ELMAH appender (I especificamente teve que removê-lo formar global.asax.cs)
user3885927
Você também pode garantir que o log4net tenha permissões de gravação no diretório configurado para os arquivos de log.
Oladipo Olasemo 26/11/2015
@ Shelby115 Dang, tenho que amá-lo quando você esquece a solução e seu próprio comentário resolve o seu problema. Chegar a uma página com uma resposta já votada por você também é um bom indicador.
Shelby115
7

Estas são as etapas que finalmente fizeram meu log de arquivos funcionar:

  • -Verifique AssemblyInfo.cs contém o seguinte atributo. [assembly: log4net.Config.XmlConfigurator] . Isso carrega o log4net.
  • Verifique se o diretório de log possui permissões de gravação.
  • Verifique se o logger possui um formato especificado. Isso é feito verificando se cada elemento da sua configuração possui um elemento de layout especificado. Por exemplo:

<appender name="MainLogger"... <layout type="log4net.Layout.SimpleLayout"/>

  • Por fim, tente ativar o log interno do log4net para ativar o log do console e verificar o console. Para fazer isso, adicione <add key="log4net.Internal.Debug" value="true"/>ao seu appSettings.
Echilon
fonte
<add key = "log4net.Internal.Debug" value = "true" /> Isso me ajudou a solucionar o problema. Obrigado
Ravi Khambhati
As permissões do diretório é o que me pegou
Omar Himada
6

Eu tive experiências em que os sistemas de log falham silenciosamente sem gerar exceções. Suponho que isso faça sentido, porque se o criador de logs está registrando erros, como pode registrar um erro que não pode executar o registro?

Portanto, se o arquivo não for criado no disco, comece examinando as permissões do sistema de arquivos para garantir que o usuário em que seu aplicativo está executando possa gravar um novo arquivo no local do disco.

Para fins de teste, convém criar manualmente o arquivo no disco que deve ser gravado e abrir permissões para que todos possam gravá-lo. Se o criador de logs começar a escrever nele, você saberá que é baseado em permissão, e não em configuração.

John K
fonte
2

Do meu lado, esqueci de marcar o arquivo de configuração a ser copiado enquanto o aplicativo está sendo compilado.

Copie o arquivo de configuração para o diretório de saída

Apenas clique com o botão direito do mouse no arquivo log4net.config, selecione a propriedade e escolha Copiar no diretório de saída para ser a cópia XXXX

Võ Quang Hòa
fonte
1

Eu tentei todas as opções acima, mas nada funcionou. Adicionar esta linha na seção app.config configSections funcionou para mim.

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" />

Verifique se Versione PublicKeyTokenestá correto

Reyan Chougle
fonte
0
<param name="File" value="mylog.log" />

está dizendo "escreva mylog.log na pasta atual". Isso significa que, se o seu aplicativo da web estiver no IIS, o log será gravado em C: \ inetpub \ wwwroot \ appname \ mylog.log.

Se o arquivo de log não estiver lá, talvez a conta na qual o aplicativo esteja em execução não tenha permissão de gravação na pasta. Você pode executar o Process Monitor a partir do SysInternals para ver se e onde um arquivo está gravado.

Execute também o VS no modo de depuração, para ver se alguma exceção é lançada (Debug-> Exceptions-> CLR Exceptions, marque Thrown).

Tomas Voracek
fonte
0

No meu caso, esqueço de definir as propriedades do arquivo log4Net.config como "Conteúdo" para que o arquivo não seja incluído na implantação. Então preste atenção:

Compile action : Content
Marco
fonte
0

Infelizmente, nenhuma das opções acima ajudou. A configuração explícita na classe a ser registrada adicionalmente às sugestões de configurações anteriores fez o truque para mim.

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
log4net.Config.XmlConfigurator.Configure(new FileInfo(assemblyFolder + "/log4net.config"));
Petro Slyvko
fonte
-7

Também depois de algumas horas, eu descobri por que não estava funcionando para mim ...

eu tinha:

public static class Program
{

    private static CommunicationManager _bcScanner = new CommunicationManager();
    private static ILog _log = LogManager.GetLogger(typeof(Program));
    private static SocketServer socketListener;

mas deve ser:

public static class Program
    {
        private static ILog _log = LogManager.GetLogger(typeof(Program));
        private static CommunicationManager _bcScanner = new CommunicationManager();
        private static SocketServer socketListener;

Portanto, verifique se o ILog está na primeira linha ....

Jeroen Bakker
fonte
1
Definitivamente, essa não é a causa. Não importa quando você inicializa o objeto ILog, desde que faça isso antes de fazer uma chamada para os métodos de log, como _log.Info; _log.error etc.
Oladipo Olasemo