当前位置: 首页 > 知识库问答 >
问题:

如何销毁log4j记录器实例

万俟渝
2023-03-14

我有一个并发运行代码,每次运行都需要在文件中记录一些内容。每个执行-新的故事与唯一的文件。

事先谢谢你,安德烈!

共有1个答案

应和光
2023-03-14

您不能销毁/清理Appender实例。但是您可以使用Log4j2工具箱改进解决方案

在Log4j中将事情路由到动态文件是可能的,但大多数时候文件中的标记就足够了,或者至少是更复杂路由的起点。

请仔细阅读它的文件。特别是最后一段对你的案例很重要:

    null

我使用了这个简单的测试脚本,请注意为扫描程序中的每一行创建的标记的使用。在您的情况下,它将通过配置或Servlet输入或类似的方式创建。

package toTest;

import java.util.Scanner;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;

public class TestMe {
    private final Logger myOneAndOnlyLogger = LogManager.getLogger("MyCentralName");
    public static void main(String[] args) {
        new TestMe().doMyThing();
    }

    private void doMyThing() {
        Scanner input = new Scanner(System.in);
        String line = "";
        while(!line.equals("QUIT")) {
            System.out.println("Line: ");
            line = input.nextLine();
            Marker forThisRound = MarkerManager.getMarker(line);
            myOneAndOnlyLogger.log(Level.ERROR, forThisRound, "1");
            myOneAndOnlyLogger.log(Level.ERROR, forThisRound, "2");
            System.out.println("Line done.");
        }
    }
}

和这个log4j2.properties(我手边有一个滚动文件示例,模式中有标记):

status = error
name = MarkerExample

#Make sure to change log file path as per your need
property.filename = /tmp/java/marker.log

filters = threshold

filter.threshold.type = ThresholdFilter
filter.threshold.level = debug

appenders = rolling

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = /tmp/java/debug-backup-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} $${marker:} %-5p %c{1}:%L - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=10MBONE
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 20

loggers = rolling

#Make sure to change the package structure as per your application

logger.rolling.name = MyCentralName
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
 类似资料:
  • 我正在构建一个基于railsguide的rails应用程序 它在erb中调用的语法是... 控制器定义 与在application.html.erb中使用“application”相关联的错误

  • 问题内容: 据我所知(很少),给出了两种方法: 然后: 其他更好的方法?我在这里劈头发吗? 问题答案: 您正在寻找。 但是要考虑到 您不能显式销毁对象。 它会保留在那里,但是如果您取消设置对象,并且脚本将PHP推入内存限制,则不需要的对象将被垃圾回收。我会选择(而不是将其设置为null),因为它似乎具有更好的性能(未经测试,但已记录在PHP官方手册的注释中)。 也就是说,请记住,PHP总是在页面被

  • 我计划用log4j one替换旧的记录器。我需要创建继承Logger的新类LocalLogger,而不是直接使用Logger。这样做的原因-我需要旧记录器中可用的新日志方法名称。 我有log4j记录器: 如何以与Logger相同的方式实现LocalLogger的功能? 如何将c类传递给超级本地记录器? LocalLogger的草稿:

  • 我正在使用Java8。我不是java专家(自从10年前上大学以来就没有研究过java) 我创建了一个ScriptEngine的实例(Nashorn,如果有必要的话)。我用它来评估几个javascript文件。 这个脚本在自己的小javascript世界里运行得非常愉快。我喜欢。 我还运行了一个文件系统监视服务,以防我的一些java脚本被修改。当它们被修改时,我创建一个新的ScriptEngine,

  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 我是Android开发新手,有一些关于生命周期活动的东西我不理解,特别是关于我正在研究的以下应用程序示例。 在我的应用程序中,我有一个登录活动和主活动。 > < li> 在我的登录活动中,如果尝试成功,将启动主活动,并完成()登录活动。< br>== 在我的主要活动中,我有一个断开连接按钮,该按钮创建了一个启动(新?)登录活动的 Intent。 == start activity(loginAct