标签: slf4j

可分发库中的SLF4J,如何获取Logger

我想分发一个依赖于SLF4J记录器接口的库。获得可以很好地集成到任何其他项目中的记录器的最佳实践方法是什么?对于非结构化的问题风格,我仍然试图弄清楚所有这些东西是如何粘合在一起的。

在其他项目中我总是使用这段代码,因为我想获得一个自定义记录器:

private final static Logger LOGGER = LoggerFactory.getILoggerFactory().getLogger(NAME_OF_APP);
Run Code Online (Sandbox Code Playgroud)

如果我创建了类org.slf4j.impl.StaticLoggerBinder并拥有其他一些库,那么即使我只是调用LoggerFactory.getLogger(NAME_OF_APP)或使用了一些默认的 slf4j 工厂,是否也会使用其中定义的工厂 ?

我希望用户能够使用自己的工厂和记录器,那么更喜欢哪种方式,最重要的是为什么?

java logging slf4j

5
推荐指数
1
解决办法
1010
查看次数

MDC 不适用于 SLF4J

我们使用 SLF4J(使用 log4j)作为我们的日志框架。我们正在尝试利用 Log4j 支持的在线文档的 MDC 功能。

使用 SLF4J 时 MDC 不起作用。但是,当使用 log4j 时,它工作得很好。文档说明只要底层框架支持MDC,SLF4J就应该支持。

我们正在使用 SLF4J 1.6.4 ( slf4j-apislf4j-log4j12slf4j-simple已作为依赖项添加到我们的pom.xml) 中。

某处是否存在差异/不匹配?我们是否缺少任何依赖项?任何输入将不胜感激。

logging slf4j mdc

5
推荐指数
1
解决办法
3194
查看次数

log4j 到 logback(迁移)

我们在当前项目中使用 log4j+commons-logging。现在我们正在从 log4j 迁移到 Logback,那么我们可以使用 logback.xml 替换 log4j.properties 还是必须将 log4j 转换为 SLF4J?

根据建议,我保持代码不变,我有这样的代码

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;

public class LoggerUtil
{
    // logger
    static Logger logger;

    // applications

    public static String APP_AccInqSERVICE = "AccInqApp";
Run Code Online (Sandbox Code Playgroud)

上面的代码是 LoggerUtils.java 的一部分,它在 commonutils 中。现在有 AccInqWeb 模块,其中使用 LoggerUtils 进行这样的日志记录

 LoggerUtil.info(LoggerUtil.APP_ACCT_INQ, AccountInqService.class,
                "searchAccountSnapshot", "method starts....");
Run Code Online (Sandbox Code Playgroud)

我保留了 LoggerUtils.java 代码,包括 log4j-over-slf4.jar 并删除 log4j.jar 现在它编译正常,我在服务器上部署 commonutils 模块,并添加 add -Dlogback.configurationFile=C:\u001\ isuser\tesbea\user_projects\domains\iservices??10\resources\logback.xml in setDomainEnv.cmd 和 logback jar 我在类路径上设置了 logback jar 但我没有得到任何日志我们使用 WLS10.3.0 有什么我需要的做配置

logging log4j logback slf4j weblogic-10.x

5
推荐指数
1
解决办法
7171
查看次数

当记录器级别 = DEBUG 时,SLF4J 为 isDebugEnabled() 返回 false

我有一个奇怪的问题。

if (logger.isDebugEnabled()) {  
    logger.debug("Message=\"About to get the application details\" GroupID={}", iGroupID);  
}
Run Code Online (Sandbox Code Playgroud)

我有这个代码,当检查记录器时。的级别logger = DEBUG,但该方法logger.isDebugEnabled()仅返回 false。

我正在使用 SLF4J 和 Maven 添加依赖项。

log4j slf4j maven

5
推荐指数
0
解决办法
1889
查看次数

tomcat 日志中 SLF4JBridgeHandler 中的处理程序错误

我的 tomcat 日志当前混合了不同格式的日志消息。所以我尝试使用 JUL 到 SLF4J 桥来设置 SLF4J。

我最初收到的日志消息如下

五月 23, 2013 7:57:17 PM org.apache.catalina.core.StandardService startInternal
INFO: 启动服务 Catalina
五月 23, 2013 7:57:17 PM org.apache.catalina.core.StandardEngine startInternal
INFO: 启动 Servlet 引擎:Apache Tomcat/7.0.29
2013-05-23 19:57:47,224 [localhost-startStop-1]从类路径资源加载XML bean定义[META-INF/cxf/cxf.xml]
2013-05-23 19: 57:47,246 [localhost-startStop-1] 从类路径资源加载 XML bean 定义 [META-INF/cxf/cxf-servlet.xml]

我从这里关注了博客.. http://hwellmann.blogspot.com/2012/11/logging-with-slf4j-and-logback-in.html

我正在为 SLF4J 使用以下 jar: jul-to-slf4j-1.7.5.jar、slf4j-api-1.7.5.jar

并在logging.properties中

处理程序 = org.slf4j.bridge.SLF4JBridgeHandler

我目前没有收到混合消息,但在启动 tomcat 时收到。它不是打印tomcat格式,而是抛出Handler错误

下面是日志的片段

Handler error
java.lang.ClassNotFoundException: org.slf4j.bridge.SLF4JBridgeHandler
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:521)
    at …
