現象描述: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>