現在互聯網公司系統基本都是分佈式部署,應用日誌分佈在不同的機器上,不不便於分析和統計,使用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;
}