<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Kewley on Kode</title><link>http://insario.com/blog/jfk/</link><description>using System.Web.Stuff;</description><managingEditor>Josh Kewley</managingEditor><dc:language>en-US</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Josh Kewley</dc:creator><title>Setting the log file location at runtime with a DOM configured log4net</title><link>http://insario.com/blog/jfk/archive/2004/11/30/164.aspx</link><pubDate>Tue, 30 Nov 2004 09:49:00 GMT</pubDate><guid>http://insario.com/blog/jfk/archive/2004/11/30/164.aspx</guid><wfw:comment>http://insario.com/blog/jfk/comments/164.aspx</wfw:comment><comments>http://insario.com/blog/jfk/archive/2004/11/30/164.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://insario.com/blog/jfk/comments/commentRss/164.aspx</wfw:commentRss><trackback:ping>http://insario.com/blog/jfk/services/trackbacks/164.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;We use log4net 1.2 beta 8 in our web applications for tracing and debugging purposes. Log4Net is great, but as with any community project, you always wish it had built in functionality to do a few extra things. In our case, I wanted to be able to log all statements to a file in a folder that exists off the web root. By default, log4net will log to a file relative to the virtual directory where the application that is logging is defined. For example, the following log4net configuration will log to a file named TmsLog.txt in the same folder as the web.config that this entry exists in:&lt;/FONT&gt;&lt;/P&gt;
&lt;DIV class=cf&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;156&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;log4net&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;157&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;appender&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;name&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="TMSAppender"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;type&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="log4net.Appender.FileAppender,log4net"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;158&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;param&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;name&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="File"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;value&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="TmsLog.txt"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb1&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;159&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;param&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;name&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="AppendToFile"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;value&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="true"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb1&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;160&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;layout&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;type&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="log4net.Layout.PatternLayout,log4net"&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;161&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;param&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;name&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="ConversionPattern"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;value&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="%d %-5p - %m%n"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb1&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;162&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;layout&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;163&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;appender&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;164&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;root&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;165&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;priority&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;value&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="DEBUG"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb1&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;166&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;appender-ref&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;ref&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="TMSAppender"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb1&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;167&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;root&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;168&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN class=cb1&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;log4net&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;STYLE type=text/css&gt;
.cf { font-family: Courier New; font-size: 10pt; color: #000000; background: #ffffff; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt; }
.cl { margin: 0px; }
.cln { color: #008080; background: #ffffff; }
.cb1 { color: #0000ff; }
.cb2 { color: #800000; }
.cb3 { color: #ff00ff; }
.cb4 { color: #ff0000; }
&lt;/STYLE&gt;

&lt;P&gt;&lt;FONT face=Arial size=2&gt;I wanted to be able to specify the file location at run time, which lead me into a few traps.&lt;/FONT&gt; 
&lt;P&gt;&lt;FONT face=Arial size=2&gt;A coworker pointed out that I could simply use relative paths in the configuration file:&lt;/FONT&gt; 
&lt;DIV class=cf&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;158&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=cb2&gt;param&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;name&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="File"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb4&gt;value&lt;/SPAN&gt;&lt;SPAN class=cb1&gt;="..\\LogLocation\\TmsLog.txt"&lt;/SPAN&gt;&lt;SPAN class=cb3&gt; &lt;/SPAN&gt;&lt;SPAN class=cb1&gt;/&amp;gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;This is ok, but our Dev, QA, and Production environments are all a little different. We'd written a utility object that uses some logic to determine the current execution environment and return the correct folder to use for logging purposes. What I really wanted was to be able to use the information provided by this library to change the logging folder at runtime. One option was to create the configuration programmatically, but I wanted to stay with the basic DomConfigurator.Configure() solution.&lt;/FONT&gt; 
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The first programmatic solution that I tried was to change the file path at runtime. The following code does allow me to change the path of the configured path, but for some reason it didn't 'stick', and the path used in the configuration file was used instead: &lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial size=2&gt;
&lt;DIV class=cf&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;22&lt;/SPAN&gt;&amp;nbsp;ILog myLog=LogManager.GetLogger(&lt;SPAN class=cb1&gt;typeof&lt;/SPAN&gt;(Logger));&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;23&lt;/SPAN&gt;&amp;nbsp;ILoggerRepository aRepos = myLog.Logger.Repository;&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN class=cb1&gt;foreach&lt;/SPAN&gt;(IAppender anAppender &lt;SPAN class=cb1&gt;in&lt;/SPAN&gt; ((log4net.Repository.Hierarchy.Hierarchy)aRepos).Root.Appenders)&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;25&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;if&lt;/SPAN&gt; (anAppender &lt;SPAN class=cb1&gt;is&lt;/SPAN&gt; FileAppender)&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;26&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ((FileAppender)anAppender).File = @"c:\temp\test.txt";&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;27&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN class=cb1&gt;return&lt;/SPAN&gt; myLog;&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;My&amp;nbsp;shorthand approach to this was the following:&lt;/FONT&gt;&lt;FONT face=Arial size=2&gt; 
&lt;DIV class=cf&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;28&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN class=cb1&gt;public&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;static&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;string&lt;/SPAN&gt; LogFile&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;29&lt;/SPAN&gt;&amp;nbsp;{&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;30&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;get&lt;/SPAN&gt;{ &lt;SPAN class=cb1&gt;return&lt;/SPAN&gt; ((FileAppender)((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetLoggerRepository()).Root.Appenders[0]).File;}&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;31&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;set&lt;/SPAN&gt;{ ((FileAppender)((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetLoggerRepository()).Root.Appenders[0]).File = &lt;SPAN class=cb1&gt;value&lt;/SPAN&gt;;}&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;32&lt;/SPAN&gt;&amp;nbsp;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Again, no dice. Finally, after a little digging, I came across an email on the log4Net discussion list that pointed me in the right direction. I created my own FileAppender class that derived from the log4net FileAppender, and overwrote the File property:&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face=Arial size=2&gt;
&lt;DIV class=cf&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;76&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN class=cb1&gt;public&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;class&lt;/SPAN&gt; InsarioWebLogFileAppender : log4net.Appender.FileAppender&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;77&lt;/SPAN&gt;&amp;nbsp;{&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;78&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;public&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;override&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;string&lt;/SPAN&gt; File &lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;79&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;80&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;get&lt;/SPAN&gt;{&lt;SPAN class=cb1&gt;return&lt;/SPAN&gt; &lt;SPAN class=cb1&gt;base&lt;/SPAN&gt;.File;}&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;81&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class=cb1&gt;set&lt;/SPAN&gt;{&lt;SPAN class=cb1&gt;base&lt;/SPAN&gt;.File = Web.WebEnvironment.LogDirectory + &lt;SPAN class=cb1&gt;value&lt;/SPAN&gt;;}&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;82&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/PRE&gt;&lt;PRE class=cl&gt;&lt;SPAN class=cln&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;83&lt;/SPAN&gt;&amp;nbsp;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;!--EndFragment--&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Originally I tried to store the file setting in a local variable and return it in the getter but that didn't work, probably due to caching and optimization techniques used in the internals of log4net. Instead,&amp;nbsp;I&amp;nbsp;had to set the property on the base entity, as you see above.&lt;/FONT&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;img src ="http://insario.com/blog/jfk/aggbug/164.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Josh Kewley</dc:creator><title>New article on creating a plugin for UnleashIt</title><link>http://insario.com/blog/jfk/archive/2004/11/17/160.aspx</link><pubDate>Wed, 17 Nov 2004 15:20:00 GMT</pubDate><guid>http://insario.com/blog/jfk/archive/2004/11/17/160.aspx</guid><wfw:comment>http://insario.com/blog/jfk/comments/160.aspx</wfw:comment><comments>http://insario.com/blog/jfk/archive/2004/11/17/160.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://insario.com/blog/jfk/comments/commentRss/160.aspx</wfw:commentRss><trackback:ping>http://insario.com/blog/jfk/services/trackbacks/160.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;I just wrote an &lt;A href="http://insario.com/blog/jfk/articles/159.aspx"&gt;article &lt;/A&gt;that covers my experience building a plugin for &lt;A href="http://www.eworldui.net/UnleashIt/"&gt;UnleashIt &lt;/A&gt;this week. UnleashIt is a sweet utility that belongs in the toolbox of any .Net developer who is in charge of releasing updates. The new ability for the control to support plugins only adds to its value. Anyway, &lt;A href="http://insario.com/blog/jfk/articles/159.aspx"&gt;have a look at my article &lt;/A&gt;if you're interested.&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://insario.com/blog/jfk/aggbug/160.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Josh Kewley</dc:creator><title>PatternLayout modifiers in log4net</title><link>http://insario.com/blog/jfk/archive/2004/10/26/156.aspx</link><pubDate>Tue, 26 Oct 2004 19:05:00 GMT</pubDate><guid>http://insario.com/blog/jfk/archive/2004/10/26/156.aspx</guid><wfw:comment>http://insario.com/blog/jfk/comments/156.aspx</wfw:comment><comments>http://insario.com/blog/jfk/archive/2004/10/26/156.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://insario.com/blog/jfk/comments/commentRss/156.aspx</wfw:commentRss><trackback:ping>http://insario.com/blog/jfk/services/trackbacks/156.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;I was trying to implement log4net on a computer that didn't have the SDK installed recently and couldn't find information on how to format the output log on the web. This data comes from the log4net SDK - I figured I'd blog it for someone's future benefit...&lt;/FONT&gt;&lt;/P&gt;
&lt;TABLE cellSpacing=0 cellPadding=0 border=1&gt;
&lt;TBODY&gt;
&lt;TR vAlign=top&gt;
&lt;TH width="10%"&gt;&lt;FONT size=2&gt;Conversion Character&lt;/FONT&gt;&lt;/TH&gt;
&lt;TH width="90%"&gt;&lt;FONT size=2&gt;Effect&lt;/FONT&gt;&lt;/TH&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;a&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;FONT size=2&gt;Used to output the frienly name of the AppDomain where the logging event was generated.&lt;/FONT&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;c&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the logger of the logging event. The logger conversion specifier can be optionally followed by &lt;I&gt;precision specifier&lt;/I&gt;, that is a decimal constant in brackets.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;If a precision specifier is given, then only the corresponding number of right most components of the logger name will be printed. By default the logger name is printed in full.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;For example, for the logger name "a.b.c" the pattern &lt;B&gt;%c{2}&lt;/B&gt; will output "b.c".&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;C&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the fully qualified class name of the caller issuing the logging request. This conversion specifier can be optionally followed by &lt;I&gt;precision specifier&lt;/I&gt;, that is a decimal constant in brackets.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;If a precision specifier is given, then only the corresponding number of right most components of the class name will be printed. By default the class name is output in fully qualified form.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;For example, for the class name "log4net.Layout.PatternLayout", the pattern &lt;B&gt;%C{1}&lt;/B&gt; will output "PatternLayout".&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;B&gt;WARNING&lt;/B&gt; Generating the caller class information is slow. Thus, it's use should be avoided unless execution speed is not an issue.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;d&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the date of the logging event. The date conversion specifier may be followed by a &lt;I&gt;date format specifier&lt;/I&gt; enclosed between braces. For example, &lt;B&gt;%d{HH:mm:ss,fff}&lt;/B&gt; or &lt;B&gt;%d{dd MMM yyyy HH:mm:ss,fff}&lt;/B&gt;. If no date format specifier is given then ISO8601 format is assumed (ISO8601DateFormatter).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;The date format specifier admits the same syntax as the time pattern string of the ToString.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;For better results it is recommended to use the log4net date formatters. These can be specified using one of the strings "ABSOLUTE", "DATE" and "ISO8601" for specifying AbsoluteTimeDateFormatter, and respectively ISO8601DateFormatter. For example, &lt;B&gt;%d{ISO8601}&lt;/B&gt; or &lt;B&gt;%d{ABSOLUTE}&lt;/B&gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;These dedicated date formatters perform significantly better than ToString.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;F&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the file name where the logging request was issued.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;B&gt;WARNING&lt;/B&gt; Generating caller location information is extremely slow. It's use should be avoided unless execution speed is not an issue.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;l&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output location information of the caller which generated the logging event.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;The location information depends on the CLI implementation but usually consists of the fully qualified name of the calling method followed by the callers source the file name and line number between parentheses.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;The location information can be very useful. However, it's generation is &lt;B&gt;extremely&lt;/B&gt; slow. It's use should be avoided unless execution speed is not an issue.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;L&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the line number from where the logging request was issued.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;B&gt;WARNING&lt;/B&gt; Generating caller location information is extremely slow. It's use should be avoided unless execution speed is not an issue.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;m&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the application supplied message associated with the logging event.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;M&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the method name where the logging request was issued.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;B&gt;WARNING&lt;/B&gt; Generating caller location information is extremely slow. It's use should be avoided unless execution speed is not an issue.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;n&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Outputs the platform dependent line separator character or characters.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;This conversion character offers practically the same performance as using non-portable line separator strings such as "\n", or "\r\n". Thus, it is the preferred way of specifying a line separator.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;p&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the level of the logging event.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;P&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the an event specific property. The key to lookup must be specified within braces and directly following the pattern specifier, e.g. &lt;CODE&gt;%X{user}&lt;/CODE&gt; would include the value from the property that is keyed by the string 'user'. Each property value that is to be included in the log must be specified separately. Properties are added to events by loggers or appenders. By default no properties are defined.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;r&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the number of milliseconds elapsed since the start of the application until the creation of the logging event.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;t&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the name of the thread that generated the logging event. Uses the thread number if no name is available.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;u&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the user name for the currently active user (Principal.Identity.Name).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;B&gt;WARNING&lt;/B&gt; Generating caller information is extremely slow. It's use should be avoided unless execution speed is not an issue.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;W&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the WindowsIdentity for the currently active user.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;B&gt;WARNING&lt;/B&gt; Generating caller WindowsIdentity information is extremely slow. It's use should be avoided unless execution speed is not an issue.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;x&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the NDC (nested diagnostic context) associated with the thread that generated the logging event.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;X&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;Used to output the MDC (mapped diagnostic context) associated with the thread that generated the logging event. The key to lookup must be specified within braces and directly following the pattern specifier, e.g. &lt;CODE&gt;%X{user}&lt;/CODE&gt; would include the value from the MDC that is keyed by the string 'user'. Each MDC value that is to be included in the log must be specified separately.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR vAlign=top&gt;
&lt;TD align=middle&gt;&lt;FONT size=2&gt;%&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P&gt;&lt;FONT size=2&gt;The sequence %% outputs a single percent sign.&lt;/FONT&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;img src ="http://insario.com/blog/jfk/aggbug/156.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Josh Kewley</dc:creator><title>DNN Skinning - style-sheets &amp; testing</title><link>http://insario.com/blog/jfk/archive/2004/09/07/147.aspx</link><pubDate>Tue, 07 Sep 2004 07:25:00 GMT</pubDate><guid>http://insario.com/blog/jfk/archive/2004/09/07/147.aspx</guid><wfw:comment>http://insario.com/blog/jfk/comments/147.aspx</wfw:comment><comments>http://insario.com/blog/jfk/archive/2004/09/07/147.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://insario.com/blog/jfk/comments/commentRss/147.aspx</wfw:commentRss><trackback:ping>http://insario.com/blog/jfk/services/trackbacks/147.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;I spent some time this weekend on a personal project, trying to fit a web site template that I purchased from &lt;A href="http://www.templatemonster.com/"&gt;TemplateMonster.com&lt;/A&gt; into a &lt;A href="http://www.dotnetnuke.com/"&gt;DotNetNuke&lt;/A&gt; portal. &lt;A href="http://www.templatemonster.com/website-templates/5180.html"&gt;The template &lt;/A&gt;that I was trying to adapt appeared to me to be a good candidate for a portal-type framework, and an opportunity to try out some of the portal and container skinning features. &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;The first thing I did was read the skinning documentation that came with DotNetNuke. It's decent documentation, but&amp;nbsp;the problem is that it touches on so many items&amp;nbsp;that it&amp;nbsp;tends to leave a number of unanswered questions about specifics.&amp;nbsp;I hacked around the generated HTML for a portal page and eventually came up with a better understanding of a few things:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Don't include references to your style-sheets in your skin and container skin pages. I included these references while building the individual HTML files, and ended up leaving them in during publish. This isn't necessary. as DotNetNuke will put the css files in known locations and include {link} tags that make reference to them in the appropriate locations. Including a style-sheet reference in your container template will result in a style-sheet reference per container on your rendered portal page, which screws up the by-design hierarchy of styles.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Don't include {body} or {head} references in your skin HTML files. Again, I had inserted them during the testing phase of my HTML build out. Leaving them in resulted in multiple {body} tags in the rendered portal page. You can (should) achieve the same results that you seek from this type of approach if you:&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Learn the built in CSS entities. The portal and containers render with pre-determined class names in various places. You must learn what they are in order to accurately build out your site. Rather than combing through the rendered HTML for class references that are not your own, instead refer to &lt;INSTALL point&gt;{install point}\Portals\_default\portal.css and {install point}\Portals\_default\Skins\DNN\skin.css. Some notes:&lt;/FONT&gt; 
&lt;UL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;Each portal page renders the style-sheets in the following order:&lt;/FONT&gt; 
&lt;OL&gt;
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;&lt;INSTALL point&gt;{install point}\Portals\_default\default.css - the default install template. If you're trying to figure out there are still dark backgrounds on your portal, it's probably because you didn't override a property in this style-sheet.&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;&lt;INSTALL point&gt;{install point}\Portals\{active portal}\&lt;ACTIVE portal&gt;skins{\active skin}\&lt;ACTIVE skin&gt;skin.css. This is the skin.css that you uploaded with your skin package&lt;/FONT&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;&lt;INSTALL point&gt;{install point}\Portals\{active portal}\&lt;ACTIVE portal&gt;containers\{active portal container}\c&lt;ACTIVE portal container&gt;ontainer.css. This is the style-sheet of the default&amp;nbsp;container assigned to the portal&lt;/FONT&gt;&lt;FONT face=Arial size=2&gt; 
&lt;LI&gt;&lt;FONT face=Arial size=2&gt;&lt;INSTALL point&gt;{install point}\Portals\{active portal}\&lt;ACTIVE portal&gt;portal.css - Set n portal admin / Site Settings from an available skin's style-sheet&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;LI&gt;The style that is defined closest to the bottom of the list above will be the style that renders. For instance, if you define .Head (the style for the header bar on a container) in your container or skin, it will override the default setting that is defined in the default.css file. 
&lt;LI&gt;The SolPartMenu global menu has a large number of settings that you can override in the .XML file that accompanies your skin or container package. That process is a pain - the quick approach for simply trying to get it to look right is to override the Menu settings in your skin css file. Refer to the css class names at the bottom of the {install point}\Portals\_default\Skins\DNN\skin.css file&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;My approach was to upload the skin and container, then open the four files referenced above and edit/save/refresh to see how the site was affected by css tweaks. When I got to a point where I felt comfortable with the rendered page, I'd update the container package with the new css file and re-upload it. 
&lt;LI&gt;In order to help target specific page locations, I assigned IDs to some of the table rows in my container HTML file. This let me do things like define a style for a generic HTML entity such as a within a specific page area, like one named #GreenContainerContent 
&lt;LI&gt;Handle the spacing between your portal elements at the skin level. One-off nudging of space between containers with borders on the container.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;All in all the framework that supports skinning is pretty good. I think I'll post some more in the near future about how the styles on the SolPartMenu work.&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://insario.com/blog/jfk/aggbug/147.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Josh Kewley</dc:creator><title>Publishing .Text to a hosting environment</title><link>http://insario.com/blog/jfk/archive/2004/09/03/145.aspx</link><pubDate>Fri, 03 Sep 2004 20:59:00 GMT</pubDate><guid>http://insario.com/blog/jfk/archive/2004/09/03/145.aspx</guid><wfw:comment>http://insario.com/blog/jfk/comments/145.aspx</wfw:comment><comments>http://insario.com/blog/jfk/archive/2004/09/03/145.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://insario.com/blog/jfk/comments/commentRss/145.aspx</wfw:commentRss><trackback:ping>http://insario.com/blog/jfk/services/trackbacks/145.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT face=Arial size=2&gt;I spent some time this afternoon publishing this install of &lt;A href="http://scottwater.com/blog/"&gt;DotText&lt;/A&gt; to our production hosting environment. It all went fairly well, but I experienced a couple of gotchas that I want to document for future reference. In hindsight, these seem like simple solutions, but it's usually the simple problems that end up taking the longest to solve, because in the back of my mind, I know they should be easy to solve... Anyway:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;We host with &lt;A href="http://www.intermedia.net/"&gt;Intermedia.net&lt;/A&gt;, a fairly decent provider who has served us well over the years. We have a shared hosting plan on a Windows 2003 box, along with a number of databases on a shared SQL server. Publishing .Net apps to their servers, however, has always been a PITA. After mucking with it time and time again, I finally came up with a way to publish sub-applications underneath our main virtual directory.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;&lt;U&gt;Converting from Single to Multiple Blogs&lt;/U&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face=Arial size=2&gt;To give our employees the option of hosting their own blogs, I decided to go with the &lt;A href="http://dottextwiki.scottwater.com/default.aspx/Dottext.BasicConfiguration"&gt;MultipleBlogConfig &lt;/A&gt;option. As you can see from the URL of this Weblog, I installed the DotText application on a virtual called blog. My first&amp;nbsp;foray into DotText (having a non-alpha character in the name of the app (.Text) is kind of annoying, no?) was with the source code for version 0.95. I fired up the solution in Visual Studio, and began reading through the code and the &lt;A href="http://dottextwiki.scottwater.com/"&gt;DotTextWiki &lt;/A&gt;(which is a little weak on content). My first problem was that my initial trials with DotText were on localhost with a SingleBlogConfig. I grabbed the web.config sample Single2_Web config. When it came to publish to production, I had to convert from a single blog to multiple blog. Looking through the documentation, I made a few changes, including changing the BlogConfigurationSettings,&amp;nbsp;Connection string, email settings, and Aggregate settings (thanks to &lt;A href="http://www.dnncart.com/blogs/christoc/articles/197.aspx"&gt;Chris's post&lt;/A&gt; for some highlights). When I published to production and the jfk blog served up a blank page, I spent some time figuring out that the &lt;STRONG&gt;&lt;EM&gt;MultipleBlogConfig settings have different HttpHandler patterns defined&lt;/EM&gt;&lt;/STRONG&gt;. If you are going through a conversion from a single blog on a virtual to a multiple blog on a virtual, copy that section from Multiple2_Web.config over.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;STRONG&gt;&lt;U&gt;&lt;FONT size=3&gt;Problems with the admin area when deploying .Text &lt;BR&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;/STRONG&gt;The next problem I had came from the way that I deployed the application to production. I used VS.Net to do a copy web to our production servers. When I submitted my login info to the site, I kept getting errors in DotText that indicated that the app couldn't find the requested page. /blog/jfk/login.aspx was directing me to /blog/jfk/admin/default.aspx. After FTPing to the prod server, I saw that there was no /admin folder under /blog or /blog/jfk, and the DotText.Admin.Web was also missing form the /bin directory.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;It turns out that the DotText VS.Net project is setup with the /admin subdirectory as a class library in a separate project, which points to an excluded directory under the DotTextWeb folder. Because of this, VS.Net copy web doesn't work properly - you have to manually FTP out the aspx pages and the admin assembly underneath your virtual (/blog/admin, in my case) in order to get the admin area to work. Maybe this is documented somewhere, but I couldn't find it.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;Anyway, now that this thing is installed and working (we'll see what happens when I submit this), I'm looking forward to capturing my discoveries in the world of .Net, and documenting the cool stuff I run across. Sorry, but I'll probably also be blogging politics, especially as the November election draws closer.&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://insario.com/blog/jfk/aggbug/145.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>