由于log4j配置,打开的文件过多 [英] Too many open files due to log4j config

查看:368
本文介绍了由于log4j配置,打开的文件过多的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在使用log4j 2.5.我的问题是关于 ConferenceLog 的,因此请忽略下面的其他配置.

We are using log4j 2.5. My question is in regards to the ConferenceLog so please disregard other configurations below.

log4j2.xml文件:

log4j2.xml file:

<?xml version="1.0" encoding="UTF-8"?>
    <Configuration monitorInterval="180">
        <Properties>
            <!-- change the path to conference logs below to fit your system -->
            <Property name="LOG_DIR">C:\CodeRepos\logs</Property>
            <Property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level
                %logger{36} - %msg%n</Property>
        </Properties>
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="${PATTERN}" />
            </Console>
            <Routing name="DailyLog">
                <Routes pattern="${ctx:logFileName}">
                    <Route>
                        <RollingFile name="Rolling-${ctx:logFileName}"
                            fileName="${LOG_DIR}/symproxy.log" 
                            filePattern="${LOG_DIR}/symproxy-%i.log">
                            <PatternLayout pattern="${PATTERN}" />
                            <SizeBasedTriggeringPolicy size="20971520" />
                            <DefaultRolloverStrategy max="100" />
                        </RollingFile>
                    </Route>
                </Routes>
            </Routing>
            <Routing name="ConferenceLog">
                <Routes pattern="${ctx:logFileName}">
                    <Route>
                        <RollingFile name="Rolling-${ctx:logFileName}"
                            fileName="${LOG_DIR}/conferences/${ctx:logFileName}.log"
                            filePattern="${LOG_DIR}/conferences/${ctx:logFileName}.%i.log.gz">
                            <PatternLayout pattern="${PATTERN}" />
                            <SizeBasedTriggeringPolicy size="20971520" />
                        </RollingFile>
                    </Route>
                </Routes>
            </Routing>
            <Routing name="DeviceLog">
                <Routes pattern="${ctx:logFileName}">
                    <Route>
                        <RollingFile name="Rolling-${ctx:logFileName}"
                            fileName="${LOG_DIR}/devices/${ctx:logFileName}.log"
                            filePattern="${LOG_DIR}/devices/${ctx:logFileName}.%i.log.gz">
                            <PatternLayout pattern="${PATTERN}" />
                            <SizeBasedTriggeringPolicy size="5kb" />
                            <DefaultRolloverStrategy max="3" />
                        </RollingFile>
                    </Route>
                </Routes>
            </Routing>
        </Appenders>
        <Loggers>
            <Root level="info">
                <AppenderRef ref="Console" />
                <AppenderRef ref="DailyLog" />
            </Root>
            <Logger name="conference.logger" level="debug" additivity="false">
                <AppenderRef ref="ConferenceLog" />
                <AppenderRef ref="Console" />
            </Logger>
            <Logger name="device.logger" level="info" additivity="false">
            </Logger>
        </Loggers>
    </Configuration>

我有一个小包装,在其中实例化了这个会议记录器

I have a small wrapper and in there i instantiate this conference logger

private final Log conferenceLogger = LogFactory.getLog("conference.logger");

然后像这样使用

private void logger(Long meetingId, Log log, String className, Level level, String message, Throwable error) {
        ThreadContext.put(LOG_FILE_NAME, String.valueOf(meetingId));
        logger(conferenceLogger, level, className + "." + message, error);
        ThreadContext.remove(LOG_FILE_NAME);
    }

    private static void logger(Log log, Level level, String message, Throwable error) {
        if (level == Level.DEBUG) {
            log.debug(message);
        } else if (level == Level.ERROR) {
            if (error == null) {
                log.error(message);
            } else {
                log.error(message, error);
            }
        } else if (level == Level.FATAL) {
            log.fatal(message);
        } else if (level == Level.TRACE) {
            log.trace(message);
        } else if (level == Level.INFO) {
            log.info(message);
        } else if (level == Level.WARN) {
            log.warn(message);
        }
    }

这将创建一堆名为会议ID"的文件.但是,我的问题是这些文件在打开后再也不会关闭.

This creates a bunch of files named with the "meeting id". My problem however is that these files are never closed after they are opened.

我阅读了类似的SO帖子,但是我没有没有引用我的FileAppender来调用close,也没有Logger对象,因此我不确定如何实现其修复.如何以编程方式触发这些文件的关闭? 因此,我们的一台服务器出现打开文件过多"错误.

I read over this similar SO post however I don't have references to my FileAppender to call close on, nor do I have a Logger object, so I'm not sure how to implement its fix. How do i trigger the closing of these files programmatically? One of our servers is getting the "too many open files" error due to this.

在阅读了文档之后,看起来IdlePurgePolicy应该是我所需要的,但是我看不到它对打开文件的数量有任何影响. 如果我的log4j2文件有几个不同的地方,我尝试了下面的行,但是正如我提到的那样,它没有任何作用

After reading through the documentation more it seems like IdlePurgePolicy should be what I need but I do not see it having any effect on the number of open files. I tried the below line if a few difference places of my log4j2 file but as I mentioned, it had no effect

<IdlePurgePolicy timeToLive="1" timeUnit="minutes"/>

推荐答案

IdlePurgePolicy最终解决了此问题

IdlePurgePolicy did end up fixing this

<Routing name="ConferenceLog">
    <Routes pattern="${ctx:logFileName}">
        <Route>
            <RollingFile name="Rolling-${ctx:logFileName}"
                fileName="${LOG_DIR}/conferences/${ctx:logFileName}.log"
                filePattern="${LOG_DIR}/conferences/${ctx:logFileName}.%i.log.gz">
                <PatternLayout pattern="${PATTERN}" />
                <SizeBasedTriggeringPolicy size="20971520" />
            </RollingFile>
        </Route>
    </Routes>
    <IdlePurgePolicy timeToLive="30" timeUnit="seconds"/>
</Routing>

这篇关于由于log4j配置,打开的文件过多的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