与Log4J和java.util.logging相比,基于Java的程序的现代日志记录工具具有许多新功能。
将 org.slf4j.MDC 与 Netty 通道一起使用?
我想做的本质上是如何将MDC与线程池一起使用?是在问,但是是用 Netty。 我想要每个通道关联的 MDC 信息。 Netty 有哪些选项?如果我需要...
我正在尝试使用链接在 Logback 中创建自定义布局, 在 Logback 中创建自定义布局 我成功创建了日志文件。 问题是当我在编码中应用“模式”标签时......
在我的项目中,我使用 slf4j 进行日志记录。 如果我包含对 logback-classic = "1.2.13" 或更早版本的依赖项,我会收到一条错误消息,指出没有找到 SLF4J 提供程序,并且它是默认的...
我正在使用 logback.xml 来屏蔽敏感数据以进行日志记录,效果很好 我正在使用 logback.xml 来屏蔽敏感数据以进行日志记录,效果很好 <appender name="DATA_MASK" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="com.masking.MaskingPatternLayout"> <maskPattern>\"creditCardNumber\"\s*:\s*\"(.*?)\"</maskPattern> <!-- questionCode JSON pattern --> <Pattern>${logback.detailedroot}</Pattern> </layout> </encoder> </appender> 但问题是,当我在 logback.xml 中打开请求-响应配置时,这个自定义 MaskingPatternLayout 无法捕获请求-响应日志 <logger name="Request" level="DEBUG" /> <logger name="Response" level="DEBUG" /> 众所周知,上面的两个配置帮助我们将所有请求和响应捕获为日志。然而,掩蔽模式对它们不起作用。 无论如何处理这些请求响应日志来屏蔽。 我理解你的问题的方式是外部配置的记录器不会利用你的掩码。确保正在使用的记录器利用您的掩码的最佳方法是显式配置它们。 您可以使用 Baeldung 教程 配置您自己的面向方面 (AOP) 请求/响应日志记录,并让它使用您已指定的附加程序或您配置的新附加程序。 我正在运行的如下 @Aspect @Component @Order(4) public class RestLoggerAspect { Logger logger = LoggerFactory.getLogger(RestLoggerAspect.class); String before = "Incoming :: "; String after = "Completed :: "; @Before("execution(@(@org.springframework.web.bind.annotation.RequestMapping *) * *(..))") public void log(JoinPoint jp){ Signature signature = jp.getSignature(); // who is called "class method" if(logger.isDebugEnabled()){ logger.debug(before + ((Signature) signature).toShortString() + " : " + joinArgs(jp)); } else { logger.info(before + ((Signature) signature).toShortString()); } } @AfterReturning( pointcut = "execution(@(@org.springframework.web.bind.annotation.RequestMapping *) * *(..))" , returning= "retVal") public void methodLog(JoinPoint jp, Object retVal){ String methodCall = jp.getSignature().toShortString() ; if(logger.isDebugEnabled()){ String logString = after + methodCall + " [ args = " +joinArgs(jp) + " ]"; if (retVal != null) { logString += " return = " + prettify(retVal); } logger.debug(logString); } else { logger.info(after + methodCall); } } private String joinArgs(JoinPoint jp){ return Arrays.stream(jp.getArgs()) .map(t -> t != null ? prettify(t) : "null") .collect(Collectors.joining(", ")); } private String prettify(Object object){ ObjectMapper mapper = new ObjectMapper(); String jsonStr = null; try { jsonStr = String.valueOf(object.getClass()); jsonStr += "=" + mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object); } catch (JsonProcessingException e) { jsonStr = object.toString(); } return jsonStr; } } 此实现的漂亮打印会将请求/响应转储为多行,这可能不是您正在寻找的内容,但您可以自己删除该部分。这里重要的部分是 @Before 方法允许您访问请求并记录它,在我的例子中,只有当我的 AspectLogger 启用了调试时才可以。 @AfterReturning 位允许您访问响应。我为这些定义的模式在使用 RequestMapping 注释时捕获,例如 @GetMapping、@PostMapping 或 @DeleteMapping。 此处的 joinArgs 函数将连接提供给该方法的所有参数,无论数量如何。
在Logback中,%highlight()用于给输出着色。有什么方法可以改变highlight()的颜色模式吗?我更喜欢 INFO 级别日志保持白色而不是蓝色...... 在 Logback 中,%highlight() 用于为输出着色。有什么方法可以改变highlight()的颜色模式吗?我更喜欢 INFO 级别日志保持白色而不是蓝色...... <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern> %d{HH:mm:ss.SSS} [%t] %highlight(%-5level %logger{36} - %msg%n) </Pattern> </encoder> </appender> 我刚刚遇到如何做到这一点的示例 根据他们的文档,您需要: 将HighlightingCompositeConverterEx.java添加到CLASSPATH(或者只是将其添加到您的项目中) 使用 在 logback.xml 中加载转换器类 在中使用您的转换词(示例中的highlightex) package code.nighma.logging.utils; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.pattern.color.ANSIConstants; import ch.qos.logback.core.pattern.color.ForegroundCompositeConverterBase; public class LogbackHighlightCompositeConverterEx extends ForegroundCompositeConverterBase<ILoggingEvent> { @Override protected String getForegroundColorCode(ILoggingEvent event) { Level level = event.getLevel(); return switch (level.toInt()) { case Level.ERROR_INT -> ANSIConstants.BOLD + ANSIConstants.RED_FG; case Level.WARN_INT -> ANSIConstants.BOLD + ANSIConstants.MAGENTA_FG; case Level.INFO_INT -> ANSIConstants.BOLD + ANSIConstants.CYAN_FG; case Level.DEBUG_INT -> ANSIConstants.BOLD + ANSIConstants.YELLOW_FG; case Level.TRACE_INT -> ANSIConstants.BOLD + ANSIConstants.WHITE_FG; default -> ANSIConstants.BOLD + ANSIConstants.DEFAULT_FG; }; } } 然后你的配置 xml 将如下所示 <configuration> <conversionRule conversionWord="highlightex" converterClass="code.nighma.logging.utils.HighlightingCompositeConverterEx"/> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%green(%d{ISO8601}) [%blue(%t)] %highlightex(%-5level) %yellow(%C{5}): %msg%n%throwable</Pattern> </layout> </appender> <root level="info"> <appender-ref ref="Console"/> </root> <logger name="code.nighma" level="trace" additivity="false"> <appender-ref ref="Console"/> </logger> </configuration>
下面是S3FixedWindowRollingPolicy类的实现,它负责将本地日志文件移动到S3。 S3固定窗口滚动策略 包 com.paytmlabs.adtech.logback.policy; 我...
将依赖项注入S3FixedWindowRollingPolicy
下面是S3FixedWindowRollingPolicy类的实现,它负责将本地日志文件移动到S3。 S3固定窗口滚动策略 包 com.paytmlabs.adtech.logback.policy; 我...
Slf4j,logback - 从 json 中删除 mdc 标签
我正在使用 MDC 添加一些上下文信息来记录记录: MDC.put("相关 ID", UUID.randomUUID().toString()); 我正在使用以下 logback 编码器: 我正在使用 MDC 添加一些上下文信息来记录记录: MDC.put("Correlation-ID", UUID.randomUUID().toString()); 我正在使用以下 logback 编码器: <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.contrib.json.classic.JsonLayout"> <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat> <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId> <appendLineSeparator>true</appendLineSeparator> <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter"> <prettyPrint>false</prettyPrint> </jsonFormatter> </layout> </encoder> 我有以下日志: {"timestamp":"2020-01-20T11:40:09.850Z","level":"INFO","thread":"main","mdc":{"Correlation-ID":"66f7843c-9855-450d-ad97-b1c78404f051"},"logger":"liquibase.Liquibase"... 我想删除 root mdc 标签以获得: {"timestamp":"2020-01-20T11:40:09.850Z","level":"INFO","thread":"main","Correlation-ID":"66f7843c-9855-450d-ad97-b1c78404f051","logger":"liquibase.Liquibase"... 我该如何实现这个目标? 您可以使用 logstash logback JSON 编码器。 将这些依赖项添加到您的 pom.xml: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>${logstash.version}</version> </dependency> 这是一个示例: <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <pattern> <omitEmptyFields>true</omitEmptyFields> <pattern> { "timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}", "level": "%level", "thread": "%t", "Correlation-ID": "%mdc{Correlation-ID}", "logger": "%logger", ... } </pattern> </pattern> </providers> </encoder> 文档这里。 如果您想保留 Correlation Id,您可以扩展 JSON Layout 类并在地图上设置属性。 public class CustomJsonLayout extends JsonLayout { @Override protected Map toJsonMap(ILoggingEvent iLoggingEvent) { LinkedHashMap var2 = new LinkedHashMap(); this.addTimestamp("timestamp", this.includeTimestamp, iLoggingEvent.getTimeStamp(), var2); this.add("level", this.includeLevel, String.valueOf(iLoggingEvent.getLevel()), var2); this.add("thread", this.includeThreadName, iLoggingEvent.getThreadName(), var2); this.add("logger", this.includeLoggerName, iLoggingEvent.getLoggerName(), var2); this.add("message", this.includeFormattedMessage, iLoggingEvent.getFormattedMessage(), var2); this.add("raw-message", this.includeMessage, iLoggingEvent.getMessage(), var2); this.add("context", this.includeContextName, iLoggingEvent.getLoggerContextVO().getName(), var2); this.addThrowableInfo("exception", this.includeException, iLoggingEvent, var2); this.addCustomDataToJsonMap(var2, iLoggingEvent); Map<String,String> mdc = iLoggingEvent.getMDCPropertyMap(); String correlationId = mdc.getOrDefault("Correlation-ID",""); this.add("Correlation-ID", this.includeMDC, correlationId , var2); return var2; } } 并在布局中添加新类。 <layout class="com.test.utils.CustomJsonLayout">
我为我的一个批处理任务开发了一个Java Springboot应用程序。我将使用该应用程序的 jar 和 shell 脚本。 Shell 脚本将手动执行...
有没有办法在Spring Boot中配置logback以与系统时区不同的时区输出日志消息的本地时间? 我想通过配置来设置它(即
我们过去能够通过 JMX MBean 在运行时更改 logback 配置。这过去是通过在配置文件中添加 来启用的。 这不再起作用了......
在 Windows 10 64 位上对控制台显示进行 Ansi 编码时,logback 出现异常
无法找到答案,任何人都可以提出解决方案。 我有一个正在构建和使用 logback (logabck 1.2.3、jansi 1.16) 和 groovy 的库 jar,我正在尝试对日志显示进行颜色编码...
我创建了一个简单的maven项目,其中添加了logback-classic、logback-core版本1.5.3和slf4j-api 2.0.12以及JDK11。但是当我运行主类时,我收到此警告/错误消息。 **
在log4j.xml中设置配置级别属性的目的是什么? log4j.xml中配置级别设置属性的目的是什么? <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false" threshold="info"> 在 log4j 1.x 以及 logback 中,debug="true" 指令可以将消息internal 显示到日志记录库。 debug="true"指令与记录器上的设置级别无关。 在 logback 中,这些内部消息称为 状态消息。另请参阅下面几段的“简写”部分。
apache Camel Spring Boot 应用程序上的日志记录问题
我继承了一个 apache Camel Spring Boot 应用程序,但我在日志记录方面遇到了问题。 路由组件使用 lombok.extern.slf4j.Slf4j 注释进行注释。 正常日志正在工作
Logback:在 StructuredTaskScope 内创建的分支中 MDC 的可用性
在 Java 21+ 中使用 JEP 453 中的 StructuredTaskScope 并分叉多个任务时,我希望将 MDC 值传播到分叉,以便所有日志正确关联。 延长考试时间...
在我的 springboot 应用程序中,我只想在文件大小达到限制(比如 50KB)时创建一个新的日志文件。我正在使用 logback 并且使用了 FixWindowRollingPolicy 滚动策略 和
Java Logback + System.Logger? Logback java.lang.System.LoggerFinder 实现?
Logback 库是否支持或为 Java 9+ 日志外观 System.Logger 提供桥梁?我想要类似于 Log4j 的 log4j-jpl 的东西,它可以让你使用 Log4j 作为日志记录后端或
我正在尝试将应用程序“版本”号添加到每个日志行的开头。在我的阅读中,我注意到“标记”是我似乎需要的。 在代码中我使用@S...
如何像普通 Spring 属性一样访问 Spring Boot 的构建属性?
我想使用 /META-INF/build-info.properties 中的构建属性作为普通的 Spring 属性,这样我就可以在我的 Logback 配置 logback-spr 中通过 spring-property 使用它们...