与Log4J和java.util.logging相比,基于Java的程序的现代日志记录工具具有许多新功能。
为什么从 XML 配置 Logback 时,DriverManagerConnectionSource 未启动,导致连接失败?
升级到 slf4j 2.0.13、logback 1.5.6 和 logback-db 1.2.11.1 后,之前正常的 logback XML 配置失败了。据我所知,该框架正在尝试
升级到 SLF4J v2/Logback 后不再支持 LoggerContextListener 订单建立
我将尽力解释这一点,但它相当复杂。我从事的项目希望人们能够使用 java 配置文件和属性覆盖 logback.xml 设置。 例如...
org.slf4j.helpers.NOPLoggerFactory 无法转换为 ch.qos.logback.classic.LoggerContext
当我在maven(m2e)中使用logback时,出现以下错误。环境:JBOSS 7.1.1,maven,eclipse。但如果我只是作为主类单独运行,它就可以正常工作。我不明白为什么我会......
logback.groovy 配置在 groovy 更新后不起作用
进行项目更新时,我们将 java (gradle) 项目的 groovy 依赖项更新到版本 4.0.4。然而现在,我们的 logback.groovy 配置不再起作用。 问题是该应用程序...
Wildfly 26 SpringBoot 部署时日志记录异常
我尝试更改为 org.jboss.logging,如本文中所示,但错误仍然显示。 我在 POM 中排除了 Logback,你们可以在下面看到 聚甲醛 ...
Logback - 可以获取 AsyncAppender 当前队列的大小吗?
是否可以获取Logback的AsyncAppender当前的队列大小? 这是我们配置的相关部分: 是否可以获取Logback的AsyncAppender当前的队列大小? 这是我们配置的相关部分: <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <queueSize>1000</queueSize> <discardingThreshold>0</discardingThreshold> <appender-ref ref="FILE" /> </appender> 如果附加程序附加到您的根记录器,类似这样的事情应该可以工作: var root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); var appender = root.getAppender("ASYNC"); if (appender instanceof AsyncAppenderBase<ILoggingEvent> asyncAppender) { int currentQueueSize = asyncAppender.getNumberOfElementsInQueue(); }
我使用 Spring-Boot 及其集成 Logback 日志记录。 logback-spring.xml 我使用 Spring-Boot 及其集成 Logback-logging。 logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder><pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} - %-5level - %msg%n</pattern</encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>log.log</file> <append>true</append> <encoder><pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} - %-5level - %msg%n</pattern</encoder> </appender> <logger name="default" level="WARN"> <appender-ref ref="FILE" /> </logger> <root level="ERROR"> <appender-ref ref="STDOUT"/> </root> </configuration> 应用程序属性 spring.main.web-application-type = none logging.config = logback-spring.xml MyComp.java @Component public class MyComp { @PostConstruct private void init () { Logger logger = LoggerFactory.getLogger ("default"); logger.error ("this is an error"); logger.warn ("this is a warning"); logger.info ("this is an info"); logger.debug ("this is a debug"); } } 输出在日志文件以及标准输出控制台中为我提供了此信息。 30.04.2024 00:16:01.303 - ERROR - this is an error 30.04.2024 00:16:01.304 - WARN - this is a warning 30.04.2024 00:16:01.304 - INFO - this is an info 30.04.2024 00:16:01.304 - DEBUG - this is a debug 我不明白。 我已将记录器“默认”配置为“警告”级别,并将根记录器配置为“错误”级别。 所以我希望有 日志文件中仅包含错误和警告消息,并且 仅标准输出中的错误消息。 那为什么这不是我得到的? 我也不明白有什么问题,但是你可以尝试一下,将 com.acme 更改为代码的包名称: <!DOCTYPE configuration> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="com.acme" level="DEBUG" /> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration>
在浏览 Logback 手册的第 3 章时,我注意到配置示例分为三种:Legacy、Canonical (1.3) 和 Tyler。 该手册几乎保持沉默......
如何使用 syslog4j 和 logback 来使用本机 Unix 套接字
我正在使用 logback 进行日志记录。我想使用 syslog4j 本地登录到 syslog。(因为我不想打开 udp 端口来登录 syslog) 我可以使用 syslog4j 作为 logback 的附加程序吗...
我正在使用 logback 进行日志记录。我想使用 syslog4j 本地登录到 syslog。(因为我不想打开 udp 端口来登录 syslog) 我可以使用 syslog4j 作为 logback 的附加程序吗...
将 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以与系统时区不同的时区输出日志消息的本地时间? 我想通过配置来设置它(即