反正是否强制slf4j使用特定的日志记录提供程序(在我的情况下是logback)?在他们的文档中:
在类路径上找到了多个绑定
SLF4J API被设计为一次只与一个底层日志框架绑定.如果类路径上存在多个绑定,SLF4J将发出警告,列出这些绑定的位置.如果类路径上有多个绑定,请选择一个且只能使用一个绑定,并删除其他绑定.例如,如果类路径上同时包含slf4j-> simple-1.6.6.jar和slf4j-nop-1.6.6.jar,并且希望使用nop(> no-operation)绑定,则删除slf4j-类路径中的simple-1.6.6.jar.如果无法删除超级绑定,SLF4J仍将与一个日志框架/实现绑定.从版本1.6.6开始,SLF4J将命名它实际绑定的框架/实现类.
注意SLF4J发出的警告只是一个警告.
就我而言,我有log4j.jar,slf4j-log4j12.jar,log4j-over-slf4j.jar和所有的类路径中的logback罐子.我知道拥有slf4j-log4j12.jar和log4j-over-slf4j.jar在一起是错误的,但我的项目非常大,找到并排除maven依赖并不总是很简单.在这种情况下,slf4j甚至没有打印任何警告,因为我们只使用logback配置.我花了一天时间才明白这个罐子.
我想要的是强制slf4j通过JVM参数使用logback,例如,它可以打印警告,我可以在将来排除jar.
有什么方法可以覆盖logback配置吗?我知道我们在名为logback.xml的文件中定义了logback配置(通常存储在src/resources路径中),我知道通过使用<include>tag我们可以设置一个外部文件添加到logback.xml,如下所示:
<configuration>
<!--<include url="file:///d:/ServerConfig.xml"/>-->
<include file="${outPut}/ServerConfig.xml"/>
<logger name="Server" LEVEL="DEBUG">
<appender-ref ref="FILEOUT" />
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<!--<appender-ref ref="FILEOUT" />-->
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是如果我想覆盖这个默认配置怎么办(例如设置根记录器,级别为INFO)
顺便说一下这里是包含的文件:
<included>
<!-- <property file="d:/ServerSysVar.properties"/>-->
<property file="${outPut}/ServerSysVar.properties"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILEOUT" class="ch.qos.logback.core.FileAppender">
<file>${Sys_Location}/Serverfile4.log</file>
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %class{36}.%M %L CLIENT_PORT:%X{ClientPort}- %msg%n</pattern>
</encoder>
</appender> …Run Code Online (Sandbox Code Playgroud) 我已经完成以下步骤来尝试为我的akka应用程序配置日志记录:
创建了一个application.conf文件并将其放在src/main/resources中.看起来像:
akka {
event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
loglevel = "INFO"
}
创建了一个logback.xml文件并将其放在src/main/resources中.看起来像:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.fileappender">
<File>./logs/akka.log</File>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)将以下内容添加到我的.scala sbt构建文件中:
libraryDependencies += "com.typesafe.akka" % "akka-slf4j" % "2.0.3",
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.0.9"
lazy val logback = "ch.qos.logback" % "logback-classic" % "1.0.9"
尝试此代码记录:
import akka.event.Logging
val log = Logging(context.system, this)
log.info("...")
我得到的只是标准输出日志记录,没有日志创建日志文件.
我错过了一步吗?或者配置错误?
我想将日志事件作为带有参数化字符串消息的JSON对象发送到Loggly.我们的项目目前有很多代码如下:
String someParameter = "1234";
logger.log("This is a log message with a parameter {}", someParameter);
Run Code Online (Sandbox Code Playgroud)
我们目前正在使用Logback作为我们的SLF4J后端,而Logback的JsonLayout将我们的ILogEvent对象序列化为JSON.因此,当我们将日志事件发送到Loggly时,它们看起来像这样:
{
"message": "This is a log message with a parameter 1234",
"level": INFO,
....
}
Run Code Online (Sandbox Code Playgroud)
虽然这确实有效,但它会message为每个值发送一个不同的字符串someParameter,这使得Loggly的自动过滤器旁边无用.
相反,我想要一个创建如下所示的JSON的布局:
{
"message": "This is a log message with a parameter {}",
"level": INFO,
"parameters": [
"1234"
]
}
Run Code Online (Sandbox Code Playgroud)
这种格式允许Loggly将所有日志事件与消息This is a log message with a parameter组合在一起,而不管其值如何someParameter.
看起来Logstash的KV过滤器做了类似的事情 - 有没有办法用Logback完成这个任务,没有编写我自己的布局来执行ILogEvent对象的自定义序列化?
我使用Spring Boot并希望它将日志输出写入文件.
根据文档,这只是通过设置完成
logging.file=filename.log
Run Code Online (Sandbox Code Playgroud)
虽然控制台输出工作正常,filename.log但未创建.此外,如果我手动创建文件,则不会写入任何内容.我错过了什么?
我们正在使用LogBack和我们的项目,我想根据一些数据库值配置记录器,即如果某个DB值设置为true,那么logger应该使用文件和DB appender,如果它是false,那么logger必须只使用DB appender ,
我还想保留使用静态最终记录器,因此每次调用记录器时我都不会创建新实例,
那我怎么能这样做呢?
问候,
我在我的java web appliaction中使用logback.这是我的"logback.xml"文件.
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<property name="LOG_DIR" value="/home/ying/.jetty_logs/vehicle" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date [%thread] %-5level %logger{36}[%L] - %msg%n</pattern>
</encoder>
</appender>
<appender name="LAST" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/last.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>last.%d{yyyy-MM}.gz</fileNamePattern>
<maxHistory>24</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date:%msg%n</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="WARN" />
<logger name="org.apache.shiro" level="WARN" />
<logger name="org.hibernate" level="WARN" />
<logger name="ying.car.interceptor.AutoLoginInterceptor" additivity="false" level="INFO">
<appender-ref ref="LAST" />
</logger>
<logger name="ying.car.controller.LoginController" additivity="false" level="INFO">
<appender-ref ref="LAST" />
</logger>
<logger name="ying.car.controller.LogoutController" additivity="false" level="INFO">
<appender-ref ref="LAST" />
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration> …Run Code Online (Sandbox Code Playgroud) 当我们希望将logback.xml文件配置为可配置时,将logback.xml文件放在何处?
以及如何让内部运行的Java应用程序可以访问它?
我有一个完美的logback.xml用于控制台,它记录所有的调试级别语句.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } [%t] --- %-40.40logger{39} : %m%n%wex"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
</xml>
Run Code Online (Sandbox Code Playgroud)
现在我想修改它以禁止从某个包中的所有记录器进行记录.
例如,假设我要从属于org.apache.zookeeper的类中抑制所有INFO级别日志
我找到的解决方案之一是创建一个自定义过滤器,类似于此处所示 - logback:两个appender,多个记录器,不同级别.但我真的需要为此编写java吗?
Comparing this problem to log4j, this can be easily accomplished by following -
log4j.logger.org.apache.zookeeper=WARN, CONSOLE
Run Code Online (Sandbox Code Playgroud)
提前致谢!.
在Spring Controller中实例化Logger时,有没有理由将它声明为静态final?LogConger不在MyController.class之外使用.我已经看到两个例子在使用,但不明白为什么我应该使用其中一个.
private Logger logger = LoggerFactory.getLogger(MyController.class);
Run Code Online (Sandbox Code Playgroud)
VS
private static final Logger logger = LoggerFactory.getLogger(MyController.class);
Run Code Online (Sandbox Code Playgroud)