Ken*_*aln 19 java file-permissions log4j rollingfileappender
如何RollingFileAppender确定创建的文件权限?
我最近更改了一个守护程序进程,我必须以非root用户身份运行,现在正在创建具有权限的文件0600(只有所有者可读),但我希望它们可被所有或至少成员读取管理员组(0644或0640).我的tomcat应用程序创建的文件总是0644(所有人都可读).
我不知道我是否无意中改变了其他内容,或者是否与该用户的权限有关.我将父目录0777作为测试,它似乎没有帮助(它是0755).显然不是什么大不了,因为我可以sudo看看它们,但相当烦人,如果我必须有一个客户为我复制它将是一个问题.
环境是Ubuntu 10.04LTS jsvc/commons-daemon用来运行守护进程.如果重要的是我的log4j配置的基础知识:
<!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>
....
Run Code Online (Sandbox Code Playgroud)
Bri*_*ach 17
文件权限由用户的umask决定 - 没有办法在log4j本身中更改它.
您可能希望将用户的umask设置为 0117
$ umask -S 0117
u=rw,g=rw,o=
Run Code Online (Sandbox Code Playgroud)
Log4J的核心- 2.9将提供这一功能 fileOwner,文件组和filePermissions在POSIX OS FileAppender,RollingFileAppender进行和RollingRandomAccessFileManager:
<RollingFile name="RollingFile"
fileName="mylogs.log"
filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z"
fileOwner="log4j"
fileGroup="log4grp"
filePermissions="rw-r-----">
Run Code Online (Sandbox Code Playgroud)
我意识到这是一个老问题,但是因为当我搜索这个问题时它仍然是第一次命中......
您可以简单地子类化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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后只需引用WorldWritableFileAppender而不是RollingFileAppender在您的log4j.xml.
<appender name="name" class="path.to.WorldWritableFileAppender">
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为setFile()在最初设置记录器时以及在翻转后创建新文件时都会调用。旧文件被移到一边File.renameTo(),保留了权限。
| 归档时间: |
|
| 查看次数: |
27300 次 |
| 最近记录: |