Skip to main content

Monitoring Log Files

Log files are funny things. They can contain lots of useful information but they can also be a frustrating experience to understand and read. 

Typically when an error occurs in an application there will usually be an entry in a log file. So in the current application I am testing, I know that when I see an unhandled exception in the UI there will be an entry in the log file which will tell me why and where the error occurred.

So imagine my surprise when during a testing session in which I was  looking for a particular entry in a log file, I noticed that there was an error and I realised that at that time I had not noticed any strange or peculiar behaviour in the UI. This got me thinking about how I can find bugs that do not manifest themselves in the UI......  

Now at the time we didn't have any log file analysis tools like Splunk and after seeing the error in the logs I thought it would be a good idea to some how monitor the log files. Now complex enterprise analysis tools like Splunk were a no no so I had to think of something else. I narrowed it down to the following:

1) Write my own log file analysis tools using C#

2) Extend our existing Log4Net configuration

Option 1 was a possibility but having a 2 year old did not give me the time I needed to write one in my spare time, so option 2 was the option I decided to go with. 

Now having no Log4Net experience meant I had to go and do some research. So after speaking to some of the developers and doing a bit of Googling I managed to come up with the changes needed. 

So before I explain the changes I made here is some background information on Log4Net

1) It a tool to help the programmer output log statements to a variety of output targets.

2) It has the concept of loggers and these lie at the heart of Log4Nets configuration. Loggers are organised into a hierarchy and give the programmer run-time control on which logging statements are printed or not. Loggers are assigned levels through the configuration of log4net. A log statement is routed through to the appender depending on its level and its logger.


3) You can add additional Appenders to create new logging. You need to add an appender so Log4Net knows where to store your log messages. An appender is a C# class that can transform a log message, including its properties, and persist it somewhere


4) Log4Net has different levels of logging and these are:
  • ALL
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF
The changes I made

So after thinking about what I wanted to achieve out of this I decided to make the following changes:

- Write all levels above (and including) WARN to a new log file
- Add a new appender to email me when the levels above (and including) WARN occur in the log file.

Here is the config that I added:


<root>        <appender name="WarningAndErrorAppender" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="WARN" />
      </filter>
      <file value="../log/WarningsAndErrors.txt" />
      <appendToFile value="true" />
      <maxSizeRollBackups value="500" />
      <maximumFileSize value="20MB" />
      <rollingStyle value="Composite" />
      <datePattern value="-yyyy-MM-dd" />
      <preserveLogFileNameExtension value="true" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <header value="[Log Start]&#xA;" />
        <footer value="[Log End]&#xA;" />
        <conversionPattern value="%date [%thread] [%property{user}] [%property{request}] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="EmailAppender" type="log4net.Appender.SmtpAppender">
<filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="WARN" />
      </filter>
         <to value="<EMail address>" />
    <from value="<EMail address>" />
    <subject value="WARNING OR ERROR IN LOGS" />
    <smtpHost value="<SMTP value>" />
    <bufferSize value="512" />
    <lossy value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <header value="[Log Start]&#xA;" />
        <footer value="[Log End]&#xA;" />
        <conversionPattern value="%date [%thread] [%property{user}] [%property{request}] %-5level %logger - %message%newline" />
      </layout>
    </appender>
</root>



So how did this help me?
  • Found issues that did not manifest themselves in the UI that otherwise I may not of realised had occurred.
  • When I was notified of an issue in the log file I was more easily able to note down the exact steps that were performed as the email notified me relatively soon after the error in the log file occurred.
  • Taught me that you can use an exciting tool to aids testing and that you don't need to buy something in. OK it may not be exactly what you want but if it adds value to your testing then it is worth it. 
Extending the configuration

I extended this by writing a PowerShell script that makes the changes to the log file automatically. This script was then run during deployment of the application to the sever and it meant that  I had extra log file analysis without have to do anything manually. 

So there you have it, a simple solution that has added value to my testing and helped catch issues that may not of been immediately obvious.











Comments

Popular posts from this blog

Testing and Mindfulness

How aware are you? Do you live in the here and now or is your mind always somewhere else? This blog post is about Mindfulness. Mindfulness is a simple meditation and is defined as (According to Wikipedia): "The intentional, accepting and non-judgemental focus of one's attention on the emotions, thoughts and sensations occurring in the present moment" Now Mindfulness has become more popular in the west in recent years as it has shown to have benefits for people who are suffering from Depression and Anxiety. It has been around for a while and is often thought to of originated from Buddhism and some people believe it started thousands of years ago. Now modern life is hectic and I’m sure we all have lots of things going on in our lives that keep our Brains busy and trying to focus on one thing at a time can be a challenge. I can't remember the number of times I've been doing something and my mind is somewhere else entirely. Mindfuln...

How to deal with pauses and timeouts in specflow

So this blogpost is in response to the weekly Specflow blog posts and challenges that have been written by Gojko Adzic. This weeks challenge was how would you rewrite or rephrase the below scenario: Given a user registers successfully When the account page reloads And the user waits 2 seconds Then the account page displays "Account approved" My initial though was something like this: Given a user registers successfully  When the account page reloads   Then the account page is displayed within a satisfactory time period     And the account page displays "Account Approved" Now the problem with this scenario is what defines a satisfactory time? You could add it as a comment or in a scenario outline but over time the time a user waits could change and if this is updated in the code behind but the scenario outline or comments are not, then what the test does and what is described do not match - this would potentially cause issues in the future. My next ide...

Building a test strategy for a new team

Teams, we have all been on them. Some are good and some are bad. Some we never wanted to leave and others we probably couldn't wait to leave. Now most of the time (well in my experience anyway) you tend to get put into a team that already exists. Maybe you are a new hire or maybe you have asked to change to a different product team.  When you do this, more than likely there will already be a testing strategy in place. It may be that you adapt it and change it in any way you see fit to improve the testing. But imagine if everyone on the team was new? How would you decide your testing strategy? This post will go through some useful things you can do to help a new team develop a test strategy. Table of Contents πŸ“ˆ What is a Test Strategy? πŸ€” Where should I start? 🎯 Understand the company and their goals πŸ’ͺ Play to the teams strengths πŸ‘️‍πŸ—¨️ Understand what quality looks like πŸ“ Understand Scope πŸ§ͺ Understand the type of tests you need πŸ“Š Measure your success 🀝 Collaborate πŸ“ Summar...