现在互联网公司系统基本都是分布式部署,应用日志分布在不同的机器上,不不便于分析和统计,使用Linux rsync进行日志同步到同一台机器进行处理
rsync 分为服务端和客户端
服务端用于接收同步文件,客户端用户发送文件到服务端
一、日志收集
1、服务端配置:/etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 0
transfer logging=no
strict modes = yes
port = 873
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /data/logs/rsync/rsyncd.log
# 需要同步的模块,这是其中一个,可以有多个
[data]
# 同步的根目录
path = /data/
# 忽略错误
ignore errors
# 只读falsh 表示可读可写
read only = false
# 不可列表
list = false
# 允许访问的网段
hosts allow = 10.0.0.0/24
# 拒绝访问的网段
hosts deny = 0.0.0.0/32
# 用户名
auth users = rsync_backup
# 密码文件路径
secrets file = /etc/rsync.password
以守护进程的方式启动rsync
2、客户端配置
客户端使用crontab 设置定时任务发送文件到,指定的rsync服务端同步目录中
0 * * * * /usr/bin/rsync -auv /xxx.log 172.10.2.111::data
二、日志分析
将多个目录下合并到同一个文件中,统计最近一个小时日志文件
#!/bin/bash
ONE_HOUR_AGO=`date -d '-1hour' +%d/%b/%Y:%H`
MERGE_LOG_NAME=/data/logs/xxx-merge.log
echo $ONE_HOUR_AGO
echo $MERGE_LOG_NAME
if [ ! -f "$MERGE_LOG_NAME" ]; then
touch "$MERGE_LOG_NAME"
fi
cat /data/logs/access_xxx.log|grep "$ONE_HOUR_AGO" >> $MERGE_LOG_NAME
cat /data/logs/access_xxx.log|grep "$ONE_HOUR_AGO" >> $MERGE_LOG_NAME
cat /data/logs/access_xxx.log|grep "$ONE_HOUR_AGO" >> $MERGE_LOG_NAME
三、邮件发送,Velocity模版
使用spring集成javamail 和 velicity模版
<!-- spring mail -->
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.host}" />
<property name="port" value="${mail.port}"/>
<property name="protocol" value="${mail.protocol}"/>
<property name="username" value="${mail.username}" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
</props>
</property>
</bean>
<!-- velocity 配置相关属性如VM加载路径-->
<bean class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<map>
<entry key="resource.loader" value="class"/>
<entry key="class.resource.loader.class" value="org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"/>
</map>
</property>
</bean>
邮件发送、模版解析/**组织邮件发送的元素*/
private MimeMessage createMailMessage(Map<String, Object> model) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(bundle.getString("mail.from")); // 发件人
helper.setTo(bundle.getString("mail.to")); // 收件人
helper.setCc(bundle.getString("mail.cc").split(",")); // 抄送
helper.setSubject("xxx统计"); // 主题
helper.setText(resolveVelocityTemplate(model), true); // 无附件模式,内容
return message;
}
/**解析Velocity模版*/
public String resolveVelocityTemplate(Map<String, Object> model) {
String content = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "template/mail.vm", "UTF-8", model);
return StringUtils.isBlank(content) ? "" : content;
}