Log4net não grava o arquivo de log


159

Criei um cenário simples usando o Log4net, mas parece que meus anexos não funcionam porque as mensagens não são adicionadas ao arquivo de log.

Adicionei o seguinte ao arquivo web.config:

<configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>        
</configSections>

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <file value="D:\MyData\Desktop\LogFile.txt" />
            <appendToFile value="true" />
            <encoding value="utf-8" />
            <layout type="log4net.Layout.SimpleLayout" />
    </appender>


    <root>
        <level value="INFO" />
        <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

No arquivo ASAX global, adicionei:

ILog logger = LogManager.GetLogger(typeof(MvcApplication));

e dentro do método Application_Start:

logger.Info("Starting the application...");

O que eu fiz errado?

Respostas:


316

Você ligou

log4net.Config.XmlConfigurator.Configure();

algum lugar para fazer log4net ler sua configuração? Por exemplo, no Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup

    // Initialize log4net.
    log4net.Config.XmlConfigurator.Configure();
}

4
Muito obrigado, foi a seguinte linha: log4net.Config.BasicConfigurator.Configure (); Eu chamo isso se eu usar a configuração c # em vez de web.config para configurar o log4net? É a chamada "Configure" -Method de qualquer forma necessária, porque em muitos tutoriais não encontrei essa linha de código.
— john84

9
Existem várias maneiras de informar ao log4net onde procurar a configuração, consulte logging.apache.org/log4net/release/manual/configuration.html . Chamar XmlConfigurator.Configure () fará com que o log4net procure a configuração em <app.exe> ​​.config ou web.config. O BasicConfigurator.Configure irá (de acordo com os documentos do SDK): "Inicializa o sistema de log log4net usando um ConsoleAppender que gravará no Console.Out."
— Andreas Paulsson

FYI - você também pode usar log4net.Config.BasicConfigurator se NÃO quiser que ele se baseie em arquivos. A saída é enviada ao console.
— silverArc

1
Estou fazendo a configuração no AssemblyInfoarquivo. Postado como resposta abaixo.
— LCJ 9/08/13

Argh, encontrou muitas dessas perguntas e em todos os lugares elas não mencionam onde encontrar os arquivos de log reais ... É tão óbvio que todo mundo já sabe?
— MrFox

50

Use esta página de perguntas frequentes: Perguntas freqüentes sobre o Apache log4net

Cerca de 3/4 do caminho abaixo, mostra como habilitar a depuração do log4net usando o rastreamento de aplicativo. Isso informará onde está o seu problema.

O básico é:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
</configuration>

E você vê o rastreio na saída padrão


1
Obrigado, verifiquei as perguntas frequentes, mas estas não puderam resolver meu problema.
— john84

1
Graças a esta resposta, consegui identificar que minha rootseção estava se referindo ao registrador errado !!
— seebiscuit

ótima dica. Descobri que o acesso foi negado para o usuário asp.net
— Nuvens azuis

se isso não funcionar para alguém, tente o meu modo de usar isso: <log4net> <internal> <Debug value = "true"> </Debug> </internal> </log4net>
— himanshupareek66

35

Como o @AndreasPaulsson sugeriu, precisamos configurá-lo. Estou fazendo a configuração no AssemblyInfoarquivo. Eu especifico o configuration file nameaqui.

// Log4Net Configuration.
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

9
o que acontece se eu tiver isso e log4net.Config.XmlConfigurator.Configure (); carregando?
— N00b

1
@ n00b, então podemos comentar esta linha, na verdade apenas dessa maneira funcionou para mim "log4net.Config.XmlConfigurator.Configure ();", E mais uma coisa: eu adicionei isso nas minhas configurações do web.config também <add key = "log4net.Internal.Debug" value = "true" />
— himanshupareek66

33

Além disso, verifique se a opção "Copiar sempre" está selecionada para [log4net] .config

insira a descrição da imagem aqui


1
Essa foi a solução para mim. Eu sempre esqueço essa configuração.
— Ju66ernaut 16/06

25

Verifique se o processo (conta) no qual o site está sendo executado tem privilégios para gravar no diretório de saída.

No IIS 7 e acima, isso é configurado no pool de aplicativos e normalmente é a AppPool Identity , que normalmente não terá permissão para gravar em todos os diretórios.

Verifique seus logs de eventos (aplicativo e segurança) para ver se alguma exceção foi lançada.


Obrigado pela sua ajuda, também pensei em problemas de permissão, mas também se eu definir na pasta ler, gravar, modificar e executar permissões para todos que não funcionarem.
— john84

@ john84 - você está recebendo exceções? Você já olhou os logs de eventos?
— Oded

Também é importante, como acabei de descobrir, com um serviço do Windows executando em uma conta específica.
— Bob Mc

Muito obrigado que me ajudou muito.
— Abbas

20

Inserir:

 [assembly: log4net.Config.XmlConfigurator(Watch = true)]

no fim de arquivo AssemblyInfo.cs


Este foi o meu resgate. Executando um projeto de formulários da área de trabalho e colocando log4net.Config.XmlConfigurator.Configure (); no principal não estava ajudando. Obrigado
— Tomas Hesse

isso me ajudou. Eu tinha configuração no web.config, mas o log4net parecia não captar as alterações feitas. Eu adicionei "Assista = true" para esse atributo e anithing começou a trabalhar
— Albe

3

Para mim, mudei o local dos arquivos de log e foi somente quando alterei o nome do arquivo para outra coisa que ele começou novamente.

Parece que se já existe um arquivo de log com o mesmo nome, nada acontece.

Depois, renomeei o arquivo antigo e alterei o nome do arquivo de log na configuração novamente para o que era.


2

No meu caso, o log4net não estava registrando corretamente devido a ter um espaço no nome do meu projeto. Por que o mesmo código funcionou bem em um projeto diferente, mas não no novo. Espaços. Um espaço simples.

Portanto, tenha cuidado com os espaços nos nomes dos projetos. Eu aprendi minha lição.


1
Onde você teve esse problema? Log4Net está funcionando muito bem em um projeto, mas não em outro ... não sei por quê. Tks
— Pascal

2

No meu caso, eu tive que dar a IIS_IUSRSpermissão de leitura / gravação para o arquivo de log.


1

Verifique se o seguinte código de linha deve estar lá no arquivo AssemblyInfo.cs.

[assembly: log4net.Config.XmlConfigurator (ConfigFile = "Web.config", Watch = true)]

e também verifique esta linha no método Application_start ().

log4net.Config.XmlConfigurator.Configure();

0

Seu arquivo de configuração parece correto. Em seguida, você deve registrar seu arquivo de configuração do Log4net no aplicativo. Então você pode usar o código abaixo:

var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

Após o processo de registro, você pode ligar abaixo da definição para chamar o registrador:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

log.Error("Sample log");

0

Para mim, tive que mudar o Logger para um pacote Nuget. O código abaixo precisa ser adicionado ao projeto de pacote NuGet.

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]

Consulte https://gurunadhduvvuru.wordpress.com/2020/04/30/log4net-issues-when-moved-it-to-a-nuget-package/ para obter mais detalhes.


Tente evitar links como respostas. Eles podem nem sempre funcionar. Talvez edite sua resposta para incluir um resumo das informações no link.
— Derek C.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.