Log4net event log full - log4net

I am using log4net event log appender to log to event viewer and after I am getting the following exception:
Unable to write to event log using source source name Win32exception
event log is full.
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR"/>
<param name="LevelMax" value="ERROR"/>
</filter>
<!--The name of the application-->
<applicationName value="eventsource"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
Could you please let me know what will be the workaround for this?
Thanks,
Ajai

Right click the event name,go to properties ..check the appropriate option for "When maximum event log size is reached...

The error should be clear enough, your event log is full - so you gotta do something about that.
Either increase the size of your event log, or delete/clean up old events,
See http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/fn_fulllog.mspx?mfr=true and http://www.howtogeek.com/howto/windows/fixing-the-event-log-is-full-error-on-windows-xp/

Related

Maintaining the last N log entries in the log file (circular logging)

Does log4net support circular logging? (I think that's the right term.)
I want to maintain the last N entries in a log file. Say N=100. If I have 100 entries and then add a 101st, the desired behavior would be to delete the 1st entry from the top of the file and add the new log entry at the bottom, so that there is always 100 (or fewer) entries, with the oldest entry at the top and the newest at the bottom.
Basically, I want to record a couple of pieces of information to a file every minute. I only am interesting in seeing/keeping the last 100 entries. I could roll my own solution, but I'm already using log4net for logging other issues and was hoping I could use it for this purpose, as well.
Thanks
Out of the box solution would be RollingFileAppender with Size limit. You cannot specify how many entries you want to keep in the file, but if you play with the size (lets say 100KB), you can get what you want.
Here is an example:
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="0" />
<maximumFileSize value="100KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
And some documentation about why setting maxSizeRollBackups is important in this case:
If set to zero, then there will be no backup files and the log file
will be truncated when it reaches MaxFileSize.
MaxSizeRollBackups RollingMode

log4net RollingFileAppender, Filename of type Name.Date.ProcessId.log.N

We are using Log4Net in an asp.net service and would like to have the log files to be in the following format:
Name.Date.ProcessId.log.N
e.g. Service.20150123-09.776243.log.0
The RollingFileAppender needs to be of composite style to create new log file if either the date or size constraint is reached.
It's easy enough to have the processid first and then the date. We have that currently, but would prefer to have the date first so its easier to sort first by date.
I've tried various configuration but the nearest I could come up with is
Name.yyyyMMdd-HH.ProcessId.HH.log.N
<appender name="ServiceLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString">
<conversionPattern value="C:\Logs\Service.%date{yyyyMMdd-HH}.%processid" />
</file>
<param name="DatePattern" value=".HH.lo\g" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Composite" />
<param name="StaticLogFileName" value="false" />
<param name="MaximumFileSize" value="10MB" />
<param name="CountDirection" value="1" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d{MM/dd/yyyy HH:mm:ss fff},%X{Method},%X{TransID},%X{UserID},%X{DeviceID},%X{PID},%X{TH1},%m%n"/>
</layout>
</appender>
I need to have some valid date pattern in the DatePattern for it to work. Can't have just ".lo\g" there.
Adding the %processid in the DatePattern doesn't work.
But it would be ideal that way as we currently have a new log file every hour (because of our current DatePattern yyyyMMdd-HH). Probably variables in DatePattern won't work.
Setting the RollingStyle to "Size" makes above pattern work, but then new log files would be created based on Size and not Size and Date and we need it to be "composite".

Can I change/reduce the error level for a log in log4net?

I'm working with a third-party SDK that uses log4net. I don't want to completely exclude their items from the log; however, I don't want to constantly see these Error items in our logs either. Seeing them as Warnings or Infos, however, would be what I really want.
Is there any way to configure log4net to reduce the level of an alert so that it's not showing up as an error (within the .config file)?
Not something I have tried, but perhaps you could define a different conversionPattern for their classes with the level hard-coded.
ie, if your standard pattern is something like
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
then you could define theirs to be
<conversionPattern value="%date [%thread] WARN %logger %ndc - %message%newline" />
or maybe move their errorlevel to be part of the message, ie
<conversionPattern value="%date [%thread] WARN %logger %ndc - %-5level-%message%newline" />
The usual method of doing something like this is to configure their log to go to a different place (ie different file or database).
Yes you can, read the configuration manual here
http://logging.apache.org/log4net/release/manual/configuration.html
and make changes to your config file accordingly and show up logs which you want.

Log4Net + Send Email when done?

I have just started playing around with Log4Net... I now want to send an email with the full log either attached or directly in the mail. The problem with using SmtpAppender is that it requires a bufferSize which will be unknown because it should send the mail whether it's full of errors or just info.
Update: My config file
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<to value="ebb#mail.com" />
<from value="ebb#mail.com" />
<subject value="Backup Application - Log" />
<smtpHost value="mailserver" />
<authentication value="1" />
<username value="userName" />
<password value="mypw" />
<port value ="25"/>
<lossy value="true" />
<bufferSize value="500" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ALL"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%timestamp [%thread] %-5level %logger – %message%newline" />
</layout>
</appender>
BufferSize equals to the number of log messages that have to be buffered (ie if you set to 512 the mail will be sent once 512 messages have been collected).
I believe that setting it to int.MaxValue (which is 2.147.483.647) is a reasonable choice. 2 billions of messages are too much for a system, even long-running.
If you give me 10 minutes I'll confirm you (from source code) that if you clean stop your application, all logs collected so far will be sent
[Update]: confirmed!! Destructor flushes the queue as expected
[Add] I would remove both lossy and evaluator. Your problem is clear: Evaluator has precedence over buffer :) :)
The evaluator is used to flush the queue when a certain condition is met. Your condition equals to true. When this condition is triggered, the email is sent, so this is why the mail is sent at every single log call.
This is slightly different from sending ONLY info and error messages, which is achieved by log filtering.
Remove the two attributes and your code will work. Setting int.MaxValue will allow you to store the maximum possible number of messages. It's unlikely (you'd better win the Superenalotto's 178mln€ jackpot like some guys did tonight, or being hit by a comet in your head) that an application collects more than 2 billion errors/info in a run.

How do I configure log4j to start with some text and end with some text?

I'd like to make a log4j output file that is XML and give it a root element.
Hence, I'd like it to start with a tag and end with a tag.
What do I put in my log4j.xml to make this happen?
Right now, all I have is this:
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="logs/file.log" />
<param name="Append" value="false" />
<param name="MaxFileSize" value="5000KB" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
Change that PatternLayout to an org.apache.log4j.xml.XMLLayout.
Have a look at the api of XMLLayout:
http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/XMLLayout.html
It clearly explains that you need to include the resulting xml output within another document (by using xml entity). So in your parent document you can place a root element of your choice.
This will also allow you to use chain saw.

Resources