Question

I am using log4net for program logging in my application on the .NET Compact Framework, and this is working fine.

However, I have need to output data to a text file every few seconds and was wondering if I could utilise log4net for this. The problem is, every time I specify a new appender, all my program logging is also appended to it.

So, to re-iterate, I need two appenders. One which is global and handles all my program logging, and a second appender which is attached to a private member logger in a class to output data. I don't want any logs to appear in both appenders.

Is this possible? I have to specify my log4net configuration in code as the compact framework does not support config files. My current appender is defined as follows:

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders(); //Remove any other appenders

RollingFileAppender fileAppender = new RollingFileAppender();
fileAppender.MaxFileSize = 10000000; //10MB in bytes
fileAppender.MaxSizeRollBackups = 10;
fileAppender.RollingStyle = RollingFileAppender.RollingMode.Size;
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.File = @"C:\ProgramLog.txt";

log4net.Filter.LevelRangeFilter filter = new log4net.Filter.LevelRangeFilter();
filter.LevelMin = log4net.Core.Level.Warn;
filter.LevelMax = log4net.Core.Level.Fatal;
fileAppender.AddFilter(filter);

PatternLayout pl = new PatternLayout();
pl.ConversionPattern = "%utcdate [%thread] %-5level %logger - %message%newline";
pl.ActivateOptions();
fileAppender.Layout = pl;
fileAppender.ActivateOptions();

log4net.Config.BasicConfigurator.Configure(fileAppender);
Was it helpful?

Solution

I found a way to do this using repositories. I have written a class to encapsulate all the log4net configuration:

public class CustomLogger
{
    private readonly ILog log;

    public CustomLogger(string name)
    {
        var repository = LogManager.CreateRepository(name);
        Hierarchy hierarchy = (Hierarchy)repository;
        hierarchy.Root.RemoveAllAppenders(); //Remove any other appenders

        RollingFileAppender fileAppender = new RollingFileAppender();
        fileAppender.MaxFileSize = 10000000; //10MB in bytes
        fileAppender.MaxSizeRollBackups = 10;
        fileAppender.RollingStyle = RollingFileAppender.RollingMode.Size;
        fileAppender.AppendToFile = true;
        fileAppender.LockingModel = new FileAppender.MinimalLock();
        fileAppender.File = @"C:\" + name + "_LOG.txt";

        PatternLayout pl = new PatternLayout();
        pl.ConversionPattern = "%utcdate,%message%newline";
        pl.ActivateOptions();
        fileAppender.Layout = pl;
        fileAppender.ActivateOptions();

        log4net.Config.BasicConfigurator.Configure(repository, fileAppender);

        this.log = LogManager.GetLogger(name, name);
    }

    public void Log(string message)
    {
        this.log.Info(message);
    }
}

Usage:

var logger1 = new CustomLogger("1111111");
var logger2 = new CustomLogger("2222222");
var logger3 = new CustomLogger("3333333");

logger1.Log("Test1");
logger2.Log("Test2");
logger3.Log("Test3");
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top