log4net C# 中的方法名称
Method Name in log4net C#
我为 log4net 创建了一个 c# 包装器。
它有 Debug() 和 Error() 方法。
我想记录记录记录的方法名称,但是如果我尝试使用 %method 转换模式,它只会打印 Debug,这是包装方法名称。
有没有办法打印完整的方法堆栈?
例如
而不是调试 --> SomeLoggingActionInSomeClass.Debug?
包装器 class 代码:
public static class Logger
{
private static ILog _log;
static Logger()
{
log4net.Config.XmlConfigurator.Configure();
_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
public static void Init()
{
}
public static void Debug(string message)
{
_log.Debug(message);
}
调用Class代码:
W6CustomizationLogger.Logger.Debug("Backup(): START");
如果您真的必须使用包装器 class,那么最好的方法是在包装器中获取调用方法,然后将其存储为 属性:
var stackFrames = new StackTrace().GetFrames();
var callingframe = stackFrames.ElementAt(1);
var method = callingframe .GetMethod().Name;
// Store in log4net ThreadContext:
ThreadContext.Properties["method"] = method;
然后在布局中引用属性:
<conversionPattern value = ""Method: %property{method}"" />
还有一种方法可以只使用布局来解决这个问题,您可以在布局中使用 %stacktrace
来获取调用堆栈,具体来说 %stacktrace{2}
来获取调用方法。
请注意,当您使用它时,整个堆栈都会被记录下来,包括包装器方法。
示例输出:
log4net.Tests.Stacktrace_Tests.StackTrace_In_PatternLayout > log4net.Tests.Wrapper.Debug
报废包装纸。
配置
要初始化日志记录,您可以在启动项目中轻松配置它。
- 在解决方案资源管理器中单击 "Properties" 启动项目旁边的箭头
- 双击程序集信息
3 添加以下内容:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
截图:
用法
现在在您的 classes 中只需添加:
public class YourClass
{
private ILog _logger = LogManager.GetLogger(typeof(YourClass));
// [....]
}
并且在您的 log4net.config
中,您现在可以在输出中使用 logger
属性:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-7level %-40logger %message%newline" />
</layout>
这将在每个日志行上打印命名空间和类型名称(-7
和 -40
填充名称以便我得到直列)。
另一件好事是您还可以在名称空间上使用过滤器(使所有数据库 classes 都记录到 "databases.log" 等)。
<appender name="DatabaseAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\MyApp\Database.log" />
<rollingStyle value="Composite" />
<datePattern value=".yyyy-MM-dd'.log'" />
<appendToFile value="true" />
<maximumFileSize value="50MB" />
<maxSizeRollBackups value="5" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level@%thread [%logger] %message%newline" />
</layout>
<!-- Namespace/Type filter -->
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="CompanyName.DatabaseNamespace"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
如果 %logger
只得到 class 名称,您也可以使用 %type{1}
。
我为 log4net 创建了一个 c# 包装器。
它有 Debug() 和 Error() 方法。
我想记录记录记录的方法名称,但是如果我尝试使用 %method 转换模式,它只会打印 Debug,这是包装方法名称。
有没有办法打印完整的方法堆栈?
例如
而不是调试 --> SomeLoggingActionInSomeClass.Debug?
包装器 class 代码:
public static class Logger
{
private static ILog _log;
static Logger()
{
log4net.Config.XmlConfigurator.Configure();
_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
public static void Init()
{
}
public static void Debug(string message)
{
_log.Debug(message);
}
调用Class代码:
W6CustomizationLogger.Logger.Debug("Backup(): START");
如果您真的必须使用包装器 class,那么最好的方法是在包装器中获取调用方法,然后将其存储为 属性:
var stackFrames = new StackTrace().GetFrames();
var callingframe = stackFrames.ElementAt(1);
var method = callingframe .GetMethod().Name;
// Store in log4net ThreadContext:
ThreadContext.Properties["method"] = method;
然后在布局中引用属性:
<conversionPattern value = ""Method: %property{method}"" />
还有一种方法可以只使用布局来解决这个问题,您可以在布局中使用 %stacktrace
来获取调用堆栈,具体来说 %stacktrace{2}
来获取调用方法。
请注意,当您使用它时,整个堆栈都会被记录下来,包括包装器方法。
示例输出:
log4net.Tests.Stacktrace_Tests.StackTrace_In_PatternLayout > log4net.Tests.Wrapper.Debug
报废包装纸。
配置
要初始化日志记录,您可以在启动项目中轻松配置它。
- 在解决方案资源管理器中单击 "Properties" 启动项目旁边的箭头
- 双击程序集信息
3 添加以下内容:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
截图:
用法
现在在您的 classes 中只需添加:
public class YourClass
{
private ILog _logger = LogManager.GetLogger(typeof(YourClass));
// [....]
}
并且在您的 log4net.config
中,您现在可以在输出中使用 logger
属性:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-7level %-40logger %message%newline" />
</layout>
这将在每个日志行上打印命名空间和类型名称(-7
和 -40
填充名称以便我得到直列)。
另一件好事是您还可以在名称空间上使用过滤器(使所有数据库 classes 都记录到 "databases.log" 等)。
<appender name="DatabaseAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\Logs\MyApp\Database.log" />
<rollingStyle value="Composite" />
<datePattern value=".yyyy-MM-dd'.log'" />
<appendToFile value="true" />
<maximumFileSize value="50MB" />
<maxSizeRollBackups value="5" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level@%thread [%logger] %message%newline" />
</layout>
<!-- Namespace/Type filter -->
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="CompanyName.DatabaseNamespace"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
</appender>
如果 %logger
只得到 class 名称,您也可以使用 %type{1}
。