Skip to main content

Logging in Selenium - To File

In my previous post I explained you how you can configure log4net in your project to do logging to console with example.

Now, in this post I will be explaining how we can configure log4net to log to file instead of console. As we already have working logs to console from our TestFramework so logging to file doesn't take much efforts. You just need to follow below steps and you are done.

Configuring log4net to log to file

Step 1: Add an "app.config" file in your UITests project with content as shown below:


Step 2:  Change configurator in Configure method of Log class


That's it. Now, when you will run the test it will log to console as well as file named "Test.log". This file can be found at \TestFramework\UITests\bin\Debug location in you project folder.

As you saw, we just added app.config file and then changed the configurator in order to log to file. Earlier we used "BasicConfigurator.Configure()" which writes logs to console only.

In app.config file, you can see that that I have used two types of appenders i.e. "RollingFileAppender" and "ConsoleAppender" so that we can write our logs to file as well as to console.

Configuration log4net in app.config:

In app.config file we can add appender nodes as required. There are few appenders which are generally used:
  • FileAppender
  • RollingFileAppender
  • ConsoleAppender

"ConsoleAppender" is used to append logs to console. By default, all output is written to the console's standard output stream.



"FileAppender" can be used to append logging events to a file. If this appender is used then logs will be written to a file util it reaches it's max size. After that it will start just overwrite the content to same file i.e. old logs will be lost.

"RollingFileAppender" is used to overcome above limitation. roll log files based on size or date or both depending on the setting. Log file will be rolled once its size exceeds the maximum defined size or based on date boudary specified. In this case you won't lose your logs. This appender is preferred over FileAppender if your application is going to do lot of logging.



You can check details of these appenders and other appenders from this link if you need to learn.


In root logger we can define the logger levels and it's appenders.



Layout pattern for logging:

It is important to have logs written but what's more important is how and what is being written. Here comes the use of "layout". This is the one with which you can define what you want to log and how it should look.



Through this value property you can define the what and how of logs. In this example, we are generating log having first datetime ("%d") then logging level (%-5level) then class name (%type{1}) then called method (%M) then message (%message) and at last newline for generating next log in new line (%newline).

You can define your own format based on your requirement. If you want to learn more about these patterns then you can read it from here.

In my next post I will be adding one more test to our TestFramework with a proper test structure i.e. we will refactor our project too so that all our tests are properly structured with all required methods.



Thanks for reading this post. See you in next post. Cya.



Comments

Popular posts from this blog

Logging in Selenium

Any application is incomplete until it's activities are traceable. Here comes the use of logging. By logging important actions you can later on track anything you want especially when there are some error situations. It becomes easy to debug the issues if logs are generated properly. Similarly, it is very important that our automation framework generates logs so that whenever any test fails, we can track the issue by tracing it's logs. In this post, I will be explaining you how we can log using log4net in selenium. Before using methods of this library we need to configure this to our application. Let's do this first then. Configuring log4net in selenium: First of all you need to download this library so that this can be used. You can read about log4net and then download it from this link and save the dll file after extracting it to folder that is under your project folder. After downloading this library you need to add references of this in you project. To do ...

SELENIUM: Using Nested Classes

In this post I will be using nested class pattern to make few things easier. e.g. If you see in our test application there is a navigation bar on left side containing various menus i.e. Posts, Pages etc. Further each main menu contains sub-menu e.g. Posts menu contains sub-menues as "All Posts", "Add New", "Categories" and "Tags". In this type of situations, it is good to use nested classes to make things more readable and easy to use. E.g. Suppose I want to access "All Posts" navigation then I would want this to be done like this. " LeftNavigation.Posts.AllPosts.Select(); " i.e. I would want that there would be a class called "LeftNavigation" and when I press '.' (dot) it shows all the main menues in this navigation e.g. "All Posts", "Pages" etc. then I choose " LeftNavigation.Posts " and again when press '.' it shows all the sub-menues inside this Posts menu...

SELENIUM: Using Common Methods in Different Tests

As I mentioned in my previous post that we will create few more tests which will make use of the nested navigation class and common menu selector class to see how we can make use of these. So, let create one more test to check some other navigation e.g. navigating to "Add New" page and to implement this we will make use of the same navigation class and menu selector class. About test: In this test we will write code to implement below steps: Navigate to login page Login to application Navigate to Posts->Add New post page Confirm that we are on right page Again, we are already familiar with step 1 and 2 so, we will be focusing step 3 and 4 only. Before we start writing code for this test let's go through some of the refactoring that is needed MenuSelector class's select methods created in previous post. MenuSelector class created in previous past: We will be refactoring below areas in this class: #1: Used WebDriverWait #2: Removed browser.W...