网站首页

关于Log42j引发的日志文件权限的问题

23 8月 , 2019  

至于Log42j引发的日记文件权限的主题材料

背景介绍

咱俩的生产碰着下有一套汤姆cat下运营的次序,为了记录应用日志,一般都应用Log4j来产生。

境况描述

一般大家是如此设置,程序文件(包涵TOMCAT自个儿)使用TOMCAT账号作为属主运营,同一时候取缔了TOMCAT的BASH。登入系统使用了合併验证,那样各种人都有友好的账号登入系统。为了便于开垦人士登陆查看日志,日志文件的公文权限为rw-r-r
同期也是系统暗中同意的umask
由于TOMCAT和TOMCAT是本土账号,操作人士采纳了联合验证格局,理论上不属于TOMCAT组的账号只用于READ权限查看就可以。但古怪的职业时有发生了

地方描述

因为日志不小,且实时输出,所以每日早晚要做日志轮询。譬如当天的日志为abc.log,那么前天的日记就是abc-20180201.log
那几个历程是log4j在清晨自动切割的。

但奇异的是每一天轮询,abc.log的文本权限产生了rw-r—–
既640权力,普通客户未有其余权力了。

-rw-r—– 1 tomcat tomcat 5472401566 Jan 14 23:59 abc-2018-01-27.log
-rw-r—– 1 tomcat tomcat 1240070383 Jan 15 11:02 abc.log

开辟职员无法检查选取日志,那是可怜的

排查进度

第一检查了目录的umask

[[email protected]
abc]# umask
0022

发觉是健康的,接着检查了tomcat的umask,在/etc/profile也绝非那些,相同的时间想到tomcat不能够登入,所以那些地点的检讨意义十分小。

随后和支出合计,将日志文件文件权限强行改造,有时复苏的例行

-rw-r–r– 1 tomcat tomcat 5472401566 Jan 14 23:59 abc-2018-01-27.log
-rw-r–r– 1 tomcat tomcat 1240070383 Jan 15 11:02 abc.log

只是第二天,奇异的作业时有发生了

-rw-r–r– 1 tomcat tomcat 5472401566 Jan 14 23:59 abc-2018-01-14.log
-rw-r—– 1 tomcat tomcat 5472401566 Jan 15 23:59 abc-2018-01-15.log
-rw-r—– 1 tomcat tomcat 1240070383 Jan 16 11:02 abc.log

abc.log文件和晌午切割的文件abc-2018-01-15.log文件权限全体变回640,而挟持修改的abc-2018-01-14.log文件属性未有变动,由于文件切割是由log42j调控,所以基本规定是log4j搞的鬼。

协理开采查了一下log4j2在2.9本子以上有叁个filePermissions,能够内定文件权限。遂通知开辟修改了这一个BUG

进级程序,重启测验后,难题消除。

本文永恒更新链接地址:

背景介绍
我们的生育情形下有一套汤姆cat下运作的次第,为了记录应用日志,一般都利用Log4j来变成。…

原稿地址:

一、配置文件

Linux系统默许安装logrotate工具,它暗中同意的配置文件在:

/etc/logrotate.conf

/etc/logrotate.d/

logrotate.conf 才紧要的安顿文件,logrotate.d
是四个索引,该目录里的有所文件都会被主动的读入/etc/logrotate.conf中实施。

金沙4066官网,除此以外,假使 /etc/logrotate.d/
里面包车型客车文件中未有设定一些细节,则会以/etc/logrotate.conf这几个文件的设定来作为暗中同意值。

Logrotate是依据CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动实现的。实际运营时,Logrotate会调用配置文件/etc/logrotate.conf。可以在/etc/logrotate.d目录里放置自定义好的配备文件,用来覆盖Logrotate的缺省值。

#!/bin/sh

# Clean non existent log file entries from status file

cd /var/lib/logrotate

test -e status || touch status

head -1 status > status.clean

sed ‘s/”//g’ status | while read logfile date

do

[ -e “$logfile” ] && echo “\”$logfile\” $date”

done >> status.clean

mv status.clean status

test -x /usr/sbin/logrotate || exit 0

