Usually when blocking occurs, it has something to do with the LockingModel: http://logging.apache.org/log4net/release/sdk/log4net.Appender.FileAppender.LockingModel.html
I don't see that you are setting this to MinimalLock in what you posted, but I would verify that you are leaving this setting as the default ExclusiveLock. We always put a BufferingForwardingAppender ( http://logging.apache.org/log4net/release/sdk/log4net.Appender.BufferingForwardingAppender.html) in front of a RollingFileAppender. This will help as you actually aren't writing every log event when it happens. We use something like the following configuration to buffer X events and write them out when the buffer is full (ensure you have lossy = false so you don't lose events) or an event of WARN or higher is logged. <appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" > <bufferSize value="100" /> <lossy value="false" /> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="WARN"/> </evaluator> <appender-ref ref="RollingFileAppender" /> </appender> Note that this makes it harder to watch your logs as they will only be flushed every X (100 in the above example) events. If you need to see immediate logs and have the process using ConfigureAndWatch to configure logging, you can just switch the bufferSize configuration to 1 while you are looking at the logs and set it back when done. You should also ensure you have a call to LogManager.Shutdown ( http://logging.apache.org/log4net/release/sdk/log4net.LogManager.Shutdown.html) when your process is exiting (clean or on error) so log4net can try to get all events flushed before the process exits. Hope this helps Mike On Fri, Oct 17, 2014 at 9:06 AM, Calin Pavel <calin.pa...@codemart.ro> wrote: > Hi, > > We use attached configuration as an XML file, but in addition to this at > runtime we add dynamically some appenderers with the code: > > private void addLoggerForMonitor(Hierarchy loggerRepository, > MonitorConfig monitorConfig) > { > Logger root = loggerRepository.Root; > RollingFileAppender mainAppender = > (RollingFileAppender)root.GetAppender(MAIN_FILE_APPENDER_NAME); > string logPath = mainAppender.File; > string logDir = logPath.Substring(0, > logPath.LastIndexOf(@"\")); > > // create the appender > RollingFileAppender monitorAppender = new > RollingFileAppender(); > monitorAppender.Name = buildAppendererName(monitorConfig); > monitorAppender.File = Path.Combine(logDir, > MONITOR_LOGGING_PARENT_DIR, monitorConfig.name) + @"\"; > > // Copy values from the DataCollector appenderer (main > appenderer) > monitorAppender.DatePattern = DateHelper.DATE_FORMAT + "'_" + > monitorConfig.name + ".log'"; > monitorAppender.AppendToFile = mainAppender.AppendToFile; > monitorAppender.RollingStyle = mainAppender.RollingStyle; > monitorAppender.StaticLogFileName = > mainAppender.StaticLogFileName; > monitorAppender.PreserveLogFileNameExtension = > mainAppender.PreserveLogFileNameExtension; > > PatternLayout layout = new PatternLayout("%date [%thread] > %-5level %logger{1}:%L - %message%newline"); > monitorAppender.Layout = layout; > monitorAppender.Threshold = monitorConfig.loggingLevel; > > PropertyFilter filter = new PropertyFilter(); > filter.Key = LoggingConstants.THREAD_LOGGING_KEY; > filter.StringToMatch = monitorConfig.name; > > DenyAllFilter filterDeny = new log4net.Filter.DenyAllFilter(); > > monitorAppender.AddFilter(filter); > monitorAppender.AddFilter(filterDeny); > monitorAppender.ActivateOptions(); > > // create the logger > Logger pbeakkLogger = > (Logger)LogManager.GetLogger(ROOT_LEVEL).Logger; > > // Force DEBUG level for logger. Filter by level will be done > by appenderer > pbeakkLogger.Level = Level.Debug; > > pbeakkLogger.AddAppender(monitorAppender); > } > > > Regards, > Calin Pavel > > > On 10/17/2014 4:16 PM, Michael Schall wrote: > > Please post your config. > > On Fri, Oct 17, 2014 at 4:55 AM, Calin Pavel <calin.pa...@codemart.ro> > wrote: > >> Hello everybody, >> >> I do have an .NET application (Windows Service) that collects data from a >> lot of sources (DBs, log files, machines event logs, ...) and uses Log4Net >> to log details of the actions / execution. As expected, I'm using a high >> number of threads to collect data, threads that are writing logs in some >> files (RollingFileAppenderer). >> >> Lately it happens that the entire application is BLOCKED because all >> threads were trying to acquire a read lock, like in the stack trace: >> 000000001ac3d998 00000000774715fa [HelperMethodFrame: 000000001ac3d998] >> System.Threading.Thread.SleepInternal(Int32) >> 000000001ac3da90 000007fef747b5e9 System.Threading.Thread.Sleep(Int32) >> 000000001ac3dac0 000007fef5fb9631 >> System.Threading.ReaderWriterLockSlim.EnterMyLockSpin() >> 000000001ac3db90 000007fef5cd297e >> System.Threading.ReaderWriterLockSlim.TryEnterReadLockCore(TimeoutTracker) >> 000000001ac3dbf0 000007fef5cd28fa >> System.Threading.ReaderWriterLockSlim.TryEnterReadLock(TimeoutTracker) >> 000000001ac3dc40 000007fe98fb4efd >> log4net.Repository.Hierarchy.Logger.CallAppenders(log4net.Core.LoggingEvent) >> 000000001ac3dcc0 000007fe98fb4907 >> log4net.Repository.Hierarchy.Logger.Log(System.Type, log4net.Core.Level, >> System.Object, System.Exception) >> 000000001ac3dd30 000007fe98fb47f9 log4net.Core.LogImpl.Info >> (System.Object) >> .... >> >> Did you encountered this before or did anybody else reported similar >> problems? >> >> May be it's important to mention: >> - I'm using Log4Net 1.2.13, .NET 4.5 on Windows 2008 R2 >> - that my threads have a timeout, and if they do not finish the job in >> the given interval they are aborted. >> >> In relation with this, I found a possible explanation of application >> hanging here: >> http://chabster.blogspot.ro/2013/07/a-story-of-orphaned-readerwriterlockslim.html >> >> Could it be that the acquire of read lock in Logger.CallAppenderers >> method to generate our problems? >> >> Thank you in advance, >> Calin Pavel >> > > >