Index: netstandard/log4net.tests/log4net.tests.xproj =================================================================== --- netstandard/log4net.tests/log4net.tests.xproj (revision 1782335) +++ netstandard/log4net.tests/log4net.tests.xproj (working copy) @@ -32,6 +32,7 @@ + Index: netstandard/log4net.tests/project.json =================================================================== --- netstandard/log4net.tests/project.json (revision 1782335) +++ netstandard/log4net.tests/project.json (working copy) @@ -6,6 +6,7 @@ "../../tests/src/Appender/AppenderCollectionTest.cs", "../../tests/src/Appender/BufferingAppenderTest.cs", "../../tests/src/Appender/CountingAppender.cs", + "../../tests/src/Appender/DebugAppenderTest.cs", "../../tests/src/Appender/MemoryAppenderTest.cs", "../../tests/src/Appender/RollingFileAppenderTest.cs", "../../tests/src/Appender/SmtpPickupDirAppenderTest.cs", Index: src/Appender/DebugAppender.cs =================================================================== --- src/Appender/DebugAppender.cs (revision 1782335) +++ src/Appender/DebugAppender.cs (working copy) @@ -100,6 +100,23 @@ set { m_immediateFlush = value; } } + /// + /// Formats the category parameter sent to the Debug method. + /// + /// + /// + /// Defaults to a with %logger as the pattern which will use the logger name of the current + /// as the category parameter. + /// + /// + /// + /// + public PatternLayout Category + { + get { return m_category; } + set { m_category = value; } + } + #endregion Public Instance Properties #if !NETSTANDARD1_3 @@ -138,7 +155,22 @@ // // Write the string to the Debug system // - System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), loggingEvent.LoggerName); + if(m_category == null) + { + System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent)); + } + else + { + string category = m_category.Format(loggingEvent); + if (string.IsNullOrEmpty(category)) + { + System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent)); + } + else + { + System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), category); + } + } #if !NETSTANDARD1_3 // // Flush the Debug system if needed @@ -185,6 +217,11 @@ /// private bool m_immediateFlush = true; + /// + /// Defaults to a with %logger as the pattern. + /// + private PatternLayout m_category = new PatternLayout("%logger"); + #endregion Private Instance Fields } } Index: tests/src/Appender/DebugAppenderTest.cs =================================================================== --- tests/src/Appender/DebugAppenderTest.cs (nonexistent) +++ tests/src/Appender/DebugAppenderTest.cs (working copy) @@ -0,0 +1,174 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +using System; +using System.Diagnostics; +using log4net.Appender; +using log4net.Config; +using log4net.Core; +using log4net.Layout; +using log4net.Repository; +using NUnit.Framework; + +namespace log4net.Tests.Appender +{ + [TestFixture] + public class DebugAppenderTest + { + [Test] + public void NullCategoryTest() + { + CategoryTraceListener categoryTraceListener = new CategoryTraceListener(); + Debug.Listeners.Add(categoryTraceListener); + + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + + DebugAppender debugAppender = new DebugAppender(); + debugAppender.Layout = new SimpleLayout(); + debugAppender.ActivateOptions(); + + debugAppender.Category = null; + + TestErrorHandler testErrHandler = new TestErrorHandler(); + debugAppender.ErrorHandler = testErrHandler; + + BasicConfigurator.Configure(rep, debugAppender); + + ILog log = LogManager.GetLogger(rep.Name, GetType()); + log.Debug("Message"); + + Assert.AreEqual( + null, + categoryTraceListener.Category); + + Assert.IsFalse(testErrHandler.ErrorOccured); + + Debug.Listeners.Remove(categoryTraceListener); + } + + [Test] + public void EmptyStringCategoryTest() + { + CategoryTraceListener categoryTraceListener = new CategoryTraceListener(); + Debug.Listeners.Add(categoryTraceListener); + + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + + DebugAppender debugAppender = new DebugAppender(); + debugAppender.Layout = new SimpleLayout(); + debugAppender.ActivateOptions(); + + debugAppender.Category = new PatternLayout(""); + + BasicConfigurator.Configure(rep, debugAppender); + + ILog log = LogManager.GetLogger(rep.Name, GetType()); + log.Debug("Message"); + + Assert.AreEqual( + null, + categoryTraceListener.Category); + + Debug.Listeners.Remove(categoryTraceListener); + } + + [Test] + public void DefaultCategoryTest() + { + CategoryTraceListener categoryTraceListener = new CategoryTraceListener(); + Debug.Listeners.Add(categoryTraceListener); + + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + + DebugAppender debugAppender = new DebugAppender(); + debugAppender.Layout = new SimpleLayout(); + debugAppender.ActivateOptions(); + + BasicConfigurator.Configure(rep, debugAppender); + + ILog log = LogManager.GetLogger(rep.Name, GetType()); + log.Debug("Message"); + + Assert.AreEqual( + GetType().ToString(), + categoryTraceListener.Category); + + Debug.Listeners.Remove(categoryTraceListener); + } + +#if !NETSTANDARD1_3 // "LocationInfo can't get method names on NETSTANDARD1_3 due to unavailable stack frame APIs" + [Test] + public void MethodNameCategoryTest() + { + CategoryTraceListener categoryTraceListener = new CategoryTraceListener(); + Debug.Listeners.Add(categoryTraceListener); + + ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString()); + + DebugAppender debugAppender = new DebugAppender(); + PatternLayout methodLayout = new PatternLayout("%method"); + methodLayout.ActivateOptions(); + debugAppender.Category = methodLayout; + debugAppender.Layout = new SimpleLayout(); + debugAppender.ActivateOptions(); + + BasicConfigurator.Configure(rep, debugAppender); + + ILog log = LogManager.GetLogger(rep.Name, GetType()); + log.Debug("Message"); + + Assert.AreEqual( + System.Reflection.MethodInfo.GetCurrentMethod().Name, + categoryTraceListener.Category); + + Debug.Listeners.Remove(categoryTraceListener); + } +#endif + + private class TestErrorHandler : IErrorHandler + { + private bool m_errorOccured = false; + + public bool ErrorOccured + { + get { return m_errorOccured; } + } + #region IErrorHandler Members + + public void Error(string message, Exception e, ErrorCode errorCode) + { + m_errorOccured = true; + } + + public void Error(string message, Exception e) + { + Error(message, e, ErrorCode.GenericFailure); + } + + public void Error(string message) + { + Error(message, null, ErrorCode.GenericFailure); + } + + #endregion + } + } +} Index: tests/src/log4net.Tests.vs2008.csproj =================================================================== --- tests/src/log4net.Tests.vs2008.csproj (revision 1782335) +++ tests/src/log4net.Tests.vs2008.csproj (working copy) @@ -130,6 +130,9 @@ Code + + Code + Code Index: tests/src/log4net.Tests.vs2010.csproj =================================================================== --- tests/src/log4net.Tests.vs2010.csproj (revision 1782335) +++ tests/src/log4net.Tests.vs2010.csproj (working copy) @@ -147,6 +147,9 @@ Code + + Code + Code Index: tests/src/log4net.Tests.vs2012.csproj =================================================================== --- tests/src/log4net.Tests.vs2012.csproj (revision 1782335) +++ tests/src/log4net.Tests.vs2012.csproj (working copy) @@ -147,6 +147,7 @@ Code + Code