JUL 适配器不适用于 Jersey

2024-03-30

我正在尝试使用七月适配器将 Java Util Logging 委托给 Log4j2。更准确地说,任何使用 JUL 生成日志的第三方库都应该委托给 Log4j2。

作为一个简单的练习,我创建了一个使用库的独立应用程序(我创建这个库是为了测试目的,它使用 JUL 生成日志)来测试七月适配器。当我按照描述更改日志管理器时here https://logging.apache.org/log4j/2.0/log4j-jul/index.html我可以看到效果。而且效果很好。

她的代码:

import org.apache.logging.log4j.LogManager;
import com.ah.loggen.LogGenerator;

public class TestLogging {

    static {
        System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
    }

    private static final org.apache.logging.log4j.Logger LOG4J = LogManager.getLogger();

    public static void main(String[] args) {
        System.out.println("Java Util Logging");
        LogGenerator.generateError("This is an error message.");
        LogGenerator.generateInfo("This is an info message.");
        LogGenerator.generateWarning("This is a warning message.");
        System.out.println("LOG4J");
        LOG4J.info("[LOG4J] This is an info message.");
        LOG4J.error("[LOG4J] This is an error message.");
        LOG4J.warn("[LOG4J] This is a warning message.");
    }
}

所需依赖项:

dependencies {
    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.10.0'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.10.0'
    compile group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.10.0'

    compile files('lib/loggen.jar')

    testCompile 'junit:junit:4.12'
}

但是,我无法让它在使用 Jersey 的 Java Web 应用程序上运行。 Jersey 使用 JUL,我正在尝试将其与 Log4j2 桥接。

这是build.gradle file:

apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'eclipse-wtp'
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'

repositories {
    mavenCentral()
}

task wrapper(type: Wrapper) {
    gradleVersion = '4.4.1'
}

dependencies {
    compile "javax.ws.rs:javax.ws.rs-api:2.1"
    compile "org.glassfish.jersey.core:jersey-server:2.22.1"
    compile "org.glassfish.jersey.containers:jersey-container-servlet:2.22.1"
    compile "org.glassfish.jersey.media:jersey-media-json-jackson:2.22.1" 
    providedCompile "javax.servlet:javax.servlet-api:3.1.0" 

    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.8'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.8'
    compile group: 'org.apache.logging.log4j', name: 'log4j-web', version: '2.8'
    compile group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.8'
}


gretty {
    servletContainer = 'tomcat8'
    httpPort = 8081
}

我尝试了这些选项:

  1. 更改扩展类中的日志管理器Application.

    package com.ahoxha.test;
    
    import java.util.HashSet;
    import java.util.Set;
    import javax.annotation.PostConstruct;
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    import com.ahoxha.filters.JerseyLoggingFilter;
    
    @ApplicationPath("")
    public class HelloApplication extends Application {
        @Override
        public final Set<Class<?>> getClasses() {
            final Set<Class<?>> classes = new HashSet<>();
            classes.add(Hello.class);
            classes.add(MessageResource.class);
            classes.add(JerseyLoggingFilter.class);
            return classes;
        }
    
        @PostConstruct
        public void init() {
            String cn = "org.apache.logging.log4j.jul.LogManager";
            System.setProperty("java.util.logging.manager", cn);
        }
    }
    
  2. 更改实现的类中的日志管理器ServletContextListener

    package com.ahoxha.context;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    
    @WebListener
    public class ContextInitializer implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("Initializing context.");
            System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("Context destroyed.");
        }
    }
    
  3. 除了上面的两个选项之外,我还尝试将日志管理器设置为static block(对于选项 1. 和 2.)

不幸的是,这些选择都不适合我。我想知道这件事应该在哪里完成。我有什么遗漏的吗?


java.util.logging.LogManager当 Web 应用程序容器如tomcat, gretty开始。加载时(在static block),此类检查的值java.util.logging.manager系统属性并创建Logger因此。一旦初始化,此类就不会再次初始化。

因此,对于 Web 应用程序来说,通过 Web 应用程序代码设置此系统属性为时已晚。

一种可能的解决方案是将此系统属性值传递给VM arguments到应用程序容器 -

-Djava.util.logging.manager="org.apache.logging.log4j.jul.LogManager"

在这种情况下,您必须提供log4j启动容器时的 jar 和配置文件,以便org.apache.logging.log4j.ju‌​l.LogManager可以通过加载System ClassLoader.