Run Code Online (Sandbox Code Playgroud)

logging tomcat logback slf4j java.util.logging

5
推荐指数
1
解决办法
7101
查看次数

log4j:WARN 无法识别的元素rollingPolicy

当我的应用程序启动时,我在日志中收到了这个警告

log4j:WARN Unrecognized element rollingPolicy
Run Code Online (Sandbox Code Playgroud)

试图谷歌寻找答案,但添加 apache-log4j-extras-1.1.jar 并没有帮助我。

我正在slf4j-log4j12 1.7.2log4j 1.2.17.

log4j slf4j

5
推荐指数
1
解决办法
4061
查看次数

如何找出slf4j使用的是哪种实现

我正在使用slf4j,它正在记录日志,但是它并未使用logback,因为它应该这样做(因为logback(-test).xml中的更改不会影响日志记录行为。

This is my POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.goodgamestudios</groupId>
    <artifactId>Icosphere</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>
    <name>Icosphere Data Platform</name>
    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <version.arquillian_core>1.1.8.Final</version.arquillian_core>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.arquillian</groupId>
                <artifactId>arquillian-bom</artifactId>
                <version>${version.arquillian_core}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.13</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>com.mapr.hadoop</groupId>
            <artifactId>maprfs</artifactId>
            <version>4.0.2-mapr</version>
        </dependency>
        <dependency>
            <groupId>com.mapr.hadoop</groupId>
            <artifactId>maprfs-core</artifactId>
            <version>1.0.3-mapr-2.1.3.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId> …
Run Code Online (Sandbox Code Playgroud)

java logging slf4j pom.xml

5
推荐指数
1
解决办法
719
查看次数

读取通过slf4android记录的文件?

我正在使用slf4android(https://github.com/bright/slf4android)编写日志,但是如何阅读它们并不明显(理想情况下我只想将它们下载到我的计算机上).其他应用无法访问该应用的内部存储空间.我可以配置slf4android来登录共享目录吗?我试过这个,但我得到了通知:

FileLogHandlerConfiguration fileHandler = LoggerConfiguration.fileLogHandler(this);
File lol = this.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
fileHandler.setFullFilePathPattern(fileHandler.toString() + "/my_log.%g.%u.log");
LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler);
Run Code Online (Sandbox Code Playgroud)

logging android slf4j slf4android

5
推荐指数
2
解决办法
265
查看次数

Log4j2和Spring 4

我无法使Log4j2 在日志文件上写入Spring和Spring Security日志消息(后者我绝对需要解决问题)。我在这里和其他地方已经读了很多书(当然,在Spring参考书中),但是我无法找到适合我的情况的解决方案。

重要的是要注意,在以下两种解决方案中,地雷日志消息和休眠消息均已正确写入文件中。该问题仅影响Spring消息。

据我了解,Spring使用jcl(公共日志),并且有两种方法可以让Spring使用Log4j2:

  • 只需添加网桥log4j-jcl(jcl-> log4j2)
  • 将SLF4J与jcl-over-jcllog4j-slf4j-impl一起使用(jcl-> slf4j-> log4j2)

我试图从所有其他依赖项中排除commons-logging,以便手动控制其包含。在第一个解决方案中,我让它包括在内,在第二个解决方案中,我排除了它,但是我对此主题已有不同的见解。无论如何,在两种情况下,Spring都不记录。

我可以看到hibernate使用jboss-logging。这是为什么它在两种配置下都起作用的原因吗?Spring日志记录是否可以包含它?

应用服务器可以在这方面出问题吗?也许默认情况下加载了一些库,这些库将覆盖应用程序库,使事情一团糟?

这是我的环境:

  • Java 1.6
  • Servlet 2.5
  • Oracle Weblogic 12.1
  • Spring MVC 4.3.4。发布
  • Spring Security 4.2.0。发布
  • Log4j 2.3(最新版本与Java 6兼容)
  • Hibernate实体管理器4.2.21.final
  • SLF4J 1.7.22

我猜这里有一个依赖问题:一些不应该存在或缺少的库。

编辑: 从我的依赖项树中,我没有看到spring-coreon 的依赖项commons-logging,如引用所述。我可以看到一个spring-data-jpaslf4jjcl-over-slf4jjcl-over-sl4j正如rgoers建议的那样,shl 的存在应该是问题所在。我将更新结果...

因此,这是我的pom.xml依赖项部分(如您所见,有两个不同的日志记录依赖项配置,其中一个已注释;此配置都使我的和休眠日志运行良好,但是两个都不使Spring日志运行):

<properties>
    <spring.version>4.3.4.RELEASE</spring.version>
    <spring.security.version>4.2.0.RELEASE</spring.security.version>
    <!--<spring.data.jpa.version>1.10.5.RELEASE</spring.data.jpa.version>-->
    <spring.data.jpa.version>1.7.2.RELEASE</spring.data.jpa.version>
    <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
    <log4j.version>2.3</log4j.version>
    <hibernate.validator.version>5.3.2.Final</hibernate.validator.version>
    <hibernate.entitymanager.version>4.2.21.Final</hibernate.entitymanager.version> <!-- LAST VERSION SUPPORTING JPA …
Run Code Online (Sandbox Code Playgroud)

spring slf4j log4j2

5
推荐指数
1
解决办法
3804
查看次数

Logback:动态更改特定程序包中每个类的日志级别

我正在使用SLF4J + Logback的项目中工作,希望能够找到一种通过使用REST API调用来配置不同范围的日志级别的方法。该调用接收具有范围(类,包或根路径)和所需日志记录级别的对象。我项目中具有记录器的每个类都使用一个静态的Logback记录器。

我使用了其他Stack Overflow答案和Logback手册来找到解决方案,以更改单个类的日志记录级别:

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Logger target = loggerContext.getLogger(DESIRED_CLASS_PATH);
target.setLevel(DESIRED_LOGGING_LEVEL);
Run Code Online (Sandbox Code Playgroud)

这适用于该班。但是,我尝试使用根记录器更改项目中所有类的所有记录器,方法是:

Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.setLevel(DESIRED_LOGGING_LEVEL);
Run Code Online (Sandbox Code Playgroud)

这只会更改根记录器,并且当我尝试打印项目中任何类的日志级别时,它都不是所需的日志级别。我尝试在logback.xml文件中声明一个记录器,该记录器声明了一个包记录器(包含所有我的类和子包的包),并尝试修改它以更改子类记录器,但这没有用。这是我的logback.xml文件:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
        </layout>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>

    <logger name="my.uppermost.package" level="info" additivity="false">
        <appender-ref ref="STDOUT"/>
    </logger>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我是否误解了Logback的代码或功能?如果不是,是否可以输入我的REST API调用的程序包路径,并更新该程序包中包含的类的所有记录器?

提前致谢。

java logging logback slf4j

5
推荐指数
1
解决办法
436
查看次数