Разрешения на файлы журналов, созданные log4j RollingFileAppender

#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