我正在使用这些依赖项:
compile 'org.springframework.cloud:spring-cloud-starter-zipkin'
compile 'org.springframework.cloud:spring-cloud-starter-sleuth'
compile 'org.springframework.cloud:spring-cloud-sleuth-zipkin'
是否有可能将当前活动的配置文件添加到每个日志行?这样就可以根据Splunk / ELK / ...
中的配置文件过滤日志所以而不是
2017-03-13 13:38:30.465 INFO [app,,,] 19220 --- [ main] com.company.app.Application : Started Application in 20.682 seconds (JVM running for 22.166)
它应该记录
2017-03-13 13:38:30.465 INFO [app,,,] [dev] 19220 --- [ main] com.company.app.Application : Started Application in 20.682 seconds (JVM running for 22.166)
修改 根据Marcin的回答,我实现了如下:
application.yml
logging:
pattern:
level: "%X{profiles} %5p"
ProfileLogger.java
public class ProfileLogger implements SpanLogger {
private final Environment environment;
private final Logger log;
private final Pattern nameSkipPattern;
@Autowired
public ProfileLogger(String nameSkipPattern, final Environment environment) {
this.nameSkipPattern = Pattern.compile(nameSkipPattern);
this.environment = environment;
this.log = org.slf4j.LoggerFactory.getLogger(this.getClass());
}
private void setProfiles() {
MDC.put("profiles", Arrays.toString(environment.getActiveProfiles()));
}
@Override
public void logStartedSpan(Span parent, Span span) {
setProfiles();
...
}
... // (as https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanLogger.java)
}
LogConfig.java
@Configuration
public class LogConfig {
private final Environment environment;
@Autowired
public LogConfig(final Environment environment) {
this.environment = environment;
}
@Bean
SpanLogger getLogger() {
return new ProfileLogger("", environment);
}
}
这将打印如下日志:
2017-03-13 14:47:02.796 INFO 22481 --- [ main] com.company.app.Application : Started Application in 16.115 seconds (JVM running for 16.792)
2017-03-13 14:47:32.684 [localhost, swagger] TRACE 22481 --- [pool-2-thread-1] c.c.app.config.ProfileLogger : Starting span: [Trace: bfcdd2ce866efbff, Span: bfcdd2ce866efbff, Parent: null, exportable:true]
这已经很好但不完全是我正在寻找的东西。
我想从头开始添加个人资料 - >甚至开始申请"应该包含配置文件 - 如果可能的话。其次,我想在profiles
和INFO
之间移动22481
。
在实施过程中又出现了一个问题:在链接的实现中有这样的陈述:
if (this.log.isTraceEnabled()) {
this.log.trace(text, span);
}
这是否意味着只有在日志级别设置为TRACE时才发送跟踪?如果是这样,我怎么能用这种方法改进stdout的日志记录(给定一个日志级别的debug / info / warn)?我认为在导入依赖项时,Sleuth / Zipkin会覆盖日志模式,因此本地日志记录看起来与跟踪相同。最终,我对在本地标准输出和Zipkin中显示配置文件感兴趣。
编辑2:在Marcin的帮助下,我通过引入包含以下行的resources/logback-spring.xml
文件来更改模式:
<springProperty scope="context" name="activeSpringProfiles" source="spring.profiles.active"/>
<!-- Example for logging into the build folder of your project -->
<property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${activeSpringProfiles:-}"/>
<!-- You can override this to have a custom pattern -->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) [${activeSpringProfiles:-}] %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
请注意,您还必须添加bootstrap.yml
文件才能正确显示应用程序名称。如果没有bootstrap.yml
文件,上面的日志模式只会打印&#34; bootstrap&#34;作为应用名称。
bootstrap.yml
只包含
spring:
application:
name: app
在我的情况下。其他所有内容都在application- [profile] .yml
中配置现在一切都按预期工作:
2017-03-13 15:58:21.291 INFO [app,,,] [localhost,swagger] 27519 --- [ main] com.company.app.keyserver.Application : Started Application in 17.565 seconds (JVM running for 18.232)
答案 0 :(得分:3)
当然 - 您必须提供自己的日志记录格式(例如,通过logging.pattern.level
- 查看https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-logging.html以获取更多信息)。然后你必须注册你自己的SpanLogger
bean实现,你将负责通过MDC添加spring配置文件的值(你可以看一下这个例子https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jSpanLogger.java)
<强>更新强>
对于更复杂的方法,还有另一种解决方案似乎比重写Sleuth类更容易。您可以尝试logback-spring.xml
这样的方式 - https://github.com/spring-cloud-samples/sleuth-documentation-apps/blob/master/service1/src/main/resources/logback-spring.xml#L5-L11。我正在解析那里的应用程序名称,所以也许你可以对活动的配置文件做同样的事情而不需要编写任何代码?