当前位置: 首页 > 知识库问答 >
问题:

如何一起使用log4j 2.0和slf4j和Commons日志记录

拓拔俊艾
2023-03-14

我目前正在启动一个新的Webapp(在tomcat 6上运行)。我有使用slf4j的组件和使用commons日志的组件。我计划使用log4j 2.0作为日志实现,原因有几个(主要针对Appender:SocketAppender和SyslogAppender,但也因为在不丢失日志事件的情况下升级配置重新加载)

现在我的问题是:-我应该用哪个接口来编程我的新类?loag4j还是slf4j?或者甚至是公共日志?

>

  • 部署JAR的首选方法是什么?将它们放在我的应用程序war中,还是放在tomcat库中?

    我需要部署哪些jar?log4j(包括slf4j和Commons绑定)、Commons日志记录(slf4j-api-1.7.2.jar)和slf4j api(slf4j-api-1.7.2.jar)

  • 共有3个答案

    楚嘉
    2023-03-14

    请注意,我没有使用Log4J 2.0,尽管我使用了SLF4J和Log4J 1.2。话虽如此,我将回答您的问题如下:

      < li计划。它有一个漂亮、简单的API,这是您可能需要的日志框架的所有东西。另外,如果出于某种原因,您决定切换到logback或Log4J 1.2或其他版本,而不是Log4J 2.0,您可以在后端切换出jar。 < li >一定要将jars放在应用程序大战中。您几乎不应该将jar放到应用服务器的< code>lib目录中。否则,它们将影响该应用服务器上的所有web应用程序,而不仅仅是您的应用程序。此外,应用服务器的< code>lib目录中的jar不能通过部署webapps来控制,而是必须手动管理。 < li >看起来您需要< code>slf4j-api-1.7.2.jar 、< code > log4j-to-slf4j-2.0-beta 4 . jar 、< code>log4j-2.0-beta4.jar和< code > log4j-core-2.0-beta 4 . jar ,以及任何依赖项。我确信Maven会带来所需的依赖项,如果你正在使用的话。
    慕学海
    2023-03-14

    我使用slf4j和log4j2,并使用

    slf4j-api-1.7.12.jar
    log4j-api-2.2.jar
    log4j-core-2.2.jar
    log4j-slf4j-impl-2.2.jar
    jcl-over-slf4j-1.7.12.jar(get rid of commons logging jars)
    

    如果您的应用服务器有冲突的版本,您可能需要使用一些供应商特定的类加载器设置来覆盖

    e、 在weblogic 12c中,我在我的weblogic中有这个。src/main/webapp/WEB-INF中的xml

    <?xml version="1.0" encoding="UTF-8"?>
    <weblogic-web-app 
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd 
    http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.5/weblogic-web-app.xsd">
    <container-descriptor>
        <prefer-application-packages>
            <package-name>org.apache.log4j.*</package-name>
            <package-name>org.apache.commons.logging.*</package-name>
            <package-name>org.apache.commons.lang.*</package-name>
            <package-name>org.apache.commons.io.*</package-name>
            <package-name>org.apache.commons.collections4.*</package-name>
            <package-name>org.slf4j.*</package-name>
        </prefer-application-packages>
    </container-descriptor>
    <jsp-descriptor>
        <keepgenerated>true</keepgenerated>
        <debug>true</debug>
    </jsp-descriptor>
    <context-root>/cnfg</context-root>
    </weblogic-web-app>
    
    郑星辰
    2023-03-14

    我应该把我的新类编程到哪个接口?loag4j还是slf4j?

    如果你要使用SLF4J,编程到那个接口。它为底层日志实现提供了最大的灵活性。slf4j的目的是成为一个可以编程的接口,所以将来如果你决定切换到logback,你就不必重写代码。

    部署JAR的首选方法是什么?将它们放在我的应用程序war中,还是放在tomcat库中?

    把他们放在你的战争中。

    将JAR放在Tomcat libs目录中的唯一原因(imo)是它们是否需要加载本机库。由于Java不允许您从两个不同的类加载器加载相同的本机库,因此您需要将其放在一个公共位置。但这不适用于这里。

    有些人认为lib目录是一种节省空间的方法。当“服务器级”机器有1 GB的RAM时,这可能是有效的,但现在已经不是了。避免lib意味着您可以避免大多数难以调试的类加载问题。

    我需要部署哪些jar?

    • slf4j api是基本api
    • slf4j-log4j12将实际记录路由到Log4J
    • jcl-over-slf4j拦截共享日志记录,并将其通过slf4j路由(到Log4J)
    • log4j将是您的物理日志框架

    我假设您已经有了Log4J的配置,并且/或者已经习惯了编写这个配置。如果没有,并且您所关心的是处理内部使用log4j的代码,那么有< code>log4j-over-slf4j,它将拦截Log4J调用。然后你需要挑选一个框架,比如Logback。

    (注意:我最初添加了指向所有这些包的链接,但没有足够的代表来发布它们。所以这里有一个指向Maven存储库的链接,突出显示了所有SLF4J包)

     类似资料:
    • 问题内容: 我已经将一个Web应用程序部署到服务器上。我的应用程序使用和。但是,并非所有日志记录消息都已写入文件。 在我的课堂上,我有: 我的文件在本地计算机上运行良好,并且已正确部署。 我看到正在写入的应用程序生成的错误消息没有写入我的。由于输出模式的格式与我的模式不同,因此看起来的日志消息来自其他日志框架。我在中看到的日志记录如下: 我的log4j模式是这样的: 一些日志记录出现在我的文件日志

    • 但是,部署在同一台服务器上的一些其他项目使用Tomcat的lib目录中存在的slf4j和log4j库,我无法删除这些库。 Tomcat lib目录中存在的Slf4J和Log4J版本 SLF4J-API-1.4.2 当我从Tomcat的lib目录中删除这些库并使用project的pom中提到的库时,我的项目运行良好 当我注释项目的pom文件中的依赖项并使用下面Tomcat的lib中的依赖项时,会引发

    • 在我的项目中,我使用slf4j+log4j进行日志记录。我刚接触java,正在尝试了解日志记录是如何工作的。如果我想使用log4j以外的其他日志框架,比如java.util.logging,那么我就不需要更改任何代码,因为我使用的是SLF4J。我只需要移除log4j的jar,并添加java.util.logging的二进制。我试着了解当我们不改变任何代码时,它是如何工作的。如果问题不清楚,请让我知

    • 我在Weblogic服务器上运行一个web应用程序(我并不熟悉)。 通过JVM args将带有日志级调试的log4j配置传递给应用程序。在日志文件中,我还可以找到一些调试级别的日志条目。 到目前为止还不错。 在调试期间,我发现一些对logger.debug()的调用不在日志文件中。 如果在调试过程中执行一步,我会在记录器:org.slf4j.impl.jdk14LoggerAdapter(com.

    • 在我的Java应用程序中,我使用SLF4J+Logback进行日志记录。我在开发环境中使用调试级日志记录,在生产环境中使用错误级日志记录。但是有一些消息我无论如何都想要记录下来,无论日志级别如何(类似于,但使用的是logger)。 有什么切实可行的方法可以实现这一点吗?我可以使用error或更低的级别,但我想做的是给出一些信息,所以在语义上是错误的,它不是错误。 我可以在我的中为我的类定义另一个记

    • 我有这些具体要求: 需要能够登录致命级别 现在,我的实现如下: 这是我的模式布局(在yaml): 以下是我的日志输出: 你知道如何有效地从日志输出中删除“错误”吗? 非常感谢你