rsyslog 结合logrotate日志切割处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsyslog 结合logrotate日志切割处理相关的知识,希望对你有一定的参考价值。

需求

公司日志系统收集规范为:
/var/log/业务名/业务名+域名.log(不带日期)
/var/log/业务名/业务名+域名-2017-04-25.log(为前一天的日期、业务不做压缩,由运维统一处理)
/var/log/业务名 目录的权限为特定用户(系统中的uid、gid固定)

现状

harbor业务由docker容器启用logrotate来收集日志,日志生成规则为/var/log/日期/业务名.log
需要改造容器的logrotate配置实现要求,初期设想是通过logrotate直接实现该需求,通过查找资料得到logrotate仅能实现日志切割,文件名不能自定义实现,仅能处理后缀,需要结合脚本再次处理实现。

1、新增用户nobody并指定uid gid 为500

2、修改rsyslog.conf指定用户为nobody

#cat /etc/rsyslog.conf
$ModLoad imuxsock # provides support for local system logging
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$template myformat,"[%TIMESTAMP:1:4:date-mysql%-%TIMESTAMP:5:6:date-mysql%-%TIMESTAMP:7:8:date-mysql% %TIMESTAMP:8:15:%.000] [%syslogtag%] %msg%\n"
$ActionFileDefaultTemplate myformat
$RepeatedMsgReduction on
$FileOwner nobody
$FileGroup nobody
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$WorkDirectory /var/spool/rsyslog
$IncludeConfig /etc/rsyslog.d/*.conf

3、配置logrotate文件将后缀名为test.test.com.log进行日志切割操作

cat /etc/logrotate.d/logrotate_docker.conf
# Logrotate configuartion file for docker.
/var/log/docker/*/*test.test.com.log {
rotate 5  --保留5份
dateext  --打上日期标签
missingok
dateformat -%Y-%m-%d.log --日期标签格式
daily
copytruncate  --拷贝清空模式
nocompress  --不压缩
postrotate  --执行shell命令
/usr/local/bin/log.sh --实现文件名处理
endscript  --完成执行shell命令
}

4、确保logrotate配置文件权限为600

ls -lrt /etc/logrotate.d/logrotate_docker.conf
-rw------- 1 root root 281 Apr 26 17:24 /etc/logrotate.d/logrotate_docker.conf

5、确保脚本文件权限为755

ls -lrt /usr/local/bin/log.sh
-rwxr-xr-x 1 root root 188 Apr 26 17:41 /usr/local/bin/log.sh

6、脚本主要用于处理.log字符问题

logrotate不能自定义文件名,只能在后缀上加上日期或数字,需要脚本将.log字符串去掉符合日志规则
cat /usr/local/bin/log.sh 
#!/bin/bash
time=`date +%Y-%m-%d`
#cut .log string
for file in `find /var/log/docker/ -name "*log-[0-9]*.log"`
do
new_file=`echo "$file" | sed ‘s/.log-/-/‘ `
mv $file $new_file

7、处理原生日志生成string逻辑

cat /etc/rsyslog.d/rsyslog_docker.conf
#  Rsyslog configuration file for docker.
template(name="DynaFile" type="string"
#string="/var/log/docker/%$now%/%syslogtag:R,ERE,0,DFLT:[^[]*--end:secpath-replace%.log"
#default syslogtag like proxy[111349]:
string="/var/log/docker/%syslogtag:R,ERE,0,DFLT:[^[]*--end:secpath-replace%/%syslogtag:R,ERE,0,DFLT:[^[]*--end:secpath-replace%.vip.vip.com.log"
)
#if $programname == "docker" then ?DynaFile
if $programname != "rsyslogd" then -?DynaFile


8、最终生成日志如下

tree /apps/logs/
/apps/logs/
└── harbor
├── docker_jobservice
│   ├── docker_jobservice.test.test.com-2017-04-25.log
│   └── docker_jobservice.test.test.com.log
└── docker_proxy
├── docker_proxy.test.test.com-2017-04-25.log
└── docker_proxy.test.test.com.log
3 directories, 4 files


本文出自 “虫子” 博客,请务必保留此出处http://bingdian.blog.51cto.com/94171/1919743

以上是关于rsyslog 结合logrotate日志切割处理的主要内容,如果未能解决你的问题,请参考以下文章

logrotate切割日志

Logrotate切割日志

Logrotate切割日志

日志系统rsync和日志切割logrotate-Linux每日一练

日志切割 Logrotate

日志切割之Logrotate