现在工作中遇到高频写日志,如果写一条日志,log4j flush一次,那么势必对服务器的性能会产生一定影响,那么现在想要实现1秒钟 1分钟flush 一次该怎么办?
log4j 只要继承至 fileappender 则都可以immediateflush 属性。
经实测当没有指定该属性时 默认为true
那么我们怎么做到呢?
web项目继承servlet设置一个定时任务来手动flush 具体参考如下代码
Set<FileAppender> flushedFileAppenders = new HashSet<FileAppender>()
Enumeration currentLoggers = LogManager.getLoggerRepository().getCurrentLoggers()
while(currentLoggers.hasMoreElements())
{
Object nextLogger = currentLoggers.nextElement()
if(nextLogger instanceof Logger)
{
Logger currentLogger = (Logger) nextLogger
Enumeration allAppenders = currentLogger.getAllAppenders()
while(allAppenders.hasMoreElements())
{
Object nextElement = allAppenders.nextElement()
if(nextElement instanceof DailyRollingFileAppender)
{
DailyRollingFileAppender fileAppender = (DailyRollingFileAppender) nextElement
System.out.println(fileAppender.getName())
if(!flushedFileAppenders.contains(fileAppender) && !fileAppender.getImmediateFlush())
{
flushedFileAppenders.add(fileAppender)
fileAppender.setImmediateFlush(true)
currentLogger.info("FLUSH")