Log4net error with XmlHierarchyConfigurator. Missing Filter Property - log4net

One of our WebApis stopped outputting logs recently. In the Trace file we were getting this message:
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [filter] to set object on [log4net.Repository.Hierarchy.Hierarchy]
The config file looks as below and I'm assuming the filter in the error is the same filter in the config so I'm not sure why it can't find it.
I upgraded to the latest version of log4net and that solved the issue for a few days and then we got the "Cannot find Property [filter]" error again. The config file hasn't changed at all over this period.
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingFileAppender"/>
</root>
<filter type="log4net.Filter.LevelMatchFilter">
<acceptOnMatch value="true" /> <!--change to false to exclude info logs -->
<levelToMatch value="INFO" />
</filter>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs/Log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1001KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level: %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
It's weird that it worked for a while, stopped, updgraded, worked for a while, stopped. I'm at at loss as to what could have changed to make it stop working either time.
Thanks in advance for any help.

Your configuration is not valid.
A filter can only be defined within an appender.
The documentation mentions:
Filters elements may only be defined as children of <appender>
elements.
Move the filter definition to the appender as shown below.
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.LevelMatchFilter">
<acceptOnMatch value="true" /> <!--change to false to exclude info logs -->
<levelToMatch value="INFO" />
</filter>
<file value="Logs/Log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="1001KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level: %message%newline" />
</layout>
</appender>
(I can't explain why the error only occurs at certain/random times; probably it (re-)occurs at configuration time eg. after an website/appdomain recycle) ...
In the end, Log4net tries to keep continuing as much as possible.

Related

ASP.NET Boilerplate adding an additional log file with Log4Net and Castle Logging

I've been trying to find documentation and guidance on how to use a separate log file in ASP.NET Boilerplate MVC.
It's straight forward to inject ILogger and push messages into the default Log.txt file, however I need a separate log file to record a lot of batch job messages and keep things tidy.
I can't find any methods to use another log from the Log4Net.config file. Can anyone advise on the correct code / configuration?
So I found the answer by chance in looking at the Hangfire documentation, where it was shown you can configure Hangfire messages to be sent to another log file by getting Log4Net to listen for the Hangfire name and route based on that.
With the following additional configuration in Log4Net.config I now have Log messages created normally within MyClass sent to the MyClass.txt log file:
<appender name="RollingFileAppender_MyClass" type="log4net.Appender.RollingFileAppender" >
<file value="App_Data/Logs/MyClass.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="32" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<logger additivity="false" name="MyNamespace.MyClass">
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender_MyClass" />
</logger>
And for completeness, it's called in the standard way documented within the AspNet Boilerplate documentation:
https://aspnetboilerplate.com/Pages/Documents/Logging
Way-1:
In this sample, the default log file is App_Data/Logs/Logs.txt.
But when I use the logger in the namespace MySite.Web.Controllers.PaymentController, the logs will be written in App_Data/Logs/PaymentLogs.txt
log4net.config
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
<file value="App_Data/Logs/Logs.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<appender name="RollingFileAppender_PaymentController" type="log4net.Appender.RollingFileAppender" >
<file value="App_Data/Logs/PaymentLogs.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="32" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<root>
<appender-ref ref="RollingFileAppender" />
<level value="DEBUG" />
</root>
<logger name="NHibernate">
<level value="WARN" />
</logger>
<logger name="MySite.Web.Controllers.PaymentController" additivity="false">
<appender-ref ref="RollingFileAppender_PaymentController" />
<level value="DEBUG" />
</logger>
</log4net>
Way-2:
You can get a specific logger by calling LogManager.GetLogger() with a appender name.
private static readonly ILog paymentLogger = LogManager.GetLogger("MySite.Web.Controllers.PaymentController");

Log4Net smtpappender is ignoring level filter

I'm using Log4Net for logging all different kinds of events in my application. Therefore I configured a fileAppender and a smtpAppender.
While the fileAppender is logging everything, the smptAppender should only send me an e-mail if the logging level is FATAL.
Right now, Log4Net is sending me e-mails for both ERROR and FATAL level.
That's my configuration:
<log4net>
<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Temp\xxx.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<maxSizeRollBackups value="150" />
<layout type="log4net.Layout.PatternLayout">
<header value="DateTime | Thread | Level | ClassName | Message" />
<conversionPattern value="%date | %thread | %-5level | %logger | %message%newline" />
</layout>
</appender>
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<filter type="log4net.Filter.LevelMatchFilter">
<acceptOnMatch value="true" />
<levelToMatch value="FATAL" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<to value="xxx" />
<from value="xxx" />
<subject value="Error" />
<smtpHost value="xxx" />
<bufferSize value="512" />
<lossy value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date | %thread | %-5level | %logger | %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="FileAppender" />
<appender-ref ref="SmtpAppender" />
</root>
</log4net>
I'm using the most recent Log4Net version[1.2.15] 2.0.5.
Curiously, the smptAppender is filtering the INFO and DEBUG level with this configuration.
Using the level evaluator or the level range instead of the level match filter didn't work either.
Level evaluator:
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="FATAL"/>
</evaluator>
Level range filter:
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="FATAL"/>
<param name="LevelMax" value="FATAL"/>
</filter>
I know that there are many threads about this topic here on stackOverflow, but none of them could help me with my problem.
Threads with the same topic:
How do I configure a log4net SmtpAppender to only send me e-mails when a certain level is hit?
Log4j2: SMTPAppender does not send mails with error or fatal level
Log4Net LevelEvaluator Ignored when bufferSize greater than 1 for SmtpAppender
well I know that this question is quite old, but I post this answer for others having this problem.
You are using the "lossy" and "bufferSize" settings. I guess that it is to get the last 512 events (not only the FATAL events) when the log is reaching a FATAL event.
Instead of using a LevelMatchFilter or a LevelEvaluator, can you simply test with a simple "threshold" (not in an evaluator).
See Why do Log4Net Filters Receive Messages Outside of the Evaluator Threshold? for more information.
But I think that in this case you will not have other events in the mail that you will receive, so the buffering would be useless.

How to log in Azure Webjob with Log4net?

I have a web project and a console project. I've published my web project on Azure (after having the console app attached as a Azure Webjob to the web project).
Now I want to use Log4net to log in files. It works for the web project but I can't get it to work for the Webjob...
Here is my log4net config :
<log4net>
<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="./_logs/[%date{yyyy-MM-dd-HH}]_webjob.log" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="4096KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<logger name="myloggername">
<level value="ALL" />
<appender-ref ref="FileAppender" />
</logger>
Some guy said it would work with a absolute path but it doesn't :
<file type="log4net.Util.PatternString" value="D:/home/site/wwwroot/App_Data/Logs/AccountMaintenance/log4net_%date{yyyyMMdd}.log" />
Please try the following value instead:
<file type="log4net.Util.PatternString" value="d:\home\logfiles\mylogfile.log" />

Is there a way to have log4net create log file only when there is logging activity?

We changed our log4net file name to include the current date but only want log files created on those dates that there is logged activity. This is our current configuration:
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="{0}\\logfiles\\log%date{{yyyyMMdd}}-${{COMPUTERNAME}}.log" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger %message%newline" />
</layout>
</appender>
<root>
<level value="WARN" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
It's producing empty files on days when the logger is created but no messages of WARN or greater are written. Is there a configuration to prevent empty files?

Missing date and extension with log4net

I've just downloaded log4net via NuGet in VS2010. Log4net version 1.2.11.0.
My issue - I can't append the date or extension to the file name.
Here's my appender:
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\Error" />
<appendToFile value="true" />
<datePattern value=".yyyy-MM-dd.lo\g" />
<rollingStyle value="Date" />
<filter type="log4net.Filter.LevelRangeFilter">
<acceptOnMatch value="true" />
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern
value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
</layout>
</appender>
The file is created in the correct directory (./Logs) with name "Error", no extension.
I've also tried datePattern ".yyyy-MM-dd.\l\o\g".
None of the other S.O. questions I've visited have helped. Any ideas?
Add the line
<staticLogFileName value="false" />
For details see
http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.StaticLogFileName.html

Resources