java log4j扩展_java – 当我扩展log4j时,为什么我不能在log...

我扩展了log42记录器.

想法:

我应该将枚举传递给log方法,以便在运行时选择appender.

我的界面:

public interface MyLoggerInterface {

void info(String logMessage, MyLoggerAppenderEnum... appender);

public static MyLoggerInterface getLogger(Class aClass, MyLoggerAppenderEnum... appender) {

return MyLoggerInterfaceImpl.getLogger(aClass, appender);

}

}

执行:

public class MyLoggerInterfaceImpl extends Logger implements MyLoggerInterface {

private static final String FQCN = MyLoggerInterfaceImpl.class.getName();

protected MyLoggerInterfaceImpl(LoggerContext context, String name, MessageFactory messageFactory) {

super(context, name, messageFactory);

}

public static MyLoggerInterface getLogger(Class aClass, MyLoggerAppenderEnum... appenders) {

return getLogger(aClass.getName(), appenders);

}

private static MyLoggerInterface getLogger(String name, MyLoggerAppenderEnum... appenders) {

return (MyLoggerInterfaceImpl) org.apache.logging.log4j.LogManager.getLogger(name);

}

@Override

public void info(String logMessage, MyLoggerAppenderEnum... appenders) {

this.log(FQCN, Level.INFO, null, new SimpleMessage(logMessage), null, appenders);

}

private void log(String fqcn, Level level, Marker marker, Message message, Throwable throwable, MyLoggerAppenderEnum... appenders) {

Arrays.stream(appenders)

.map(appender -> findAppenderByName(appender))

.collect(Collectors.toList())

.forEach(appender ->

appender.append(

new Log4jLogEvent(this.getName(), marker, fqcn, level, message, new ArrayList(), throwable)

)

);

}

private Appender findAppenderByName(MyLoggerAppenderEnum appenders) {

return this.getAppenders().get(appenders.name());

}

}

但请注意,在log4j 2.X中,LoggerFactory已从1.X版本中删除.所以我实现了其他类,以避免ClassCastException(Logger to MyLoggerInterfaceImpl).

所以. MyContext:

public class MyLoggerContext extends LoggerContext {

public MyLoggerContext(String name) {

super(name);

}

@Override

protected Logger newInstance(final LoggerContext ctx, final String name, final MessageFactory messageFactory) {

return new MyLoggerInterfaceImpl(ctx, name, messageFactory);

}

}

上下文选择器:

public class MyLoggerContextSelector implements ContextSelector {

private final LoggerContext CONTEXT = new MyLoggerContext("MyLoggerContext");

public LoggerContext getContext(String fqcn, ClassLoader loader, boolean currentContext) {

return CONTEXT;

}

public LoggerContext getContext(String fqcn, ClassLoader loader, boolean currentContext, URI configLocation) {

return CONTEXT;

}

public List getLoggerContexts() {

return Arrays.asList(CONTEXT);

}

public void removeContext(LoggerContext context) {

}

}

上下文工厂:

public class MyLoggerLog4jContextFactory extends Log4jContextFactory {

public MyLoggerLog4jContextFactory() {

super(new MyLoggerContextSelector(), new DefaultShutdownCallbackRegistry());

}

}

和经理:

public class MyLoggerManager {

public static void initialize(String configURL) {

try {

System.setProperty("log4j2.loggerContextFactory", "ge.test.core.logging.MyLoggerLog4jContextFactory");

System.setProperty("Log4jLogEventFactory", "org.apache.logging.log4j.core.impl.DefaultLogEventFactory");

Configurator.initialize(null, configURL);

} catch (Exception ex ) {

System.err.println("Cannot initialize Log4J using configuration url:" + configURL);

}

}

}

凉!一切正常!!!和用法:

MyLoggerManager.initialize("Log4j2.xml");

MyLoggerInterface logger = MyLoggerInterface.getLogger(AppLauncher.class);

logger.info("test", MyLoggerAppenderEnum.Console);

但问题是,如果我使用扩展自定义记录器,我无法记录方法名称和行.布局是正确的!如果我不使用扩展自定义记录器,也会记录mehtod名称和行!

...

...

...

...

题:

我也想记录方法名称和行.但是我扩展我的记录器类后它不起作用(布局syntaxt是正确的!)

我找到了扩展记录器示例here

我的代码在gitlab这里

我使用log4j 2.9.1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随与博主沟通,博主会及解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随与博主沟通,博主会及解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随与博主沟通,博主会及解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随与博主沟通,博主会及解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随与博主沟通,博主会及解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随与博主沟通,博主会及解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随与博主沟通,博主会及解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随与博主沟通,博主会及解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值