对于大名顶顶的Log4Net大家一定都很熟悉。在项目应用中,往往会对 Log4Net 进行二次包装以满足项目的特殊需求。 比如自动记录调用 Log 方法的调用方法名,类名。

利用 System.Diagnostics.StackTrace 来了解哪个方法调用了该方法(以及哪个方法调用了其调用者,等等)。从其名称可以看出,StackTrace 对象跟踪等待当前过程完成的所有悬挂过程。可以采用许多方式创建 StackTrace 对象。在其最简单方式中,不向其构造函数传递参数, 并取得作为一组 StackFrame 对象的完整堆栈映像, 可以按其索引进行列举。

StackTrace()
Enumerate all the stack frame objects. The frame at index 0 corresponds to the current routine. Integer st.FrameCount Get the ith stack frame and print the method name. StackFrame st.GetFrame(i)
Console.WriteLine(sf.GetMethod().Name)

于是自定义一个Log4Net的包装类, 利用 StackTrace 来获得Log4Net包装类的调用类名和调用方法名:

Imports log4net
Imports System.Runtime.CompilerServices
Imports System.Diagnostics

Public Class Logger

Private Sub New ()
End Sub


Private Shared log As ILog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)

Shared Sub New ()
LoggerConfig.Config()
End Sub


< MethodImpl(MethodImplOptions.NoInlining) > _
Private Shared Function FormatMessage( ByVal message As String )
Dim st As StackTrace = New StackTrace()
Dim sf As StackFrame = st.GetFrame( 2 )
Return String .Format( " {0}.{1}: {2} " , sf.GetMethod().DeclaringType.Name, _
sf.GetMethod().Name, message)
End Function


Public Shared Sub LogDebug( ByVal message As String )
If log .IsDebugEnabled Then
log .Debug(FormatMessage(message))
End If
End Sub


Public Shared Sub LogInfo( ByVal message As String )
If log .IsInfoEnabled Then
log .Info(FormatMessage(message))
End If
End Sub


Public Shared Sub LogWarn( ByVal message As String )
If log .IsWarnEnabled Then
log .Warn(FormatMessage(message))
End If
End Sub


Public Shared Sub LogError( ByVal message As String )
If log .IsErrorEnabled Then
log .Error(FormatMessage(message))
End If
End Sub


Public Shared Sub LogFatal( ByVal message As String )
If log .IsFatalEnabled Then
log .Fatal(FormatMessage(message))
End If
End Sub


End Class
Class Form1

Private Sub Button1_Click( ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Logger.LogInfo(
" Entering " )
CallTest()
Logger.LogInfo(
" Exiting " )
End Sub


Private Sub CallTest()
Logger.LogInfo(
" Entering " )
Logger.LogInfo(
" Exiting " )
End Sub

End Class

打印日志如下:

2007-02-25 20:38:27,000 [5692] INFO  - Form1.Button1_Click: Entering
2007-02-25 20:38:27,015 [5692] INFO  - Form1.CallTest: Entering
2007-02-25 20:38:27,015 [5692] INFO  - Form1.CallTest: Exiting
2007-02-25 20:38:27,015 [5692] INFO  - Form1.Button1_Click: Exiting

红色字体部分就是通过 StackFrame 增加的信息。通过这种机制,可以使得Logger使用更简单,信息更丰富。是不是很棒?

对于大名顶顶的Log4Net大家一定都很熟悉。在项目应用中,往往会对 Log4Net 进行二次包装以满足项目的特殊需求。 比如自动记录调用 Log 方法的调用方法名,类名。利用 System.Diagnostics.StackTrace 来了解哪个方法调用了该方法(以及哪个方法调用了其调用者,等等)。从其名称可以看出,StackTrace 对象跟踪等待当前过程完成的所有悬挂过程。可以采用许多方 Exception in thread "main" java.lang.NullPointerException at com.example.myproject.Book.getTitle(Book.java:16) at com.example.myproject.Author.getBookTitles(Au... 输出 信息 如下: 2009-05-11 12:40:45 [ Thread-1:2231687 ] - [ ERROR ] Connection reset by peer: socket write error ja...
捕获到异常时,往往需要进行一些处理。比较简单直接的方式就是 打印 异常栈轨迹 Stack Trac e。说起栈轨迹,可能很多人和我一样,第一反应就是print Stack Trac e()方法。其实除了这个方法,还有一些别的内容也是和栈轨迹有关的。     1.print Stack Trac e()     首先需要明确,这个方法并不是来自于Exception类。Exception类本身除了定义了...
log4j是一个用于Java应用 程序 的日志管理工具,它允许开发者在代码 灵活地记录各种 信息 。在默认情况下,log4j 输出 的日志格式为文本格式,但有时候我们可能需要将其转换为JSON格式,以便更好地与其他系统集成或进行日志分析。 要实现log4j 输出 格式转为JSON,首先需要引入一个支持JSON格式 输出 的插件或者自定义一个JSON格式的布局。然后在log4j的配置文件 进行相应的配置,指定使用JSON格式的布局,例如可以使用log4j的PatternLayout布局来定义 输出 的格式,将其替换为JsonLayout。 接下来需要在代码 使用log4j记录日志时,指定相应的格式为JSON格式。这样,log4j就会以JSON格式 输出 日志 信息 ,包括各种字段的键值对形式,便于后续处理和分析。 此外,还可以通过配置log4j的过滤器和Appender来对日志进行更细致的处理,例如添加额外的字段或者按照特定的规则将日志 输出 到不同的地方。 总的来说,实现log4j 输出 格式转为JSON,需要在配置文件和代码 做一些调整,以及可能引入额外的插件或者布局。这样就可以充分 利用 log4j的强大功能,同时将日志 输出 格式转为JSON,方便后续的处理和分析。