Apr 21, 2015

Repost - Web development learning resources on the web recommended by Pro's

http://uptodate.frontendrescue.org/#get-your-own-sources

http://www.paulirish.com/2011/web-browser-frontend-and-standards-feeds-to-follow/

Feb 26, 2015

Log4Net - Tips

In log4net.xml you define level of messages you wish to log.

  <root>
    <!-- OFF, FATAL, ERROR, WARN, DEBUG, INFO, ALL -->
    <level value="WARN" />
    <appender-ref ref="FileAppender" />
  </root>

Question is how to properly use these levels in your code?
The provided comment is incorrect.
Here is the correct hierarchy of levels order from most important to least important.:

FATAL
ERROR
WARN
DEBUG
INFO

Idea is when for example you set FATAL level ONLY log.Fatal methods will finish in your log and nothing else.
For ERROR level you will get ERROR + FATAL.
With WARN you have WARN + ERROR + FATAL.

Etc.  you got idea.


Some people use provided helpers: 

IsInfoEnabled()
IsDebugEnabled()

etc. 
If you DO NOT place some time consuming activity in your log.Info   statement forget it, you don't need it!
Log.Info will determine based on LEVEL from XML should it or should it not get written into log. Idea is with IsInfoEnabled() to suppress even start of execution log.Info().

Make different logging level for different types

When you create your logger instance in every type make sure to use typeof so that you can reference it, when needed, in Log4Net.xml as specific appender for that type.

readonly ILog log = LogManager.GetLogger(typeof(TypeName));

Watch it ! When configuring logging for specific type:

<logger name="MyNameSpace.MyType">
     <level value="DEBUG"/>
</logger>

; make sure to make fully qualify name for type including namespace.

Log different types in different log files

For example you wish to make logs for specific .NET type in different log apart from main.

Make specific new Appender in new log file :

<appender name="HelperAppender" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="helper.log"/>
    <param name="DatePattern" value="yyyy.MM.dd" />
    <param name="RollingStyle" value="Size" />
    <param name="maxSizeRollBackups" value="10" />
    <param name="maximumFileSize" value="100KB" />
    <layout type="log4net.Layout.PatternLayout">
      <param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss ffff} [%-3t] %-5p %logger{1}.%method: %message%newline" />
    </layout>  
  </appender>

Create new logger section with fully qualified .NET type name you wish to log and reference to above created Appender:

  <logger name="Log4NetTest.Helper">
    <level value="INFO"/>
    <appender-ref ref="HelperAppender"/>
  </logger>


Nov 11, 2014

ASP.NET WebForms - propagating control events up in chain - bubbling

When making complex web forms pages with nested custom control sooner or later you will want centralized management of events raised by controls.
This is oldie but works:

Bubbling an Event

Oct 16, 2014

DotNetNuke - T-SQL manually update to clear password for known user name

DotNetNuke - T-SQL manually update to clear password for known user name

declare @password as varchar(100)
declare @username as varchar(100)
set @password = 'xxxxx'
set @username = 'yyyyy'
begin tran
update aspnet_Membership set
[Password] = @password,
PasswordFormat = 0
where UserId in
(select top 1 UserId from aspnet_Users where UserName = @username)
commit

DotNetNuke - SiteLog T-SQL for deleting everything except newest 100000 rows

DotNetNuke
Unless you master the art of DotNetNuke logging engine most dreadful feature of DNN is its vast log tables which tends to skyrocket size of DNN databases.
This script is no legit solution you should understand and properly configure DNN logging but until then it does the job...

select * into sitelog100000 from SiteLog s
where s.SiteLogId in (
select top 100000 SiteLogId from SiteLog order by SiteLogId desc)
truncate table sitelog


--select * from sitelog100000
set identity_insert sitelog on
INSERT INTO [dbo].[SiteLog]
           ( SiteLogId, [DateTime]
           ,[PortalId]
           ,[UserId]
           ,[Referrer]
           ,[Url]
           ,[UserAgent]
           ,[UserHostAddress]
           ,[UserHostName]
           ,[TabId]
           ,[AffiliateId])
select * from sitelog100000
set identity_insert sitelog off
drop table sitelog100000