Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Configure log4net RollingFileAppender in code rolling once per application start

Tags:

c#

.net

log4net

I would like to create a log4net RollingFileAppender that creates a new file each time the program starts. It can roll if the file gets to big but must roll each time the application is started. The appender should not be added if another appender is configured in the configuration. In essence creating a default log configuration that can be overridden by changing the configuration file.

like image 517
Ben Gripka Avatar asked Aug 03 '12 19:08

Ben Gripka


People also ask

What is RollingFileAppender in log4net?

RollingFileAppender can roll log files based on size or date or both depending on the setting of the RollingStyle property. When set to Size the log file will be rolled once its size exceeds the MaximumFileSize.

How do I completely disable all logging at runtime?

How do I completely disable all logging at runtime? Setting the Threshold on the Hierarchy to Level OFF will disable all logging from that Hierarchy. This can be done in the log4net configuration file by setting the "threshold" attribute on the log4net configuration element to "OFF".


1 Answers

After piecing together a number of other posts, I finally got this working. The implementation is in a static wrapper class. All you have to do is paste this code into your app, set the location to create the file, and call Log.Configure() when the application starts.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Windows.Threading;
using log4net;
using log4net.Core;
using log4net.Appender;
using log4net.Repository.Hierarchy;
using System.Reflection;
using System.IO;

namespace [Your Namespace]
{
    public static class Log
    {
        private static bool isConfigured = false;
        private static ILog iLog;

        public static void Configure()
        {
            if (isConfigured)
                return;

            var loggerName = typeof(DiagnosticsManager).FullName;

            var logger = (log4net.Repository.Hierarchy.Logger)log4net.LogManager.GetRepository().GetLogger(loggerName);
            var ilogger = log4net.LogManager.GetRepository().GetLogger(loggerName);

            //Add the default log appender if none exist
            if(logger.Appenders.Count == 0)
            {
                var directoryName = "[Your directory name here. e.c. 'C:\ProgramData\AppName\Logs']";

                //If the directory doesn't exist then create it
                if(!Directory.Exists(directoryName))
                    Directory.CreateDirectory(directoryName);

                var fileName = Path.Combine(directoryName, "[Your static file name here. e.c. 'AppName.log']");

                //Create the rolling file appender
                var appender = new log4net.Appender.RollingFileAppender();
                appender.Name = "RollingFileAppender";
                appender.File = fileName;
                appender.StaticLogFileName = true;
                appender.AppendToFile = false;
                appender.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Size;
                appender.MaxSizeRollBackups = 10;
                appender.MaximumFileSize = "10MB";
                appender.PreserveLogFileNameExtension = true;

                //Configure the layout of the trace message write
                var layout = new log4net.Layout.PatternLayout()
                {
                    ConversionPattern = "%date{hh:mm:ss.fff} [%thread] %-5level - %message%newline"
                };
                appender.Layout = layout;
                layout.ActivateOptions();

                //Let log4net configure itself based on the values provided
                appender.ActivateOptions();
                log4net.Config.BasicConfigurator.Configure(appender);
            }

            iLog = LogManager.GetLogger(loggerName);
            isConfigured = true;

            Info("Logging Configured at " + DateTime.Now.ToString("g"));
        }

        public static event EventHandler<ExceptionLoggedEventArgs> ExceptionLogged;

        public static void Debug(object message) { Configure(); iLog.Debug(message); }
        public static void Debug(object message, Exception exception) { Configure(); iLog.Debug(message, exception); }

        public static void Error(object message) { Configure(); iLog.Error(message); }
        public static void Error(object message, Exception exception) { Configure(); iLog.Error(message, exception); }

        public static void Fatal(object message) { Configure(); iLog.Fatal(message); }
        public static void Fatal(object message, Exception exception) { Configure(); iLog.Fatal(message, exception); }

        public static void Info(object message) { Configure(); iLog.Info(message); }
        public static void Info(object message, Exception exception) { Configure(); iLog.Info(message, exception); }

        public static void Warn(object message) { Configure(); iLog.Warn(message); }
        public static void Warn(object message, Exception exception) { Configure(); iLog.Warn(message, exception); }

    }

}
like image 127
Ben Gripka Avatar answered Oct 20 '22 00:10

Ben Gripka