تمكين تسجيل ملف log4net من التعليمات البرمجية بدلا من التكوين

StackOverflow https://stackoverflow.com/questions/1436713

  •  08-07-2019
  •  | 
  •  

سؤال

وماذا في العالم لا تفشل الاختبار التالي؟ (xunit في تقريرها) لقد حاولت ذلك مع appenders مختلفة، وأنه لم يكتب أي شيء على الرغم من أن سجل تبدو انها مستعدة لإرسال. أنا في نهاية المطاف خلق بلدي appender بك فقط لاختباره.

    public class TestAppender : AppenderSkeleton {
        public event Action<LoggingEvent> AppendCalled = delegate { };
        protected override void Append(LoggingEvent loggingEvent) {
            AppendCalled(loggingEvent);
        }
    }
    public class Class1 {
        private TestAppender _appender = new TestAppender();
        public Class1() {
            log4net.Util.LogLog.InternalDebugging = true;
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
            Logger rootLogger = hierarchy.Root;
            rootLogger.Level = Level.All;
            Logger coreLogger = hierarchy.GetLogger("abc") as Logger;
            coreLogger.Level = Level.All;

            coreLogger.Parent = rootLogger;
            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%logger - %message %newline";
            patternLayout.ActivateOptions();
            _appender.Layout = patternLayout;
            _appender.ActivateOptions();
            coreLogger.AddAppender(_appender);            
        }
        [Fact]
        public void Test() {
            bool called = false;
            _appender.AppendCalled += e => called = true;
            var log = LogManager.GetLogger("abc");
            log.Debug("This is a debugging message");
            Thread.Sleep(TimeSpan.FromSeconds(2));
            log.Info("This is an info message");
            Thread.Sleep(TimeSpan.FromSeconds(2));
            log.Warn("This is a warning message");
            Thread.Sleep(TimeSpan.FromSeconds(2));
            log.Error("This is an error message");
            Assert.True(called);
        }
}
هل كانت مفيدة؟

المحلول

وأنا دائما استخدام التعليمات البرمجية أدناه لتكوين log4net من التعليمات البرمجية. يعمل كبيرة!

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

FileAppender fileAppender = new FileAppender();
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.File = Server.MapPath("/") + "log.txt";
PatternLayout pl = new PatternLayout();
pl.ConversionPattern = "%d [%2%t] %-5p [%-10c]   %m%n%n";
pl.ActivateOptions();
fileAppender.Layout = pl;
fileAppender.ActivateOptions();

log4net.Config.BasicConfigurator.Configure(fileAppender);

//Test logger
ILog log =LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
log.Debug("Testing!");

نصائح أخرى

ومجرد إلقاء تخمين هناك ...

هل لديك XmlConfiguration المحددة في التجميع الخاص بك؟

هل ننسى ذلك في مشروع الاختبار؟

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

وهذا يحرق عادة لي في كل مرة واحدة في كل حين.

ومع ذلك لا أستطيع أن أقول لماذا رمز أعلاه لا يعمل ولكن حصلت على log4net لتكوين بشكل صحيح واستخدام بلدي appender عن طريق استبدال كافة التعليمات البرمجية التكوين مع:

log4net.Config.BasicConfigurator.Configure(_appender);

هنا .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top