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?

john84
fonte

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();
}
Andreas Paulsson
fonte
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

bechbd
fonte
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)]
LCJ
fonte
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

kokabi
fonte
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.

Oded
fonte
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

shay
fonte
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.

kernowcode
fonte
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.

zanussi
fonte
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.

Rahatur
fonte
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();
Prajakta Kale
fonte
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");
Mahmut EFE
fonte
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.

Gurunadh Duvvuru
fonte
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.