java - Permisos en archivos de registro creados por log4j RollingFileAppender
file-permissions (4)
Log4J-core-2.9 proporcionará esta característica fileOwner , fileGroup y filePermissions para posix OS en FileAppender , RollingFileAppender y RollingRandomAccessFileManager :
<RollingFile name="RollingFile"
fileName="mylogs.log"
filePattern="mylogs-$${date:MM-dd-yyyy}-%i.log.7z"
fileOwner="log4j"
fileGroup="log4grp"
filePermissions="rw-r-----">
¿Cómo se determinan los permisos para los archivos creados por RollingFileAppender
?
Hace poco cambié un proceso de daemon que debo ejecutar como un usuario no root y los archivos ahora se están creando con permisos de 0600
(solo legibles por el propietario), pero me gustaría que todos los miembros o al menos los puedan leer. de un grupo de administradores ( 0644
o 0644
). Los archivos creados por las aplicaciones de mi tomcat siempre son 0644
(todos los pueden leer).
No sé si cambié inadvertidamente otra cosa o si es algo que ver con los permisos de ese usuario. Hice el directorio de padres 0777
como una prueba y no pareció ayudar (era 0755
). Obviamente, no es un gran problema ya que puedo sudo
para mirarlos, pero es bastante molesto y será un problema si tengo que tener un cliente que me los copie.
El entorno es Ubuntu 10.04LTS utilizando jsvc/commons-daemon
para ejecutar el daemon. En caso de que importe, aquí están los conceptos básicos de mi configuración 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>
....
Los permisos de los archivos están determinados por la umask del usuario, no hay forma de cambiarlo en log4j.
Es probable que desee establecer umask del usuario a 0117
$ umask -S 0117
u=rw,g=rw,o=
Me doy cuenta de que esta es una pregunta antigua, pero como fue el primer golpe aún cuando busqué este problema ...
Puede simplemente subclasificar RollingFileAppender
y establecer el permiso en el archivo cuando se abre por primera vez, de esta manera:
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));
}
}
}
Luego simplemente WorldWritableFileAppender
referencia a WorldWritableFileAppender
lugar de RollingFileAppender
en su log4j.xml
.
<appender name="name" class="path.to.WorldWritableFileAppender">
Esto funciona porque a setFile()
se le llama tanto al configurar originalmente el registrador como al crear un nuevo archivo después de la transferencia. El archivo antiguo se mueve a un lado con File.renameTo()
, que conserva los permisos.
dentro de log4j.properties incluye esto: log4j.appender.file.File=${user.home}/log
todos modos, esta es mi configuración que muestra información en la consola y el archivo "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