- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Spring Boot 使用 LoggingApplicationListener
自动初始化底层日志系统。如果我正在开发的应用程序独立或独立运行,这是一件好事。
然而,我正在开发一个将部署到 WSO2 应用服务器的 Web 应用程序,它提供统一的日志记录(使用 log4j),具有中央日志级别管理(在运行时通过 Web 界面)、业务报告等功能。
如果我“按原样”使用 Spring Boot,它会完全自行记录所有内容。我的第一个镜头是删除 spring-boot-starter-logging
并手动添加 slf4j-api
作为 provided
。这在某种程度上是有效的,因为 LoggingApplicationListener
现在覆盖了 WSO2 提供的全局日志管理器的设置(甚至导致全局 appender 被关闭)。
我想出的唯一“解决方案”是通过反射移除监听器。然后 Spring Boot 开始正常运行(通过全局记录器进行记录,而不是覆盖预定义的日志级别、输出格式、附加程序等)
“解决方案”看起来像这样:
@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
public static void main(String... args) {
SpringApplication.run(MyApp.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
try {
Field appField = SpringApplicationBuilder.class.getDeclaredField("application");
appField.setAccessible(true);
SpringApplication app = (SpringApplication)appField.get(builder);
Field listenersField = SpringApplication.class.getDeclaredField("listeners");
listenersField.setAccessible(true);
List<ApplicationListener<?>> listeners = (List<ApplicationListener<?>>) listenersField.get(app);
for (int i = listeners.size() - 1; i >= 0; --i) {
if (listeners.get(i) instanceof LoggingApplicationListener) {
listeners.remove(i);
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return builder.sources(MyApp.class);
}
}
对于我的问题,有没有更好的解决方案,而且我在研究和代码分析过程中可能忽略了这些问题?
最佳答案
谢谢你的帖子,很有帮助。我在使用 Websphere Aplication Server 时遇到了同样的问题:初始化 spring boot 上下文后,我没有更多日志。这个解决方案是等效的,但通过覆盖 SpringBootServletInitializer 的运行方法不那么脏:
@Override
protected WebApplicationContext run(SpringApplication application) {
Collection<ApplicationListener<?>> listeners =
new ArrayList<>();
for (ApplicationListener<?> listener: application.getListeners()) {
if (!(listener instanceof LoggingApplicationListener)) {
listeners.add(listener);
}
}
application.setListeners(listeners);
return super.run(application);
}
关于java - Spring 启动 : LoggingApplicationListener interfering with Application Server logging,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29609996/
我有一个 Spring Web MVC 应用程序在 Tomcat 7 中运行,在 Tomcat 前面有 nginx 1.1.19。 我已经使用 Spring Security 启用了 Cache-Co
我正在使用 CSS :before 和 :after 将虚线视觉元素添加到 div: 但它似乎干扰了“编辑”按钮元素。 (当父 div 的 :before 和 :after CSS 存在时,编辑按钮不
我有一个问题,我多次尝试解决,但仍然失败。 我不确定问题是否属于“你不了解 JavaScript 基础知识”这一类,还是属于“你不了解 paper.js”这一类。 背景 代码在node.js环境中运行
我正在构建一个 iOS 应用程序扩展(在本例中是一个音频单元插件)。该代码混合了 Objective-C、C++ 和 C 文件。 当我在主机中运行我的音频单元的一个实例时,它工作正常,但一旦我打开另一
我有两个缩小的 html 文件,i1.html 和 i2.html——它们几乎相同,应该很容易运行。 i1.html (page1) 有一个 popup1 页面,允许用户停留在 page1 或转到 i
我只是尝试在 Google Play 商店中发布我的应用程序更新,我没有更改代码中的任何内容,只是增加了 gradle 中的“版本代码”并发布了该应用程序,但该应用程序被拒绝了(3次)因为违反政策:
这是我的问题的简化版本。我有一个属性类。它有像 has_initalized 这样的数据,我在这个例子中删除了这些数据。 当我调用一个使用 T 的函数时,它很好。但是 T& 不是,所以我决定编写它的
让我们从一个例子开始: @interface myClass : NSObject { NSString * title; } -(id)initWithTitle:(NSString*)ti
我是使用 pthreads 的新手。我想创建一个程序,其中六个不同的线程将分别输出不同的数字。线程可以按任何顺序运行,但是每个线程只能运行一次。 因此,可能的输出是: Thread: 5 Thread
我正在使用 C++、Qt 和 OpenGL 编写着色器编辑器。我希望渲染的场景具有交互性,并且我希望用户能够使用来自周围环境的变量,例如鼠标坐标或窗口尺寸。 就目前而言,基本上每次有任何类型的输入(鼠
我有一个 ViewPager2 和一个 FragmentStateAdapter 并且屏幕外页面限制为 1: viewPager.setAdapter(new MyFragmentStateAdapt
我在 UIScrollView 中有一个 UIDatePicker。但 UIDatePicker 不响应滚动触摸。这是滚动的 ScrollView 。在网上阅读了一些文档,我将“延迟内容触摸”设置为“
我目前正在编写一个基本网站的代码,以便在编写网站方面获得更多经验,但我遇到了一个问题:背景图像和导航栏。问题是,每次我在 HTML 代码中包含我的背景图片时,它都会干扰我的导航栏,要么完全删除它,要么
这是我的代码: #include #include #include int individualAverage(int data[][20],int j) { int k,averag
Spring Boot 使用 LoggingApplicationListener 自动初始化底层日志系统。如果我正在开发的应用程序独立或独立运行,这是一件好事。 然而,我正在开发一个将部署到 WSO
我在 html5 拖放方面遇到了一些问题。我没有看到一个简单的方法。基本上我有一些“盒子”,里面有一些其他的 html 元素。父框是可拖动的,它们可以相互放置。 我在 body 上绑定(bind)了
我正在使用 DFS Java API 处理 EMC Documentum 6.6。 目前我正在寻找一种在不干扰系统标签的情况下向文档添加和更新符号标签的方法。 据我了解,所有标签(系统标签和符号标签)
我是一名优秀的程序员,十分优秀!