现象描述:linux
线上机器的程序文件(包括TOMCAT自身)使用APP帐号做为属主运行,同时禁止了APP帐号的BASH。登陆系统使用了统一认证,这样每一个人都有本身的帐号登陆系统。为了方便开发人员登陆查看日志,日志文件的文件权限为"rw-r-r",同时也是系统默认的umask。这里简单说下umask权限码。在Linux系统下,新建目录的权限是777减去umask码值,新建文件的权限是666减去umaks码值,因为linux默认的umask是0022,因此通常新建目录和文件的默认权限分别是755和644。spring
[root@localhost ~]# umask 0022
可是,在部署tomcat后,发现tomcat的日志文件catalina.out的权限是640(即"rw-r-----"),新生成的日志文件权限全都是640,开发者使用其余用户登陆后对这些日志文件均不可读!apache
-rw-r----- 1 app app 356K 12月 08 19:09 catalina.out -rw-r----- 1 app app 27M 12月 02 10:17 catalina.out.7.gz -rw-r----- 1 app app 29M 12月 03 13:08 catalina.out.6.gz -rw-r----- 1 app app 23M 12月 04 15:25 catalina.out.5.gz -rw-r----- 1 app app 33M 12月 05 11:30 catalina.out.4.gz -rw-r----- 1 app app 31M 12月 06 08:44 catalina.out.3.gz -rw-r----- 1 app app 31M 12月 07 10:02 catalina.out.2.gz -rw-r----- 1 app app 45M 12月 08 19:09 catalina.out.1.gz
缘由分析一:Tomcat在启动(catalina.sh)时会从新设置UMASK
Tomcat在启动服务时可能会从新设置UMASK值,其默认值为0027,而操做系统的默认值0022,二者不同。解决办法:须要到catalina.sh脚本里修改UMASK值:api
如上,将catalina.sh脚本中的"UMASK"的值由"0027"改成"0022",即改为系统当前用户的umask便可!tomcat
缘由分析二:log4j2设置日志文件读写权限(filePermissions)
因为日志比较大,而且实时输出,须要天天作日志轮询,若是日志轮询的过程是经过log4j插件自动切割完成的,则可能会由lig4j2的filePermissions设置引发日志文件不可读现象。log4j2在2.9版本以上有一个filePermissions,能够指定文件权限。app
spring-boot使用log4j2做为日志插件的时候须要设置日志文件的读写权限,能够File 上增长filePermissions,如:ide
<File name="File" fileName="logs/catalina.log" filePermissions="rw-r--rw-"> <PatternLayout pattern="%m%n" /> </File>
须要注意的是,spring-boot version1.5.7.release的spring-boot-starter-log4j2中引用的log4j2的版本是2.7,而filePermissions只有在2.9以上的版本才有,因此须要在pom.xml中添加2.9的依赖spring-boot
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency>