我有一个在Tomcat服务器上运行的记录器应用程序。我在spring boot框架上使用logback。 下面是我的logback.xml文件
<configuration debug="true">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/log/audit/audit.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>/var/log/audit/audit_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 50MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 30 days' worth of history -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="com.logger.rest">
<appender-ref ref="FILE" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
我的应用程序正确记录到/var/log/audit/audit.log。但在某些时候我需要删除日志文件。删除后,我注意到在调用记录器应用程序时没有创建新的audit.log文件。只有当我重新启动记录器应用程序时才会生成新的日志文件。
有没有办法可以绕过app重启,以便logback自动创建一个新的audit.log文件(创建日志信息时),以防它被删除
答案 0 :(得分:7)
当您的应用程序正在运行时(并且您的应用程序中的Logback具有对日志文件的打开句柄)如果删除日志文件,则Logback将不知道该文件已被删除(因为Logback进程仍然具有打开文件句柄)但是由于文件已经被删除,Logback实际上无法向磁盘写入任何内容,并且这种情况一直存在,直到重新初始化Logback(并且FileAppender重新创建文件)。通常,这将在应用程序启动时完成。
对于Logback,有open issue请求在这种情况下更改Logback的行为。
删除应用程序的日志记录子系统(即Logback)配置为在该应用程序活动时写入的文件有点不寻常。也许你试图通过删除文件解决的问题可以通过其他方式解决?如果不是,即如果您必须能够删除正在进行的日志文件并期望Logback创建新文件,那么我认为您的选项是:
答案 1 :(得分:0)
The accepted answer above是完全正确的-如果由于某种原因无论如何您必须“删除”日志文件,另一个选择是自己重新创建日志文件,或者只是“截断”它而不是删除:
DECLARE @Previous_Amount INT =500
;WITH CTE AS
(
SELECT SUM(AMOUNT) OVER (ORDER BY Ranking DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
- @Previous_Amount - ISNULL(SUM(QUOTA) OVER (ORDER BY Ranking DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ),0) AS ComputedDifferenc, *
FROM @TABLE1
)
SELECT Ranking,Quota,Amount,CASE WHEN ComputedDifferenc > Quota THEN Quota ELSE CASE WHEN ComputedDifferenc >0 THEN ComputedDifferenc ELSE 0 END END AS Cum_Diff
FROM CTE
至少在我的情况下这是完全可以的,并且注销只是继续记录...