log4j2で出力されるログファイル、デフォルトだと所有者にだけ書き込み権限がついていた。別ユーザでファイルを触る必要があり、グループにも権限が欲しい。
やれやれ。僕は検索した。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" name="MyApp" packages="">
<Properties>
<Property name="baseDir">logs</Property>
</Properties>
<Appenders>
<RollingFile name="RollingFile" fileName="${baseDir}/app.log"
filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyyMMdd}.log.gz"
filePermissions="rw-------">
<PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
<DefaultRolloverStrategy stopCustomActionsOnError="true">
<PosixViewAttribute basePath="${baseDir}/$${date:yyyy-MM}" filePermissions="r--r--r--">
<IfFileName glob="*.gz" />
</PosixViewAttribute>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
これによるとRollingFileの属性としてfilePermissions
を書いてあげればいいらしい。
↑によると、どうも2.9.0以降の機能とのこと
残念ながら2.7.0を使っていたのでgradleで最新版を落とした
ext {
log4jVersion = '2.11.1'
}
dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: "${log4jVersion}"
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: "${log4jVersion}"
}
使っていたlog4j2.xmlの定義に合わせるとこんな感じ
<RollingFile name="logfile"
append="true"
fileName="path/to/log"
filePermissions="rw-rw-r--">
<PatternLayout pattern="${pattern.of.log}"/>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
これでよし。次にxmlが読み込まれるタイミングで対象のファイル権限が変更された。
当然といえば当然だけど、既にローテートされた過去のファイルに関しては権限はそのままだった。