对于 tomcat,您必须加载以下 3 个 jarbootstrap.jar(tomcat启动),tomcat-juli.jar(记录)使其工作 -

log4j-jul
log4j-api
log4j-core

类似的方法也需要用于其他容器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JUL 适配器不适用于 Jersey 的相关文章

  • 如何让Spring RabbitMQ创建一个新的队列?

    根据我对rabbit mq的 有限 经验 如果您为尚不存在的队列创建新的侦听器 则会自动创建该队列 我正在尝试将 Spring AMQP 项目与rabbit mq 一起使用来设置侦听器 但出现错误 这是我的 xml 配置
  • 如何迭代所有注册表项?

    我正在尝试迭代所有注册表项以查找 包含 并删除 jre1 5 0 14 值 有办法做到吗 下面的代码只是在特定键下找到jre1 5 0 14 我确实想迭代所有的键 顺便说一句 if 子句获取是否等于 jre1 5 0 14 但如果它包含 j
  • 设置 SWT Shell 的默认字体

    有没有办法为整个 Shell 设置默认字体 以便任何新控件都将使用相同的字体 看来现在我必须为我创建的每个控件设置字体 这导致了太多的冗余 默认使用的字体由平台选择 请参阅中的其他信息 类字体 SWT 标准小部件工具包 http book
  • Java:高性能消息传递(单生产者/单消费者)

    我最初问这个问题here https stackoverflow com questions 3367192 java is while true loop in a thread bad whats the alternative 但我意
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • 如何识别 Java 中的不可变对象

    在我的代码中 我正在创建一个对象集合 这些对象将由各种线程以只有在对象不可变的情况下才安全的方式访问 当尝试将新对象插入到我的集合中时 我想测试它是否是不可变的 如果不是 我将抛出异常 我能做的一件事是检查一些众所周知的不可变类型 priv
  • Java Spring 应用程序存在内存泄漏。系统非堆内存不断增加

    我已使用 yourkit 分析器监视我的 Web 应用程序 保留最大大小的主要对象是 SessionFactoryImpl webappclassloader 和 CGlib 对象显示 spring crone调度程序会导致内存泄漏吗 我尝
  • 要打乱的键值(整数、字符串)列表的最佳结构

    我需要在 Java 中实现一个结构 它是一个键值列表 类型为整数 字符串 并且我想对其进行洗牌 基本上 我想做类似的事情 public LinkedHashMap
  • 哈希码是否用于加速集合中的对象查找?

    IIUC 相同类型的两个不同对象可以存储在 HashSet 中 即使两个对象在以下情况下返回相同的值 hashCode 叫做 例如根据本文 https eclipsesource com blogs 2012 09 04 the 3 thi
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 如何修复 Android 7.0 的 Spinner 模式下的 DatePickerDialog?

    我目前正在开发一个简单的项目 其中包含一个包含在 Web 视图中的网站 具有少量交互 以提高网站本身和 Android 移动设备之间的交互性 由于该网站包含用户生日的日期输入字段 因此我希望实现一个与所有设备兼容的旋转格式的日期选择器 我尝
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • Google Place Api:来自此 Android 客户端应用程序 com.package.name 的请求被阻止

    我在用PlaceAutocompleteFragment当我单击搜索字段 PlaceAutocompleteFragment 对话框消失时 我收到此错误 errors domain global re ason forbidden mess
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor

