Java 对log4j RollingFileAppender创建的日志文件的权限
如何确定由Java 对log4j RollingFileAppender创建的日志文件的权限,java,log4j,file-permissions,rollingfileappender,Java,Log4j,File Permissions,Rollingfileappender,如何确定由RollingFileAppender创建的文件的权限 我最近更改了一个守护进程,我必须以非root用户的身份运行,现在正在使用0600权限创建文件(只能由所有者读取),但我希望管理员组的所有或至少成员都能读到这些文件(0644或0640)。我的tomcat应用程序创建的文件总是0644(所有人都可读) 我不知道我是否无意中更改了其他内容,或者是否与该用户的权限有关。我将父目录0777作为一个测试,它似乎没有帮助(它是0755)。显然没什么大不了的,因为我可以sudo查看它们,但这很烦
RollingFileAppender
创建的文件的权限
我最近更改了一个守护进程,我必须以非root用户的身份运行,现在正在使用0600
权限创建文件(只能由所有者读取),但我希望管理员组的所有或至少成员都能读到这些文件(0644
或0640
)。我的tomcat应用程序创建的文件总是0644
(所有人都可读)
我不知道我是否无意中更改了其他内容,或者是否与该用户的权限有关。我将父目录0777
作为一个测试,它似乎没有帮助(它是0755
)。显然没什么大不了的,因为我可以sudo
查看它们,但这很烦人,如果我必须让客户为我复制它们,这将是一个问题
环境是Ubuntu10.04LTS,使用jsvc/commons守护程序运行守护程序。如果重要的话,这里是我的log4j
config的基础:
<!DOCTYPE log4j:configuration SYSTEM 'log4j.dtd'>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
<appender name="StdOutAppender" class="org.apache.log4j.ConsoleAppender">
<!-- only send error / fatal messages to console (catalina.out) -->
<param name="threshold" value="${log4j.StdOutAppender.threshold}" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" />
<!--%d{dd-MMM-yyyy HH:mm:ss.SSS} [%5p] %c{2}.%M [line:%L]: %m%n-->
</layout>
</appender>
<appender name="TimeBasedRollingFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
<param name="append" value="true" />
<param name="encoding" value="UTF-8" />
<param name="threshold" value="${log4j.TimeBasedRollingFileAppender.threshold}" />
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="${cloud.daemon.log4j.file.config.path}.%d.gz" />
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%5p %d{ISO8601} [%t][%x] %c - %m%n" />
<!--%d{dd-MMM-yyyy HH:mm:ss.SSS} [%5p] %c{2}.%M [line:%L]: %m%n-->
</layout>
</appender>
....
....
文件权限由用户的umask决定-在log4j中无法更改它
您可能希望将用户的umask设置为0117
$ umask -S 0117
u=rw,g=rw,o=
在log4j.properties内部包括:log4j.appender.file.file=${user.home}/log
无论如何,这是我的配置,在控制台和文件“log”中显示信息
我意识到这是一个老问题,但因为它是我搜索这个问题时的第一个命中率
您只需在文件首次打开时对其设置子类RollingFileAppender
,并设置权限,如下所示:
public class WorldWritableFileAppender extends RollingFileAppender {
@Override
public synchronized void setFile(String fileName, boolean append,
boolean bufferedIO, int bufferSize) throws IOException {
super.setFile(fileName, append, bufferedIO, bufferSize);
File f = new File(fileName);
if(f.exists()) {
java.nio.file.Files.setPosixFilePermissions(f.toPath(),
EnumSet.allOf(PosixFilePermission.class));
}
}
}
然后只需在log4j.xml
中引用WorldWritableFileAppender
,而不是RollingFileAppender
<appender name="name" class="path.to.WorldWritableFileAppender">
这是因为在最初设置记录器时,以及在翻滚后创建新文件时,都会调用setFile()
。使用file.renameTo()
将旧文件移到一边,这将保留权限。Log4J-core-2.9将为FileAppender、RollingFileAppender和RollingAndomaccessFileManager中的posix操作系统提供此文件所有者、文件组和文件权限:
谢谢——我完全忘记了umask。事实证明,现在我知道谷歌的目的了,jsvc硬编码umask,所以我可能不得不接受它(或者重新编译jsvc)——这个答案不再准确。Log4j 2.9.0添加了一种在不更改umask设置的情况下配置此权限的方法。我意识到这是一个非常老的问题,但在2.8.1中有一个计划要修复的问题,该问题将允许显式设置这些权限。这在锁定到Log4j v1时非常有用。
<appender name="name" class="path.to.WorldWritableFileAppender">
<RollingFile name="RollingFile"
fileName="mylogs.log"
filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z"
fileOwner="log4j"
fileGroup="log4grp"
filePermissions="rw-r-----">