log4j 2.5を使用しています。私の質問はConferenceLogですので、以下の設定は無視してください。log4j設定によるオープンファイルが多すぎます
log4j2.xmlファイル:
<?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>
それはそう
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);
}
}
のように使用された後、私は小さなラッパを持っており、そこに私はこの会議ロガー
private final Log conferenceLogger = LogFactory.getLog("conference.logger");
をインスタンス化これにより、「会議ID」という名前のファイルが作成されます。しかし、私の問題は、これらのファイルが開かれた後で決して閉じられないということです。
similar SO post私はFileAppender
への参照はありません。また、Logger
オブジェクトを持っているわけでもありません。そのため、修正プログラムの実装方法がわかりません。これらのファイルのクローズをプログラムでトリガーするにはどうすればよいですか? このため、私たちのサーバーの1つに「オープンファイルが多すぎます」というエラーが発生しています。
documentationを読んだあと、IdlePurgePolicyが必要なはずですが、開いているファイルの数に影響していないようです。 私はlog4j2ファイルのいくつかの差な場所であれば、以下の行を試みたが、私が述べたように、ラッパー自体は、ロガーインスタンスがそれぞれのために作成され、静的にインスタンス化されていない場合、それは何の効果
<IdlePurgePolicy timeToLive="1" timeUnit="minutes"/>
私は#2を試してみましたので、private static final Log conferenceLoggerですが、ファイルは閉じていません。私の問題であることは確かではありません。これは、さまざまな会議、2343.log、3123.logなどのための複数のログファイルを作成します。私は全体の会議ロガーを停止するだけで1つのファイルが閉じられないようにするために、私はlog4j2がファイルを閉じる方法を知っているだろう。しかし、ラッパーは、特定のファイルが閉じられる準備ができていることを知らせることができます。 –