logback 属性覆盖,如何在Logback日志记录中覆盖方法名称?

I am trying to implement a logging concept with AOP but while printing the log I need give my own method name instead of the default.

Update (based on the comments from @glitch):

I am using the %M conversion specifier to tell Logback to include the method name in each log event.

I want to replce the Logback derived method name for some log events, spcifically; for the log events emitted by my AOP joinpoint.

I do not want to write the 'actual method name' somewhere else in the log event; I want the method name to be used and to be correct i.e. to represent the original method rather than the interception method.

解决方案

The %M conversion specifier is implemented by ch.qos.logback.classic.pattern.MethodOfCallerConverter. The implementation is quite simple:

public String convert(ILoggingEvent le) {

StackTraceElement[] cda = le.getCallerData();

if (cda != null && cda.length > 0) {

return cda[0].getMethodName();

} else {

return CallerData.NA;

}

}

So, you could provide your own implementation. Something like this perhaps ...

public class CustomMethodOfCallerConverter extends ClassicConverter {

public String convert(ILoggingEvent le) {

StackTraceElement[] cda = le.getCallerData();

if (cda != null && cda.length > 0) {

if (le.getMDCPropertyMap().containsKey("CUSTOM_METHOD_NAME_KEY")) {

String methodName = le.getMDCPropertyMap().get("CUSTOM_METHOD_NAME_KEY");

// remove the MDC entry since we are only using MDC to pass the custom method name into this converter

le.getMDCPropertyMap().remove("CUSTOM_METHOD_NAME_KEY");

return methodName;

} else {

return cda[0].getMethodName();

}

} else {

return CallerData.NA;

}

}

}

... which uses MDC to pass the actual method name from your joinpoint. In your joinpoint you would put the MDC value before invoking on the logger e.g.

MDC.put("CUSTOM_METHOD_NAME_KEY", pjp.getSignature().getName()));

But ... Logback does not provide any way for you to declare your own custom converter. The converters in use by Logback are declared in a static initializer on

ch.qos.logback.classic.PatternLayout and this is not extensible/overrideable. So, I think your options are:

Create a ch.qos.logback.classic.pattern.MethodOfCallerConverter class in your own code base i.e. replace Logback's own MethodOfCallerConverter with your own. You could use the example I provided above and - as long as you put the CUSTOM_METHOD_NAME_KEY value in MDC before invoking on the logger - it will do what you want

Continue to use the %M specifier but for AOP intercepted methods add an additional MDC attribute to display the actual method name. This would result in the Logback method name appearing in all log output with the actula method name appearing too (when available). For example:

// put the actual method name in MDC

MDC.put("actualMethodName", pjp.getSignature().getName());

// specify your pattern - in logback.xml - to include the actual method name

%d{yyyy-MM-dd HH:mm:ss}|[%thread]|%-5level|%logger{36}|%M%X{actualMethodName:-}|%msg%n

Stop using the %M specifier and log all method names via MDC. This would result in the correct method name appearing but it would require you to update MDC in every method (which sounds quite awkward). For example:

// put the actual method name in MDC

MDC.put("actualMethodName", pjp.getSignature().getName());

// specify your pattern - in logback.xml - to include the actual method name

%d{yyyy-MM-dd HH:mm:ss}|[%thread]|%-5level|%logger{36}|%X{actualMethodName}|%msg%n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值