#java #log4j #file-permissions #rollingfileappender
#java #log4j #файл-разрешения #rollingfileappender
Вопрос:
Как определяются разрешения для файлов, созданных RollingFileAppender
log4j RollingFileAppender?
Недавно я изменил процесс демона, который я должен запускать как некорневой пользователь, и теперь файлы создаются с разрешениями 0600
(только для чтения владельцем), но я бы хотел, чтобы они были доступны для чтения всем или, по крайней мере, членам группы администраторов ( 0644
или 0640
). Файлы, созданные моими приложениями tomcat, всегда 0644
доступны (для чтения всеми).
Я не знаю, случайно ли я что-то изменил или это связано с разрешениями этого пользователя. Я создал родительский каталог 0777
в качестве теста, и, похоже, это не помогло (так и было 0755
). Очевидно, что это не имеет большого значения, поскольку я могу sudo
их просматривать, но довольно раздражает, и это будет проблемой, если мне придется попросить клиента скопировать их для меня.
jsvc/commons-daemon
Для запуска демона используется среда Ubuntu 10.04LTS. В случае, если это имеет значение, вот основы моей 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>
....
Комментарии:
1. Я понимаю, что это очень старый вопрос, но в 2.8.1 планируется исправить проблему с Jira , которая позволит явно установить эти разрешения.
2. Числовые разрешения более четко выражены в виде позиционных символов r w x, как указано в ваших примечаниях в скобках. «Символьный режим» chmod также поддерживает их.
Ответ №1:
Права доступа к файлам определяются umask пользователя — нет способа изменить его в самом log4j.
Вероятно, вы хотите установить для umask пользователя значение 0117
$ umask -S 0117
u=rw,g=rw,o=
Комментарии:
1. Спасибо — я совсем забыл об umask. Оказывается, теперь, когда я знаю, что искать в Google, jsvc жестко кодирует umask, поэтому мне, возможно, придется смириться с этим (или перекомпилировать jsvc) — issues.apache.org/jira/browse/DAEMON-178 .
2. Этот ответ больше не является точным. В Log4j 2.9.0 добавлен способ настройки этого без изменения настройки umask.
Ответ №2:
Log4J-core-2.9 предоставит эту функцию FileOwner, fileGroup и 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-----">
Комментарии:
1. Как это можно сделать для обратной регистрации?
Ответ №3:
Я понимаю, что это старый вопрос, но поскольку это был первый удар, когда я искал эту проблему…
Вы можете просто подклассировать 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));
}
}
}
Тогда просто ссылайтесь WorldWritableFileAppender
, а RollingFileAppender
не в вашем log4j.xml
.
<appender name="name" class="path.to.WorldWritableFileAppender">
Это работает, потому setFile()
что вызывается как при первоначальной настройке регистратора, так и при создании нового файла после ролловера. Старый файл перемещается в сторону File.renameTo()
, что сохраняет разрешения.
Комментарии:
1. Это действительно полезно, когда заблокировано в LOG4j v1.
Ответ №4:
внутри log4j.properties указано следующее: log4j.appender.file.File=${user.home}/log
в любом случае, это моя конфигурация, которая отображает информацию в консоли и файле «log».
# Root logger option
log4j.rootLogger=DEBUG, stdout, file
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${user.home}/test
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n