/usr/sbin/logrotate /etc/logrotate.conf

即使等比不上cron自动试行日志轮转,想手动强制切割日志,需求加-f参数;不过专门的学问推行前最佳通过Debug选项来证实一下(-d参数),那对调和也很关键:

# /usr/sbin/logrotate -f /etc/logrotate.d/nginx

# /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx

logrotate 命令格式:

logrotate [OPTION…]

-d, –debug :debug情势,测验配置文件是还是不是有错误。

-f, –force :强制转储文件。

-m, –mail=command :压缩日志后,发送日志到钦赐邮箱。

-s, –state=statefile :使用钦定的事态文件。

-v, –verbose :呈现转储进程。

依据日志切割设置开展操作,并呈现详细信息:

[root@huanqiu_web1~]# /usr/sbin/logrotate -v /etc/logrotate.conf

[root@huanqiu_web1~]# /usr/sbin/logrotate -v /etc/logrotate.d/php

遗闻日志切割设置举办施行,并体现详细音讯,不过不开展具体操作,debug格局

[root@huanqiu_web1~]# /usr/sbin/logrotate -d /etc/logrotate.conf

[root@huanqiu_web1~]# /usr/sbin/logrotate -d
/etc/logrotate.d/nginx

翻看各log文件的切实可行实市价况

[root@fangfull_web1 ~]# cat /var/lib/logrotate.status

2)切割介绍

譬喻说以种类日志/var/log/message做切割来轻松表明下:

先是次施行完rotate(轮转)之后,原来的messages会产生messages.1,并且会创设叁个空的messages给系统来存款和储蓄日志;

第二遍实践之后,messages.1会成为messages.2,而messages会产生messages.1,又导致三个空的messages来囤积日志!

假诺仅设定保留多个日志(即轮转3次)的话,那么推行第叁遍时,则
messages.3这一个档案就能够被剔除,并由末端的较新的保留日志所代替!也正是会保留最新的多少个日志。

日记终归轮换三遍,这几个是依靠配置文件中的dateext 参数来判别的。

看下logrotate.conf配置:

# cat /etc/logrotate.conf

# 底下的设定是 “logrotate 的默许值” ,要是別的文件设定了别样的值,

# 就能以其余文件的设定为主

weekly//暗中同意每11日施行贰回rotate轮转专门的学业

rotate4//保留多少个日志文件(轮转三遍).暗许保留五个.正是点名日志文件删除在此之前轮转的次数,0
指未有备份

create//自动成立新的日志文件,新的日志文件具有和原本的公文一律的权柄;因为日志被改名换姓,由此要创建二个新的来承接存款和储蓄以前的日记

dateext//那么些参数很入眼!正是切割后的日志文件以目前天期为格式结尾,如xxx.log-二〇一二1216这样,要是注释掉,切割出来是按数字递增,即日前说的
xxx.log-1这种格式

compress//是还是不是由此gzip压缩转储现在的日志文件,如xxx.log-二零一三1216.gz
;固然不须要减小,注释掉就行

include/etc/logrotate.d

# 将 /etc/logrotate.d/ 目录中的全体文件都加载进来

/var/log/wtmp{//仅针对 /var/log/wtmp 所设定的参数

monthly//每月二遍切割,取代默许的七日

minsize1M//文件大小超越 1M 后才会切割

create0664rootutmp//钦点新建的日记文件权限以及所属顾客和组

rotate1//只保留二个日志.

}

# 这一个 wtmp 可记下客户登陆系统及系统重启的时光

# 因为有 minsize
的参数,因而不见得每种月一定会举办三回喔.要看文件大小。

由这些文件的设定能够精通/etc/logrotate.d其实正是由/etc/logrotate.conf
所规划出来的目录,即便能够将持有的配备都写入 /etc/logrotate.conf
,不过那样一来这么些文件就实际上是太复杂了,特别是当使用过多的劳动在系统方面时,
每一种服务都要去修改 /etc/logrotate.conf 的设定也仿佛不太合理了。

故此,假设单独出来一个索引,那么各种要切割日志的服务,
就能够独立成为贰个文本,况且放置到 /etc/logrotate.d/ 个中。

