我的公司有一个环境管理工具,使您能够以编程方式在Java中查找环境中的属性.我想利用这个工具来配置logback.例如,假设我有一个logback.xml,如下所示(特别是文件appender部分):
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- console appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS} [%thread] %-5level %logger{20}: %msg%n</pattern>
</encoder>
</appender>
<!-- file appender -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_FILE:-/default/log/file/path</file>
<encoder>
<pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS} [%thread] %-5level %logger{20}: %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,我想LOG_FILE从环境(或OS,如果你愿意)查找属性,并在logback加载logback.xml之前将其传递给logback,以便它知道值LOG_FILE.那么,我该如何实现呢?顺便说一句,我知道如何以编程方式定义文件追加器,但这不是我想要的.
非常感谢你.
我正在使用当前版本的社区版:GraalVM/native-image 22.1.0
我的项目依赖于日志框架 logback (版本 1.2.3)
如果我想用 graalVM 编译我的“一体式”jar,本机映像会抱怨:
错误:java.util.concurrent.ExecutionException:com.oracle.graal.pointsto.constraints.UnsupportedFeatureException:映像堆中不允许存在 ch.qos.logback.classic.Logger 的实例,因为此类应在映像运行时初始化。要查看该对象是如何实例化的,请使用 --trace-object-instantiation=ch.qos.logback.classic.Logger。
我尝试了许多不同的设置排列,例如--initialize-at-run-time=\<complete list of logback classes\> 和--initialize-at-run-time
我尝试使用以下命令生成反射配置文件
java -agentlib:native-image-agent=config-output-dir=META-INF/native-image -jar build/myjar-all.jar
并将其添加到配置文件中
-H:ReflectionConfigurationFiles=reflect-config.json
但没有成功。总是收到与 logback 相关的不同错误消息。
所以我的问题是:
有人之前用 graalvm 成功编译过 logback 吗?
我有一些性能单元测试会创建一些我不太关心并且实际上影响性能的不合理数量的日志.我可以以某种方式仅在单元测试的Before方法中提高logback中的日志级别(并在After中恢复)吗?或者有更好的解决方法吗?
如何配置logback不会记录org.package包中记录器及其子包的消息,除非它们的级别是WARN或ERROR?
我想阅读spring属性并基于此属性更改某些包的日志级别(不适用于root logger).如何使用logback实现它?
默认情况下,Logback编码器使用类似于ISO 8601标准的日期格式.但它在日期和时间部分之间缺少"T".这使得解析更容易,并且是标准所要求的(除非私人方达成一致).T
是否有一些技巧可以让Logback包含T?
这个…
2006-10-20T14:06:49,812
Run Code Online (Sandbox Code Playgroud)
而不是这个......
2006-10-20 14:06:49,812
Run Code Online (Sandbox Code Playgroud)
我想我可以在添加"T"时重新创建整个格式,但我想知道是否有更简单的方法.
在Log4j最新的API中,我们有Lambda支持,可以轻松管理Debug选项.
例:
logger.debug("This {} and {} with {} ",
() -> this, () -> that, () -> compute());
Run Code Online (Sandbox Code Playgroud)
但是对于slf4j/logback,有任何选项可以启用lambda,如上所述.那么请让我知道语法.
我正在使用带有LogBack的SpringBoot并在我的yml文件中使用以下配置:
logging:
path: C:/var/log/pincode
Run Code Online (Sandbox Code Playgroud)
该logging.path春季环境变量被转移到LOG_PATH环境变量和日志文件被放置在正确的地方,但也有一个叫做目录LOG_PATH_IS_UNDEFINED在我的项目的根目录下创建的.
这似乎是由SpringBoot用于配置LogBack及其Environment变量的不同阶段引起的.
17:29:21,325 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
17:29:21,337 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern LOG_PATH_IS_UNDEFINED/catalina.out.%d{yyyy-MM-dd} for the active file
17:29:21,340 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern 'LOG_PATH_IS_UNDEFINED/catalina.out.%d{yyyy-MM-dd}'.
17:29:21,340 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
17:29:21,343 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Mon Aug 11 17:24:07 BRT 2014
17:29:21,346 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[serverConsole] - Active log file name: LOG_PATH_IS_UNDEFINED/catalina.out …Run Code Online (Sandbox Code Playgroud) 我们使用slf4j和logback,当从命令行运行时,它仍然按预期工作,但在intellij中它是不同的.
在intellij中使用gradle运行junit测试,日志输出采用以下xml格式:
<ijLog><event type='afterSuite'><ijLogEol/>
<test id='root' parentId=''><ijLogEol/>
<descriptor name='Test Run' className='' /><ijLogEol/>
<result resultType='SUCCESS' startTime='1427264227574' endTime='1427264315052'><ijLogEol/>
<failureType>error</failureType><ijLogEol/>
</result><ijLogEol/>
</test><ijLogEol/>
</event></ijLog>
Run Code Online (Sandbox Code Playgroud)
我不希望IDE改变任何东西,只需使用我们提供的日志记录.这种用法很好,但自14.1以来我就遇到了这个问题.
我是Scala的新手,并不熟悉Java的最新发展,所以我认为我认为这是一个基本问题.
我正在编写一些Scala代码,并使用ScalaTest和TestNG使用测试夹具进行测试.正在测试的代码使用slf4s执行其日志记录,由logback支持.
在我的'build.sbt'文件中,我有我需要的所有库的依赖项:
scalaVersion := "2.9.1"
// Add test dependencies on scalatest and testng
libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "1.6.1" % "test", "org.testng" % "testng" % "6.1.1" % "test")
// Use the slf4j logging facade for logging
libraryDependencies += "org.slf4j" % "slf4j-api" % "1.6.3"
//use the slf4j connectors to implement the JCL logging facade in terms of slf4j (which in turn is implemented in terms of logback)
//confused yet?
libraryDependencies += "org.slf4j" % "jcl-over-slf4j" % "1.6.3"
//use logback for …Run Code Online (Sandbox Code Playgroud)