在每个应用程序启动时滚动一次的代码中配置log4net RollingFileAppender

时间:2012-08-03 19:12:15

标签: c# .net log4net

我想创建一个log4net RollingFileAppender,每次程序启动时都会创建一个新文件。如果文件变大,它可以滚动,但每次启动应用程序时都必须滚动。如果在配置中配置了另一个appender,则不应添加appender。实质上,创建一个可以通过更改配置文件来覆盖的默认日志配置。

1 个答案:

答案 0 :(得分:10)

在拼凑了其他一些帖子之后,我终于开始工作了。实现是在静态包装类中。您所要做的就是将此代码粘贴到您的应用程序中,设置创建文件的位置,并在应用程序启动时调用Log.Configure()。

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); }

    }

}