c# - log4net fallback appender configuration in case of missing config file? -
i've got c# (.net 3.5) application extensively use log4net. log4net configuration resides in app.config
file.
configuration done using [assembly: xmlconfigurator(watch = true)]
in assemlyinfo.cs
app uses single application-wide logger instance, instantiated in static constructor of logger wrapper class:
public class logger{ //.... private static readonly ilog logger; static logger() { logger = logmanager.getlogger(assembly.getentryassembly().getname().name); appdomain.currentdomain.unhandledexception += onunhandledexception; } //.... }
the app designed run on distant server, scheduler, no human presense, alone in dark. :) problem is, in case of missing config file silently crashes (no log4net config => no logging).
are there way check if there appenders in config, , if not - programmatically add kind of fallback appender.
i'm rather new log4x loggers family, so, if i'm asking trivial - please kind, log4net documentation awful. :)
ok, question on google, , i've found answer, i'll left here. :)
the key manipulating appenders iappenderattachable
interface, since implements addappender
, removeappender
methods.
what's returned logmanager.getlogger()
instance of ilog
, in turn contains property logger
. object returned ilog.logger
logger
class instance. logger
class implements iappenderattachable
interface , contains repository
property extract repository of logger. repository has method getappenders
returns appendercollection
class instance (implements icollection
, ilist
, ienumerable
, etc.) active appenders of logger.
to sum up:
//no need put in static constructor, in case static logger() { logger = logmanager.getlogger(...); if (logger.logger.repository.getappenders().length == 0) { (logger.logger iappenderattachable).addappender(createconsoleappender()); } } private static consoleappender createconsoleappender() { var appender = new consoleappender(); appender.layout = createdefaultlayout(); appender.addfilter(createdefaultfilter()); appender.activateoptions(); // if omitted - throws excpetion log4net.config.basicconfigurator.configure(appender); //if omitted - no errors, logging not work return appender; } private static ilayout createdefaultlayout() { patternlayout layout = new patternlayout(); layout.conversionpattern = "%d{yyyy-mm-dd hh:mm:ss} - %level %m%n"; layout.activateoptions(); return layout; } private static ifilter createdefaultfilter() { levelrangefilter filter = new levelrangefilter { levelmin = level.info }; filter.activateoptions(); return filter; }
note in case of missing or corrupted file log4net
not throw exceptions (at least out of box), have no appenders attached logger.
Comments
Post a Comment