log4netlog4net-appender

How do you create SeqAppender programatically in log4net?


I tried the following code based on other responses on how to add custom appender programmatically. I do see log messages appear on the console, but I do not see them in a locally running Seq server. I verified the Seq URL was set http://localhost:5341/. I also tried a hosted version of Seq with API Key to see if I could catch anything being set via Fiddler, but nothing is sent. What am I missing?

public static void SetLevel(string loggerName, string levelName)
{
    ILog log = LogManager.GetLogger(loggerName);
    Logger l = (Logger)log.Logger;

    l.Level = l.Hierarchy.LevelMap[levelName];
}

// Add an appender to a logger
public static void AddAppender(string loggerName, IAppender appender)
{
    ILog log = LogManager.GetLogger(loggerName);
    Logger l = (Logger)log.Logger;

    l.AddAppender(appender);
    l.Repository.Configured = true;
}

// Create a new file appender
public static IAppender CreateSeqAppender(string name)
{
    var seqAppender = new SeqAppender();
    seqAppender.ServerUrl = ConfigurationManager.AppSettings["Seq:Url"];
    var seqApiKey = ConfigurationManager.AppSettings["Seq:ApiKey"];
    if (seqApiKey != null)
    {
        seqAppender.ApiKey = seqApiKey;
    }
    PatternLayout patternLayout = new PatternLayout();

    var LOG_PATTERN = "%d [%t] %-5p %m%n";
    patternLayout.ConversionPattern = LOG_PATTERN;
    patternLayout.ActivateOptions();
    seqAppender.Name = name;
    seqAppender.BufferSize = 1;
    seqAppender.Layout = patternLayout;
    seqAppender.ActivateOptions();

    return seqAppender;
}

static void Main()
{
    BasicConfigurator.Configure();
    // In order to set the level for a logger and add an appender reference you
    // can then use the following calls:
    SetLevel("Log4net.MainForm", "ALL");
    AddAppender("Log4net.MainForm", CreateSeqAppender("SeqAppender"));

    //BasicConfigurator.Configure();

    var logger = LogManager.GetLogger("MyLogger");

    logger.Info("This is a test log message");
}

Solution

  • After a bit more investigation I figured out how to get this to work. Instead the code in AddAppender above I just did the following:

    var root = ((Hierarchy)LogManager.GetRepository()).Root;
            root.AddAppender(CreateSeqAppender());
    

    Hopefully, this helps someone else out.