Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自自定义接口的Log4Net日志记录_C#_Logging_Log4net - Fatal编程技术网

C# 来自自定义接口的Log4Net日志记录

C# 来自自定义接口的Log4Net日志记录,c#,logging,log4net,C#,Logging,Log4net,我想知道如何在我的示例中使用log4net在%logger模式中打印正确的类名 在我的应用程序中,我使用一个日志类来实现一个日志接口。其他类使用日志接口抽象来执行实际的日志记录。我想切换到Log4Net,但我正在考虑保留日志抽象。自定义日志类方法将对象作为参数,并根据其状态创建日志 因此,在下面的示例中,%logger模式将记录MyLogger,这是预期的,但我希望在本例中记录调用类名ObjectManipulator using System.Reflection; using log4net

我想知道如何在我的示例中使用log4net在%logger模式中打印正确的类名

在我的应用程序中,我使用一个日志类来实现一个日志接口。其他类使用日志接口抽象来执行实际的日志记录。我想切换到Log4Net,但我正在考虑保留日志抽象。自定义日志类方法将对象作为参数,并根据其状态创建日志

因此,在下面的示例中,%logger模式将记录MyLogger,这是预期的,但我希望在本例中记录调用类名ObjectManipulator

using System.Reflection;
using log4net;

namespace LoggingTestur
{
    class Program
    {
        class AnObject
        {
            public string State { get; set; }
        }

        interface IMyLogger
        {
            void LogObjectStateChenge(AnObject anObject);
        }

        class MyLogger : IMyLogger
        {
            private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

            public void LogObjectStateChenge(AnObject anObject)
            {
                Log.InfoFormat("AnObject's state is: {0}", anObject.State);
            }
        }

        class ObjectManipulator
        {
            private readonly IMyLogger _logger;

            public ObjectManipulator(IMyLogger logger)
            {
                _logger = logger;
            }

            public void Manipulate()
            {
                var anObject = new AnObject { State = "New" };
                _logger.LogObjectStateChenge(anObject);
            }
        }

        static void Main(string[] args)
        {
            var logger = new MyLogger();
            var manipulator = new ObjectManipulator(logger);
            manipulator.Manipulate();
        }
    }
}

您有几个选项可以获取类名:

将其作为参数传递,即LogObjectStateChangeAnObject anObject,Type=null

如果您以4.5运行时为目标,则可以使用该属性获取文件名,并从中提取类名,前提是每个类有一个文件,并且文件名与类名相同,即LogObjectStateChangeAObject anObject,[CallerFilePath]字符串文件名=

使用反射从CallStack和StackFrame类获取调用类。但请注意,在发布版本中,编译器可能会内联方法或以其他方式重新安排内容,从而导致堆栈跟踪中的信息不正确