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.