logback 相关问题

与Log4J和java.util.logging相比,基于Java的程序的现代日志记录工具具有许多新功能。

有没有办法将旧日志保存为存档,然后删除存档文件?

我有一个项目保存所有其他服务的日志。它的配置方式是仅保留 7 天的日志并每天删除较旧的日志。 但我想知道是否有配置...

回答 1 投票 0

使用 logback 屏蔽 json 值

我在 Spring Boot 项目的 logback 配置中使用下面的 Logstash 编码器。 我在我的 Spring Boot 项目的 logback 配置中使用下面的 Logstash 编码器。 <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <pattern> <pattern> { "creation_timestamp": "%d{yyyy-MM-dd'T'HH:mm:ss, UTC}", "msg": "%msg", "log_type": "%level", } </pattern> <omitEmptyFields>true</omitEmptyFields> </pattern> </providers> </encoder> 我想屏蔽 json 日志消息中的敏感数据。我尝试了以下方法来掩盖键“Code”的值。但这不起作用。 "msg": "%replace(%msg){'\"Code\":'.*'', '\"Code\":'xxx''}", 如何在 Logstash 附加程序中屏蔽 json 值? 我能够通过编写 ValueMasker 的自定义实现来屏蔽敏感数据 需要两个组件: 实现 ValueMasker 的类 在您的 jsonGeneratorDecorator 中声明 logback.xml package com.mask; import com.fasterxml.jackson.core.JsonStreamContext; import net.logstash.logback.mask.ValueMasker; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.IntStream; public class SensitiveMaskingPatternLayout implements ValueMasker { private Pattern multilinePattern = Pattern.compile("\\\"msg\\\"\\s*:\\s*\\\"(.*?)\\\"", Pattern.MULTILINE);; private List<String> maskPatterns = new ArrayList<>(); private String maskMessage(String message) { StringBuilder sb = new StringBuilder(message); Matcher matcher = multilinePattern.matcher(sb); while (matcher.find()) { IntStream.rangeClosed(1, matcher.groupCount()).forEach(group -> { if (matcher.group(group) != null) { IntStream.range(matcher.start(group), matcher.end(group)).forEach(i -> sb.setCharAt(i, 'x')); } }); } return sb.toString(); } @Override public Object mask(JsonStreamContext context, Object value) { if (value instanceof CharSequence) { return maskMessage((String) value); } return value; } } <configuration> <appender name="mask" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <pattern> <pattern> { "msg": "%msg", "log_type": "%level" } </pattern> <omitEmptyFields>true</omitEmptyFields> </pattern> </providers> <logLevel> INFO </logLevel> <jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator"> <valueMasker class="com.mask.SensitiveMaskingPatternLayout"/> </jsonGeneratorDecorator> </encoder> </appender> <root level="INFO"> <appender-ref ref="mask" /> </root> </configuration> 示例: package com.example; import java.util.HashMap; import java.util.Map; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); public static void main(String[] args) { Map<String, String> user = new HashMap<>(); user.put("user_id", "97588"); user.put("email_id", "[email protected]"); user.put("msg", "hello world"); JSONObject userDetails = new JSONObject(user); logger.info("MaskingPatternExample log from {}" + userDetails); } } {"msg":"MaskingPatternExample log from {}{\"email_id\":\"[email protected]\",\"msg\":\"xxxxxxxxxxx\",\"user_id\":\"97588\"}","log_type":"INFO"} 更多文档。 ValueMasker方法对我不起作用。如果您遇到同样的问题,这就是有效的方法: 如果您注意到 LoggingEventCompositeJsonEncoder 中的 logback.xml,它有这些名为 <providers> 的字段。 进一步检查,你会发现这些LoggingEventJsonProviders基本上设置了我们编码器中的所有json字段。 因此,如果你有一个名为 <message> 的字段,它是一个提供者,你可以通过扩展 AbstractFieldJsonProvider 类来修改该字段的内容,如下所示: public class ModifyingProvider extends AbstractFieldJsonProvider < ILoggingEvent > { private final Pattern[] maskPatterns; public ModifyingProvider() { maskPatterns = new Pattern[] { Pattern.compile("\\b[0-9]{2}-[0-9]{2}-[0-9]{4}\\b"), // DOB pattern (DD-MM-YYYY) // Add more patterns as needed }; } private String maskData(String message) { StringBuilder maskedMessage = new StringBuilder(message); for (Pattern pattern: maskPatterns) { Matcher matcher = pattern.matcher(maskedMessage); while (matcher.find()) { String match = matcher.group(); String maskedValue = mask(match); maskedMessage.replace(matcher.start(), matcher.end(), maskedValue); } } return maskedMessage.toString(); } private String mask(String originalValue) { // Masking Logic } @Override public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException { // Modify the log message or provide an alternative message here String modifiedMessage = modifyMessage(originalMessage); // Write the modified message to the JSON output generator.writeStringField("message", modifiedMessage); } private String modifyMessage(String originalMessage) { return maskData(originalMessage); } 然后在您的 logback.xml 中,只需替换所需的 <provider> 标签,或者在本例中将 <message> 标签替换为 <provider class="path.to.your.class.ModifyingProvider"/>。

回答 2 投票 0

通过 logback.xml 压缩完整的日志目录

有什么方法可以压缩以前的日志目录(如果存在)并使用 logback.xml 在 slf4j 中重新启动(每次系统启动时创建新的目录)? PS:我用的是java7。 谢谢

回答 2 投票 0

Logback - 打印出调用log方法的方法名称

在我的示例中,我有以下代码: 包com.example.somepackage; 公共类示例{ 公共静态无效主(字符串[] args){ org.slf4j.Logger 记录器 = org.slf4j.LoggerFa...

回答 3 投票 0

强制slf4j使用logback

有没有办法强制 slf4j 使用特定的日志记录提供程序(在我的例子中是 logback)?正如他们的文档中所示: 在类路径上发现多个绑定 SLF4J API 旨在与一个绑定...

回答 3 投票 0

Logback 接收器 - 无法处理类型类 ReceiverModel 的模型

我无法让 Logback ServerSocketReceiver 工作。我在运行 Logback 自己的完整示例 https://logback.qos.ch/manual/receivers.html 时遇到了完全相同的问题。 简化的 logback.xml: <

回答 1 投票 0

使用 logback 将日志拆分到控制台和文件

我想以一种特殊的记录器仅记录到文件的方式分割日志记录,而所有其他记录器都记录到控制台。我试过这个: 我想以一种特殊的记录器仅记录到文件的方式分割日志记录,而所有其他记录器都记录到控制台。我试过这个: <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern> </encoder> </appender> <appender name="SIMULATOR_LOG_FILE" class="ch.qos.logback.core.FileAppender"> <file>data_log.txt</file> <append>false</append> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level -%kvp- %msg%n</pattern> </encoder> </appender> <logger name="Simulator" level="debug"> <appender-ref ref="SIMULATOR_LOG_FILE"/> </logger> <root> <appender-ref ref="STDOUT"/> </root> </configuration> 但它仍然将 Simulator 记录器记录到文件 和 控制台,而不仅仅是文件。 我做错了什么? 解决方案是在 additivity="false" 元素中添加 <logger>

回答 1 投票 0

如何以编程方式告诉 Logback 1.4.x 重新加载配置

如何以编程方式告诉 Logback 1.4.x 重新加载配置? 我找到了重新加载 logback 1.2.x 配置的答案,但它不适用于 logback 1.4.x(也不是 1.3.x),因为它提供了编译...

回答 1 投票 0

如何以编程方式告诉 Logback 重新加载配置

我知道有一个 reloadDefaultConfiguration() jmx 操作,但是没有获取 MBean 实例并调用此操作,是否有一个 Logback api 来重新加载默认配置(选项...

回答 3 投票 0

如何忽略/模拟 Slf4j 日志行?

我将 Spring Boot 从 2.5.10 升级到 2.5.12,它在 logback 中给我带来了重大变化 https://github.com/spring-projects/spring-boot/releases/tag/v2.5.11 我的一些单元测试(使用 Moc...

回答 1 投票 0

Tomcat logback.xml - 滚动文件后缺少堆栈跟踪

我从程序员那里得到java *.war文件,把它放在/tomcat/webapps中。 通过/tomcat/bin/startup.sh启动tomcat。 在 /tomcat/logs/ 中有文件 catalina.out - 在这里我读取了来自 tomcat 和 java 的所有日志

回答 1 投票 0

执行器 - 可以自定义日志文件端点吗?

我已经使用 logback 设置了日志配置。 该配置在自定义位置以滚动方式设置我的日志。这意味着我没有使用: “logging.file”或“logging.path...

回答 3 投票 0

如何将自定义字段从 Logback 发送到 Azure / AppInsights

我使用 Logback 和 StructuredArguments 在记录的条目中包含自定义字段。 像这样: log.info("消息", StructuredArguments.entries(Map.of("testKey", "testValue...

回答 1 投票 0

Logback - Android - 如何防止在发布版本上记录到 logcat?

我希望 logback 仅记录调试版本,而不是发布版本。怎么可能?

回答 1 投票 0

从 CLI 覆盖 logbackappender-ref

我有一个 logback 配置,对于 prod 和 int 配置文件使用 rsyslog 附加程序 我有一个 logback 配置,对于 prod 和 int 配置文件使用 rsyslog 附加程序 <root level="info"> <springProfile name="prod,int"> <appender-ref ref="SYSLOG7"/> </springProfile> <springProfile name="default"> <appender-ref ref="FILE"/> <appender-ref ref="STDOUT"/> </springProfile> </root> 此配置分布在数百个应用程序中。我需要将所有应用程序中的它更改为标准输出。如果有一个选项可以在公共 dockerfile 入口点中覆盖它(因此最好使用一些 env 变量/CLI 参数),我将不胜感激。有这样的事吗 ENV 变量/CLI 参数: docker run -e LOG_APPENDER=STDOUT your-image-name 注意:当您运行 Docker 容器时,您可以传递环境变量来指定 Appender。 如果您有一个在所有应用程序中使用的通用 Docker 入口点脚本,您可以在启动应用程序之前包含读取 LOG_APPENDER 环境变量并动态更新 Logback 配置的逻辑。这样,您就不需要修改每个应用程序的 Dockerfile。 以下是入口点脚本的简化示例: #!/bin/sh # Check if LOG_APPENDER is set, and if so, update the Logback config if [ -n "$LOG_APPENDER" ]; then sed -i 's|<appender-ref ref=".*"/>|<appender-ref ref="'$LOG_APPENDER'"/>|' /path/to/your/logback.xml fi # Start your application exec java -jar your-app.jar

回答 1 投票 0

当 logback 和 log4j 都在类路径中时,Hibernate 调试/跟踪日志记录

拥有: 弹簧启动:2.6.7 休眠:5.6.8 logback 作为默认日志记录实现 Apache POI poi-ooxml:5.2.3。 我们需要记录 SQL 查询和参数。通常这可以从 Spring

回答 1 投票 0

Logback.xml配置

我正在尝试将黑啤酒配置为保存到文件中。 但是,它没有保存到文件中 - 您知道为什么吗? 另外 - 我希望日志文件名可以在 logback.xml 中配置

回答 6 投票 0

将springboot和java升级到最新版本后出现logback错误

将项目中的springboot升级到3.0.7版本并将java升级到17后,开始出现以下错误,尽管项目在升级之前运行良好。 日志系统初始化失败...

回答 1 投票 0

记录可选键值

我有这个网络应用程序,日志记录相当多。我们为每个请求线程实现了对 MDC 的调用,以便能够在日志中跟踪用户。 日志消息可能如下所示: 信息...

回答 3 投票 0

检测到Logback配置错误:[springProfile]没有适用的操作,当前ElementPath是[[configuration][springProfile]]

我有一个带有 Logback 的 Springboot 应用程序。这场战争正在 Docker 容器中的 Liberty Web 服务器中运行 版本: Springboot 2.5.3 日志记录1.2.3 我看到一种奇怪的行为,如果我运行...

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.