Isolated Storage using Log4Net
IsolatedStorage with Log4Net
Introduction
This tip explains how to set the custom IsolatedStorage
location for storing the log files when using the log4Net.
Background
Generally, in any application, we have a custom location where we keep the log files. However, if there is a business requirement that we need to have a isolated storage location (User Name specific), then the common configured location path will not be useful.
Like for example, I can have a static logger directory path configured in web.config / app.config file like this:
<appSettings>
<add key="MyLoggerFile" value="C:\MyApplicationDirectory\SystemLog\MyLogFile.log"/>
<appSettings/>
What if we want a dynamic logger location specific to the user who has logged into the machine.
Something like this:
For Windows 7 Users:
C:\Users\TapasU\AppData\Local\MyProject\SystemLog\TapasU-MyLogFile.log
For Windows XP Users:
C:\Documents and Settings\TapasU\Local Settings\Application Data\
MyProject\SystemLog\TapasU-MyLogFile.log
If you are familiar with log4Net and want to log to such user specific location, then you need to add the following configSections
in the web.config / app.config file.
Sample CS code to update the user specific log dorectory is given below:
Program.cs or Any .cs
static void Main(string[] args)
{
SetLoggerPath();
log4net.ILog log = log4net.LogManager.GetLogger
(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log4net.Config.XmlConfigurator.Configure();
log.Debug("Log Me Started...");
log.Debug("Log Me End...");
}
private static void SetLoggerPath()
{
// Creates the isolated storage
IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore
(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
// Gets full path of isolated Storage
var fullIsolatedPath = isoStore.GetType().GetField
("m_RootDir", BindingFlags.NonPublic |
BindingFlags.Instance).GetValue(isoStore).ToString();
// Modify the isolated storage path for application
log4net.GlobalContext.Properties["IsolatedStoragePath"] =
fullIsolatedPath.Substring(0,
fullIsolatedPath.LastIndexOf(@"\IsolatedStorage\"));
log4net.GlobalContext.Properties["UserName"] = Environment.UserName;
log4net.GlobalContext.Properties["loggedTime"] =
DateTime.Now.Date.ToString("MMddyyyy");
}
Web.config / app.config
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="MyRollingFileAppender" />
</root>
<appender name="MyRollingFileAppender"
type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString"
value="%property{IsolatedStoragePath}\
SystemLog\ErrLog-%property{UserName}-%property{loggedTime}.log"/>
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread]
%level %logger - %message%newline" />
</layout>
<rollingStyle value="Date" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="10MB" />
</appender>
</log4net>
<startup>
<supportedRuntime version="v4.0"
sku=".NETFramework,Version=v4.0"/>
</startup>
<appSettings>
<add key="MyLoggerFile"
value="C:\MyApplicationDirectory\SystemLog\MyLogFile.log"/>
</appSettings>
</configuration>