因为slf4j依赖的log4j在流量大的时候总遇到多线程引起的死锁问题,升级到log4j2.x版本。原来的log4j.properties配置文件已经不被log4j2支持了,需要改写为log4j2.xml。在升级的过程中,配置与原先相同,使用异步日志,按小时滚动,却发现配置后日志输出正常,但滚动的功能不正常,查出以下两个问题。

1. 日志不按小时滚动

原来的配置如下:

 <RollingRandomAccessFile name="RollingFile" fileName="${backupFilePatch}${fileName}" filePattern="${backupFilePatch}${fileName}.%d{yyyy-MM-dd}.%i" immediateFlush="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %p %c{1}[%L]-%m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
<DefaultRolloverStrategy max="120"/>
</RollingRandomAccessFile>

根据官网的介绍,我理解成了interval=1的时候固定按小时滚动,其实interval的单位是根据filePattern来的,即filePattern配置中的最小单位,所以在yyyy-MM-dd这样的配置中,interval的单位是day,而%i则是interval的序号,日志是按天滚动的。所以将配置改为${backupFilePatch}${fileName}.%d{yyyy-MM-dd.HH}就能按小时滚动了。

2. 每小时滚动后,日志不写入新文件,而是写入旧的归档文件。

这个问题更诡异。tomcat启动后,日志是写入log文件的,但是整点日志滚动之后,log归档为log-日期,产生一个新的log文件,但日志还是打入了归档之后的文件log-日期。放置了一天之后,发现更诡异的事情,日志总是写入上一个归档文件。例如,7点的时候,产生一个归档文件log-日期.6,7点到8点的日志都打入了文件6,log文件始终是空的,而8点之后,log归档为log-日期-7,之后的日志都打入文件7,新产生的log文件还是为空。

该问题遍寻不着解法。在某一次整点时,正好刷新了一下,发现log文件有新内容,再刷新又成为上面那种现象了。由此联想到,有可能不只是log4j2在对这个文件进行操作。

排查发现,改写log4j2.xml之后,原来的log4j.properties还留在项目里。由于maven层层叠叠的依赖,有几个包引用的是log4j1.x版本,在运行的时候,始终有一个包用的是log4j1.x在打日志,因此加载的是log4j.properties的配置。log4j.properties和log4j2.xml的配置完全相同,写入的也是同一个日志文件。整点的时候,这两个类都对log文件进行归档操作,猜想是log4j2先执行归档,写入新log文件,而这个文件又被log4j1归档,因此后面log4j2的日志都写入了上一个归档文件。

将log4j.properties中的日志改为其他名称,问题解决。

log4j笔记:升级2.X版本的日志滚动问题的更多相关文章

  1. Java学习笔记(十九)——Java 日志记录 AND log4j

    [前面的话] 学习的进度应该稍微在快一点. Java日志到了必须学习怎么使用的时候了,因为在项目中要进行使用.基础性文章,选择性阅读. [结构] java日志对调试,记录运行,问题定位都起到了很重要的 ...

  2. Elasticsearch升级1.5版本暴露jdk的bug

    把测试环境的Elasticsearch升级到1.5.1版本,启动的时候报错: [root@node2 elasticsearch-1.5.1]# bin/service/elasticsearch s ...

  3. sqlserver mdf向上兼容附加数据库(无法打开数据库 'xxxxx' 版本 611。请将该数据库升级为最新版本。)

    最近工作中有一个sqlserver2005版本的mdf文件,还没有log文件,现在需要 附加到sqlserver2012,经过网上一顿搜索,把完整的过程奉上,供大家参考 首先创建数据库 再设置数据库的 ...

  4. AMQ学习笔记 - 19. 问题解决 - 控制Atomikos的日志输出

    概述 在使用Atomikos为ActiveMQ提供JTA支持时,Atomikos在控制台打印了繁琐的日志.这里介绍如何控制Atomikos日志输出的粒度. 解决方案 基于以下三个事实: Atomiko ...

  5. 【升级至sql 2012】sqlserver mdf向上兼容附加数据库(无法打开数据库 'xxxxx' 版本 611。请将该数据库升级为最新版本。)

    sqlserver mdf向上兼容附加数据库(无法打开数据库 'xxxxx' 版本 611.请将该数据库升级为最新版本.) 最近工作中有一个sqlserver2005版本的mdf文件,还没有log文件 ...

  6. Spring Cloud 升级最新 Greenwich 版本,舒服了~

    去年将 Spring Cloud 升级到了 Finchley 版本: Spring Cloud 升级最新 Finchley 版本,踩了所有的坑! 这个大版本栈长是踩了非常多的坑啊,帮助了不少小伙伴. ...

  7. 20160303 - 升级 Windows 10 版本 1511 后,文件夹默认打开方式为 cmd 的修复

    问题描述:升级 Windows 10 版本 1511 (OS 内部版本 10586.122)后,文件夹的默认打开方式变成了cmd.双击任何一个文件夹,显示相关的提示错误信息如下: [Window Ti ...

  8. InstallShield 2012 Spring优惠升级到最新版本(2015.4.30之前)

    InstallShield 2012 Spring即将EOF,所以仍在使用InstallShield 2012 Spring的用户请注意下面内容: InstallShield 2012 Spring升 ...

  9. AMH4.2免费版手动编译升级Nginx1.8版本方法

    从AMH免费版本停留在4.2版本之后就没有进行更新和升级,而且官方提供的解决文档也比较少,毕竟免费且没有盈利的产品还是没有多少兴趣的.但是,对于大部分网站环境来说,安装和使用AMH4.2免费版本还是够 ...

随机推荐

  1. share-Nothing原理

    Share nothing理论在数据库设计和优化中的实践应用 首先介绍share nothing概念.最早接触它是在 DataBaseManagentSystem一书的并行数据库章节中. 并行数据库要 ...

  2. wyh的天鹅~vector的使用

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语言52428 ...

  3. 解决在ios下不能自动播放音频的问题

    在ios下面是不允许自动播放音频这个操作的,不过我们可以使用微信提供的sdk来做到自动播放音乐的功能 wx.ready(()=>{}) 引入微信的sdk,之后在回调函数里面执行主动触发背景音乐播 ...

  4. 编写一个 Chrome 浏览器扩展程序

    浏览器扩展允许我们编写程序来实现对浏览器元素(书签.导航等)以及对网页元素的交互, 甚至从 web 服务器获取数据,以 Chrome 浏览器扩展为例,扩展文件包括: 一个manifest文件(主文件, ...

  5. HDU2553 N皇后问题---(dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=2553 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在 ...

  6. vscode Python 运行环境配置

    { "git.ignoreMissingGitWarning": true, "window.zoomLevel": 1, "[python]&quo ...

  7. MySQL中EXISTS的用法

    比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID ...

  8. 【Mysql优化】MySQL Profiling 的使用

    要想优化一条 Query,我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里,是消耗的 CPU计算太多,还是需要的的 IO 操作太多?要想能够清楚的了解这些信息,在 MySQL 5.0 和 M ...

  9. Python阶段复习 - part 1 - Python基础练习题

    1.实现1-100的所有的和 # 方法1: sum = 0 for i in range(1,101): sum += i print(sum) # 方法2: num1 = int(input('请输 ...

  10. wait(),sleep(),notify(),join()

    wait()注意以下几点: 1)wait()是属于Object类的方法. 2)调用了wait()之后会引起当前线程处于等待状态. 3)将当前线程置入“预执行队列”中,并且在wait()所在的代码行处停 ...