别的首要参数表达:

compress通过gzip压缩转储以往的日志

nocompress不做gzip压缩管理

copytruncate用于还在张开中的日志文件,把当下日记备份并截断;是先拷贝再清空的措施,拷贝和清空之间有二个岁月差,大概会放弃部分日记数据。

nocopytruncate备份日志文件不过不截断

create mode ownergroup轮转时内定成立新文件的性格,如create0777nobody
nobody

nocreate不成立新的日记文件

delaycompress和compress一同利用时,转储的日志文件到下一遍转储时才压缩

nodelaycompress覆盖delaycompress选项,转储同一时间削减。

missingok如若日志遗失,不报错继续滚动下多少个日记

errorsaddress专项储备时的错误新闻发送到钦命的Email地址

ifempty即便日志文件为空文件也做轮转,那个是logrotate的缺省选项。

notifempty当日志文件为空时,不开展滚动

mailaddress把转储的日志文件发送到钦赐的E-mail地址

nomail转储时不发送日志文件

olddirdirectory转储后的日记文件放入内定的目录,必须和当明天记文件在同多个文件系统

noolddir转储后的日记文件和目今天记文件放在同三个目录下

sharedscripts运营postrotate脚本,效率是在有着日志都轮转后统一实行二遍剧本。若无配置那些,那么每一种日志轮转后都会推行三回剧本

prerotate在logrotate转储从前供给奉行的下令,例如修改文件的天性等动作;必需独立成行

postrotate在logrotate转储之后须要实施的吩咐,比如重新开动(kill-HUP)某些服务!必得独立成行

daily钦定转储周期为天天

weekly内定转储周期为周周

monthly钦定转储周期为每月

rotatecount钦命日志文件删除在此之前转储的次数,0指未有备份,5指保留5个备份

dateext使用当期日子作为命名格式

dateformat.%s合营dateext使用,紧跟在下一行出现,定义文件切割后的文书名,必得合作dateext使用,只帮衬%Y%m%d%s那多少个参数

size(或minsize)log-size当日志文件到达内定的大小时才转储,log-size能钦定bytes(缺省)及KB(sizek)或MB(sizem).

当日志文件>=log-size的时候就转储。以下为法定格式:(别的格式的单位大小写没有试过)

size=5或size5(>=5个字节就转储)

size=100k或size100k

size=100M或size100M

小示例:上面多个切割nginx日志的配备

[root@master-server~]# vim /etc/logrotate.d/nginx