随机推荐

  • .htaccess - 301 重定向所有不带扩展名的文件以具有 .html 扩展名

    我需要将请求重定向到没有扩展名的文件 并附加 html 扩展名 http www mydomain com this to http www mydomain com this html 以下内容不会被重定向 http www mydoma
  • 在 KeyChainItemWrapper 中保存密码时崩溃

    Apple 在他们的中提供了 KeyChainItemWrapper 类GenericKeyChain 示例代码 http developer apple com library ios samplecode GenericKeychain
  • C# 3.5 DLR 表达式.动态问题

    我继承了一种小型脚本语言 并尝试将其移植到 DLR 以便更容易管理 到目前为止 一切都相当简单 我在尝试动态调用变量的成员时遇到了问题 当前的语言在 NET 上运行 并使用解析循环和反射来执行此操作 但我希望摆脱这种情况 这是脚本语言的示例
  • 在PE的导入表中添加一个条目

    我正在寻找一个命令行程序来向 PE 文件的导入表添加条目 我的目标是将一个新的导入函数从外部 DLL 添加到我的 EXE 然后使用 ollydbg 使用代码洞穴插入新代码 新代码将使用新导入的函数 实际上我已经实现了我的目标 但是要向我使用
  • 使用 LINQWhere 查询仅获取部分 ConfigurationManager.ConnectionStrings

    我的目标是使用 LINQWhere查询于ConfigurationManager ConnectionStrings控制台应用程序中的集合 假设一个新的 NET 4 5 控制台应用程序添加了 System Configuration 引用
  • 一个构造函数 - 多个参数

    我在一些 Java 编程竞赛中找到了一个任务 必须创建仅包含一个参数 文本 和一个构造函数的类 Sentence 这是示例测试代码 Sentence s1 new Sentence only CAT s2 new Sentence and
  • 用户“”登录失败

    我有一个 ASP Net MVC 网站 在本地测试时工作正常 我已将该网站放入您的 Windows Server 2008 计算机上的 IIS 7 中 该网站使用 net 会员提供商 当我尝试登录时收到以下错误 Login failed f
  • 使用python限制类实例的数量

    我的主类创建了一个简单的QmainWindows像这样 class mcManageUiC QtGui QMainWindow def init self super mcManageUiC self init self initUI de
  • 使用 perl 格式化字符串和日期

    我想转换 使用perl 05 26 2013 06 09 47 to 26 05 2013 06 09 47 另外我怎样才能将上面的日期和时间更改为 GMT 日期和时间 use DateTime Format Strptime qw my
  • 用户查找加密数据库字段

    本质上 我有一个保存用户数据的表 所有这些数据都是 AES 加密的 在 BLOB 字段中 这意味着这些字段都不能被索引 这将减慢该表上的任何查询 特别是因为在进行任何匹配之前整个表需要解密 WHERE AES DECRYPT user em
  • 从树视图 tkinter 复制项目

    我的一个 tkinter 应用程序中有一个树视图 我想知道是否真的可以通过用户右键单击来复制选定的字段 如果没有 是否有任何其他小部件允许用户复制 GUI 窗口中显示的选定字段 Code log Toplevel root log titl
  • javascript向函数添加属性

    假设我们有一个函数 function Rabbit console log shiv 现在 无需创建该函数的对象 我就可以分配该对象的属性 Rabbit bark function line console log name is line
  • 使用 Iso_Fortran_Env 设置函数的 Kind 值

    如何使用 ISO Fortran Env 的内在函数以 Fortran 2008 惯用的方式设置函数的返回 KIND 值 通常在主程序中 我可以使用 ISO Fortran 内在函数 如下所示 program name here use i
  • jQuery 事件适用于 Firefox,不适用于 Chrome

    我在代码中注册了一些点击事件 它们在 Firefox Windows 和 Mac 中正常运行 但在 Chrome 中无法执行 尝试过 Windows 和 Mac beta JavaScript 的目的是根据 select 元素的值显示正确的
  • 检查一个 Int 值是否大于或等于另一个 Int 值?价值? [复制]

    这个问题在这里已经有答案了 如何比较两个 Int 值 所以 我有这个 let limit Int let current Int Int self stringValue 但是当我尝试比较它们 大于或等于 时 if current gt s
  • 如何使 JAWS 等屏幕阅读器可以访问“正在加载”图标?

    所以 HTML 代码是这样的 div style display none img src PT LOADING gif alt Processing please wait title div 即使提供了 ALT 文本 在更改样式以显示图
  • 函数 while 循环中的 return 是如何处理的?

    我有一个函数 该函数内部有一个 while 循环 当我尝试使用 IF 语句在 while 循环内设置非局部变量 然后退出整个函数时 突然该变量不再设置 function EXAMPLE cat test txt while read LIN
  • insertRow 与appendChild

    向表中添加行时首选哪种方法 var tr tbl insertRow 1 or var tr document createElement tr tbl appendChild tr insertRow会好得多 这是支持的 http www
  • 为什么此 GeoTool 片段不生成可查看的 shapefile?

    我正在创建一个简单的程序 它从 csv 文件读取值并根据这些值创建 shp 文件 这是一个轻微的修改这个例子 http docs geotools org latest tutorials feature csv2shp html 形状文件
  • JUL 适配器不适用于 Jersey

    我正在尝试使用七月适配器将 Java Util Logging 委托给 Log4j2 更准确地说 任何使用 JUL 生成日志的第三方库都应该委托给 Log4j2 作为一个简单的练习 我创建了一个使用库的独立应用程序 我创建这个库是为了测试目