java - 我可以在运行时使用 logback 关闭并重新打开日志文件吗?

标签 java file slf4j logback

我是 logback 的新手。我对它非常着迷,但我不确定它是否适合我的用例。

我想要一个可以停止和启动的记录器。当它停止时,我想从文件系统中删除日志文件。重新启动日志记录时,应重新创建文件。

logback 有这个能力吗?当日志记录暂停时,我应该避免在我的类中调用 Logger,还是可以用 logback 处理这个问题?

我目前使用 slf4j.Logger。在manual我看到 Appender 对象实现了 LifeCycle 接口(interface),这意味着它们实现了 start()、stop() 和 isStarted()

我认为这意味着它们可以停止,以便我可以移动文件,但稍后它会发生:

If the appender could not be started or if it has been stopped, a warning message will be issued through logback's internal status management system. After several attempts, in order to avoid flooding the internal status system with copies of the same warning message, the doAppend() method will stop issuing these warnings.

这是否意味着我可以停止它,然后删除文件,然后重新启动?

最佳答案

I would like to have a logger that I can stop and start. While it is stopped I would like to remove the log file from the filesystem. When logging is restarted the file should be re-created.

我不确定如何以编程方式完成此操作,但如果您添加了 jmxConfigurator,则可以通过 JMX 完成此操作到 logback.xml配置文件。

<configuration>
    <jmxConfigurator />
    ...

这暴露了 ch.qos.logback.classic.jmx.JMXConfigurator具有名为 reloadDefaultConfiguration 的操作的 bean .当我在运行时按下它时,日志文件会重新打开。请参见下面的 Jconsole 图像。这意味着 jmx 客户端(例如我的 SimpleJMX library 中的客户端)将能够从命令行执行此操作。

如果您尝试从同一应用程序内部以编程方式进行调用,那么您应该能够获取 mbean 并自行触发调用。类似的东西似乎对我有用:

ManagementFactory.getPlatformMBeanServer().invoke(new ObjectName(
    "ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator"),
    "reloadDefaultConfiguration", null, null);

我要做的是将日志文件重命名为不同的名称,然后发出重新加载配置命令。然后在创建新文件后可以归档或删除重命名的文件。

希望这对您有所帮助。

enter image description here

关于java - 我可以在运行时使用 logback 关闭并重新打开日志文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16856976/

相关文章:

java - 如何将对象转换为 JSON 表示形式

c - 从 txt.file 读取数据并打印出其二维数组内容

Gradle 5 的 gradle-api uber-jar 将不需要的 slf4j 绑定(bind)放在我们的类路径上,导致运行时错误

java - Gson 无法在我的对象中强制转换 "Object"类

java - Mockito when().thenReturn 不起作用

java - 从 Uri 类型 android 创建文件

java - Hibernate System.err 控制台日志记录

eclipse - 如何解决此 "No such property [target] in org.apache.log4j.FileAppender"和 "No output stream or file set for the appender named"错误?

Java - 来自父级的相同方法,但使用每个子级的单独属性

java - 如何用java编写一个文件索引软件?