/usr/local/nginx/logs/*.log{

daily

rotate7

missingok

notifempty

dateext

sharedscripts

postrotate

if[-f/usr/local/nginx/logs/nginx.pid];then

kill-USR1`cat/usr/local/nginx/logs/nginx.pid`

fi

endscript

}

享受一例曾经接纳过的nginx日志切割管理脚本:

1)logrotate日志分割配置

[root@bastion-IDC~# vim /etc/logrotate.d/nginx

/data/nginx_logs/*.access_log

{

nocompress

daily

copytruncate

create

ifempty

olddir/data/nginx_logs/days

rotate0

}

2)日志分割脚本

[root@bastion-IDC~# vim /usr/local/sbin/logrotate-nginx.sh

#!/bin/bash

#创造转储日志压缩存放目录

mkdir-p/data/nginx_logs/days

#手工对nginx日志实行切割调换

/usr/sbin/logrotate-vf/etc/logrotate.d/nginx

#当前时间

time=$(date-d”yesterday”+”%Y-%m-%d”)

#进去转储日志寄放目录

cd/data/nginx_logs/days

#对目录中的转储日志文件的文件名举办统一改换

foriin$(ls./ |grep”^\(.*\)\.[[:digit:]]$”)

do

mv${i}./$(echo${i}|sed-n’s/^\(.*\)\.\([[:digit:]]\)$/\1/p’)-$(echo$time)

done

#对转储的日志文件实行压缩寄存,并删除原有转储的日记文件,只保留压缩后的日志文件。以节省存款和储蓄空间

foriin$(ls./ |grep”^\(.*\)\-\([[:digit:]-]\+\)$”)

do

tarjcvf${i}.bz2./${i}

rm-rf./${i}

done

#只保留近些日子7天的缩减转储日志文件

find/data/nginx_logs/days/*
-name”*.bz2″-mtime7-typef-execrm-rf{}\;

3)crontab定期试行

[root@bastion-IDC~# crontab -e

#logrotate

00* * * /bin/bash-x/usr/local/sbin/logrotate-nginx.sh>
/dev/null2>&1

手动施行脚本,测验下看看:

[root@bastion-IDC~# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh

[root@bastion-IDC~# cd /data/nginx_logs/days

[root@bastion-IDCdays# ls

huantest.access_log-2017-01-18.bz2

php脚本切割一例:

[root@huanqiu_web1~]# cat /etc/logrotate.d/php

/Data/logs/php/*log{

daily

rotate365

missingok

notifempty

compress

dateext

sharedscripts

postrotate

if[-f/Data/app/php5.6.26/var/run/php-fpm.pid];then

kill-USR1`cat/Data/app/php5.6.26/var/run/php-fpm.pid`

fi

endscript

postrotate

/bin/chmod644/Data/logs/php/*gz

endscript

}

[root@huanqiu_web1~]# ll /Data/app/php5.6.26/var/run/php-fpm.pid

-rw-r–r–1rootroot4Dec2817:03/Data/app/php5.6.26/var/run/php-fpm.pid

[root@huanqiu_web1~]# cd /Data/logs/php

[root@huanqiu_web1php]# ll

total25676

-rw-r–r–1rootroot0Jun12016error.log

-rw-r–r–1nobodynobody182Aug302015error.log-20150830.gz

-rw-r–r–1nobodynobody371Sep12015error.log-20150901.gz

-rw-r–r–1nobodynobody315Sep72015error.log-20150907.gz

………

nginx日志切割一例

[root@huanqiu_web1~]# cat /etc/logrotate.d/nginx

/Data/logs/nginx/*/*log{

daily

rotate365

missingok

notifempty

compress

dateext

sharedscripts

postrotate

/etc/init.d/nginx reload

endscript

}

[root@huanqiu_web1~]# ll /Data/logs/nginx/www.huanqiu.com/

……….

-rw-r–r–1rootroot1652Jan100:00error.log-20170101.gz

-rw-r–r–1rootroot1289Jan200:00error.log-20170102.gz

-rw-r–r–1rootroot1633Jan300:00error.log-20170103.gz

-rw-r–r–1rootroot3239Jan400:00error.log-20170104.gz

系统日志切割一例

[root@huanqiu_web1~]# cat /etc/logrotate.d/syslog

/var/log/cron

/var/log/maillog

/var/log/messages

/var/log/secure

/var/log/spooler

{

sharedscripts

postrotate

/bin/kill-HUP`cat/var/run/syslogd.pid2> /dev/null`2>
/dev/null||true

endscript

}

[root@huanqiu_web1~]# ll /var/log/messages*

-rw——-1rootroot34248975Jan1918:42/var/log/messages

-rw——-1rootroot51772994Dec2503:11/var/log/messages-20161225

-rw——-1rootroot51800210Jan103:05/var/log/messages-20170101

-rw——-1rootroot51981366Jan803:36/var/log/messages-20170108

-rw——-1rootroot51843025Jan1503:40/var/log/messages-20170115

[root@huanqiu_web1~]# ll /var/log/cron*

-rw——-1rootroot2155681Jan1918:43/var/log/cron

-rw——-1rootroot2932618Dec2503:11/var/log/cron-20161225

-rw——-1rootroot2939305Jan103:06/var/log/cron-20170101

-rw——-1rootroot2951820Jan803:37/var/log/cron-20170108

-rw——-1rootroot3203992Jan1503:41/var/log/cron-20170115

[root@huanqiu_web1~]# ll /var/log/secure*

-rw——-1rootroot275343Jan1918:36/var/log/secure

-rw——-1rootroot2111936Dec2503:06/var/log/secure-20161225

-rw——-1rootroot2772744Jan102:57/var/log/secure-20170101

