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 <mailto: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
    <http://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



<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file type="log4net.Util.PatternString" value="d:\Logs\DataCollector\" />
    <threshold value="INFO" />
    <param name="DatePattern" value="yyyy-MM-dd'_DataCollector.log'" />
    <param name="AppendToFile" value="true" />
    <param name="RollingStyle" value="Date" />
    <param name="StaticLogFileName" value="false" />
    <param name="preserveLogFileNameExtension" value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger{1}:%L - %message%newline" />
    </layout>
  </appender>

  <appender name="MonitoringStatusAppender" type="Pbeakk.Monitoring.Logging.Appenders.MonitoringStatusAppender">
    <!-- IMPORTANT !!! Do not change this level. This appenderer ONLY counts WARNs and ERRORs -->
    <threshold value="WARN" />
  </appender>

  <root>
    <appender-ref ref="RollingFile" />
    <appender-ref ref="MonitoringStatusAppender" />

    <!-- Uncomment the following line if you want to use SMTP appenderer. -->
    <!--<appender-ref ref="AsyncSmtpAppender" />-->
  </root>

  <!-- Other loggers for third party libraries -->
  <logger name="Quartz">
    <level value="WARN" />
  </logger>
</log4net>

Reply via email to