How To Do Logging In Asp.net MVC
Today, I want to talk about logging mechanism in asp.net. We can do it in several ways. I use log4net to implement logging in my Mvc web projects.
First, we must add Log4net package from NuGet Package Manager to our ASP.NET MVC project as per the below screen.
After installing, you need to add this code to your Global.asax file .
1 |
log4net.Config.XmlConfigurator.Configure(); |
Then we have to add log4net configuration to web.config.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
<appSettings> <add key="log4net.Internal.Debug" value="true" /> <add key="LogLevel" value="1" /> </appSettings> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net debug="true"> <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="logs\log.txt" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="100KB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> </layout> </appender> <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNetAppender"> <connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> <connectionString value="Data Source=192.168.1.100:1521/ORACLE;User ID=USERID;Password=PASS" /> <commandText value="INSERT INTO LOG(LOG_DATE,THREAD,LOG_LEVEL,LOGGER,MESSAGE,USER_NAME) VALUES (:log_date, :thread, :log_level, :logger, :message, :userName)" /> <bufferSize value="1" /> <parameter> <parameterName value=":log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value=":thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value=":log_level" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value=":logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value=":message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value=":userName" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{UserName}" /> </layout> </parameter> </appender> <root> <level value="ALL" /> <appender-ref ref="AdoNetAppender_Oracle" /> </root> </log4net> |
After configuring, we will add logging as an attribute to use it in every classes we need. Add this class to your project.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using log4net; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Web; using System.Web.Mvc; namespace YourNameSpace.App_Start { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public class LoggerAttribute : ActionFilterAttribute { private static ILog _objLog4Net; private string logLevel = string.Empty; public override void OnActionExecuting(ActionExecutingContext filterContext) { var ctlName = filterContext.RouteData.Values["controller"].ToString(); _objLog4Net = AppManager.GetLogger(ctlName);//LogManager.GetLogger(filterContext.RouteData.Values["controller"].ToString()); logLevel = AppManager.GetLogLevel(); var user = (UserModel)HttpContext.Current.Session["User"]; var userName = ""; if (user != null) userName = user.UserName; GlobalContext.Properties["UserName"] = userName; } public override void OnActionExecuted(ActionExecutedContext filterContext) { var ctlName = filterContext.RouteData.Values["controller"].ToString(); _objLog4Net = AppManager.GetLogger(ctlName); logLevel = AppManager.GetLogLevel(); if (logLevel == "1") { _objLog4Net.Debug(string.Concat(filterContext.Controller.GetType().ToString(), "'s ", filterContext.ActionDescriptor.ActionName, " method worked.")); } } } } |
And add this code to your AppManager.class
1 2 3 4 5 6 7 8 9 |
public static ILog GetLogger(string name) { return LogManager.GetLogger(name) } public static string GetLogLevel() { return ConfigurationManager.AppSettings["LogLevel"].ToLower().ToString(); } |
At the end we will add Logger attribute to our controllers we want to use.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using log4net; namespace Abc.Controllers { [Logger] public class LoginController : Controller { private static ILog _logger; public ActionResult Login() { _logger = AppManager.GetLogger(RouteData.Values["controller"].ToString()); var user = (UserModel)HttpContext.Session["User"]; ViewBag.UserName = user; if (user != null) { return RedirectToAction("Index", "Home"); } return PartialView("Login"); } public ActionResult Login(User user) { try { // ... login code here ... return RedirectToAction("Index", "Home"); } catch (Exception) { _logger.Error("Login Error, control your login name and password."); return PartialView("Login"); } } } |
You should have a look at my another post about Caching In Asp.Net MVC
If you have question do not forget to write from the chat button next to it or from the comment.
1 Response
[…] Output caching allows you to store the output of a particular controller action in memory. Then the ASP.net engine can respond to future requests for the same action just by giving back the cached result. You should have a look at my another post about Logging In Asp.Net MVC […]