-rw——-1rootroot1115543Jan803:26/var/log/secure-20170108

-rw——-1rootroot731599Jan1503:40/var/log/secure-20170115

[root@huanqiu_web1~]# ll /var/log/spooler*

-rw——-1rootroot0Jan1503:41/var/log/spooler

-rw——-1rootroot0Dec1803:21/var/log/spooler-20161225

-rw——-1rootroot0Dec2503:11/var/log/spooler-20170101

-rw——-1rootroot0Jan103:06/var/log/spooler-20170108

-rw——-1rootroot0Jan803:37/var/log/spooler-20170115

tomcat日志切割一例

[root@huanqiu-backup~]# cat /etc/logrotate.d/tomcat

/Data/app/tomcat-7-huanqiu/logs/catalina.out{

rotate14

daily

copytruncate

compress

notifempty

missingok

}

[root@huanqiu-backup~]# ll
/Data/app/tomcat-7-huanqiu/logs/catalina.*

-rw-r–r–.1rootroot0Jan1919:11/Data/app/tomcat-7-huanqiu/logs/catalina.out

-rw-r–r–.1rootroot95668Jan1919:11/Data/app/tomcat-7-huanqiu/logs/catalina.out.1.gz

最早用过的nginx日志管理一例

[root@letv-backup~]# vim /letv/sh/cut_nginx_log.sh

#!/bin/bash

# 你的日记文件贮存目录

logs_path=”/letv/logs/”

# 日志文件的名字,八个必要空格隔断

logs_names=(error accesspv_access)

dates=`date-d”yesterday”+”%Y%m%d”`

mkdir-p${logs_path}$dates/

num=${#logs_names[@]}

for((i=0;i

mv${logs_path}${logs_names[i]}.log${logs_path}$dates/${logs_names[i]}.log

done

#nginx平滑重启

kill-USR1`cat/letv/logs/nginx/nginx.pid`

整合crontab定期举办

[root@letv-backup~]# crontab -e

#nginx日志切割

0000* * *cd/letv/logs;/bin/bash/letv/sh/cut_nginx_log.sh>
/dev/null2>$1

3)尝试化解logrotate不能够自动轮询日志的不二等秘书诀

场景注解:

运用logrotate轮询nginx日志,配置好之后,开采nginx日志一连二日没被切割,那是干什么呢??

接下来开始反省日志切割的铺排文件是或不是有标题,检查后确虞诩插文件一切平常。

于是狐疑是logrotate预约的cron没施行,查看了cron的日记,发掘有一条Dec 7
04:02:01 www crond[18959]: (root) CMD (run-parts
/etc/cron.daily)这样的日记,注脚cron在04:02分时已经推行/etc/cron.daily目录下的次序。

跟着查看/etc
/cron.daily/logrotate(那是logrotate自动轮转的本子)的剧情:

[root@huanqiu_test~]# cat /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate/etc/logrotate.conf>/dev/null2>&1

EXITVALUE=$?

if[$EXITVALUE!=0];then

/usr/bin/logger-tlogrotate”ALERT exited abnormally with
[$EXITVALUE]”

fi

exit0

不曾开采相当,配置好的日记轮转操作都以由这些剧本实现的,一切运维平常化,脚本应该就没问题。

直白实施命令:

[root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf

这个系统日志是常规轮询了,但nginx日志却依旧没轮询。

进而强行运转记录文件维护操作,纵使logrotate指令感觉未有索要,应该有希望是logroate以为nginx日志太小,不开展轮询。

故须求强制轮询,即在/etc/cron.daily/logrotate脚本校官 -t 参数替换来 -f
参数

[root@huanqiu_test~]# cat /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate/etc/logrotate.conf>/dev/null2>&1

EXITVALUE=$?

if[$EXITVALUE!=0];then

/usr/bin/logger-flogrotate”ALERT exited abnormally with
[$EXITVALUE]”

fi

exit0

末段最终重启下cron服务:

[root@huanqiu_test~]# /etc/init.d/crond restart

Stoppingcrond:[OK]

Startingcrond:[OK]


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图