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()
{
IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore
(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
var fullIsolatedPath = isoStore.GetType().GetField
("m_RootDir", BindingFlags.NonPublic |
BindingFlags.Instance).GetValue(isoStore).ToString();
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>