java日志的处理之路
虎猫一直在做一件事情,那就是对于程序的监控和管理;今天分享一下对于日志的处理。
需求:我现在需要做的事情是一个项目。其中有很多的问题需要监控;也就是项目部署上去之后,我会害怕别人的攻击所以我需要去记载别人对于我的网站的浏览的记录(也就是我们说的日志);做成这样一件事情做好需要的知识点真的是很多;下面一一来处理
首先就是对于日志的处理;我们有很多种选择,第一种:在项目上搭建log4j(或者其他的插件来帮我们实现),但是我这个项目比较小,小到我不想去加一个相对来说那么庞大的东西,那么怎么办,只能写了,下面来看看日志处理的类
package net.skyedu.utils; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import sendMessage.MailSenderInfo; import sendMessage.SimpleMailSender; public class LogUtil { private static File logfile = new File(Env.getInstance().getProperty("logPath")); private static final String dataformat1="yyyy-MM-dd HH:mm:ss"; private static boolean flag = true; static{ if(!logfile.exists()){ try { logfile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } } /** * 写到日志文件 */ public static void writeLog(String logContent){ BufferedWriter out =null; try { out =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logfile,true),"utf-8")); out.newLine(); out.write(getCurrentDate(dataformat1)+" ------ "+logContent); } catch (IOException e) { e.printStackTrace(); }finally{ try { out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 获取到系统时间 * @return */ public static String getCurrentDate(String path1){ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat(path1); return sdf.format(date); } /** * 发送邮件到我的邮箱 * @param mailContent */ public static void sendMail(String mailContent){ //这个类主要是设置邮件 MailSenderInfo mailInfo = new MailSenderInfo(); mailInfo.setMailServerHost(Env.getInstance().getProperty("mailServerHost")); mailInfo.setMailServerPort(Env.getInstance().getProperty("mailServerPort")); mailInfo.setValidate(true); mailInfo.setUserName(Env.getInstance().getProperty("mailUserName")); mailInfo.setPassword(Env.getInstance().getProperty("mailUserPw"));//您的邮箱密码 mailInfo.setFromAddress(Env.getInstance().getProperty("mailUserName")); mailInfo.setToAddress(Env.getInstance().getProperty("mailToAddress")); mailInfo.setSubject(Env.getInstance().getProperty("mailSubjuct")); mailInfo.setContent(mailContent+" 发生时间:"+getCurrentDate(dataformat1)); //这个类主要来发送邮件 SimpleMailSender sms = new SimpleMailSender(); sms.sendTextMail(mailInfo); } public static void main(String[] args) { } }
首先这里呈现的东西是有点乱,包括对于文件的写的操作(要注意的地方就是文件的追加写out =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logfile,true),"utf-8"));就是这一行代码,在new FileOutputStream这个类的构造中,有一个append的参数,如果说吧这个值设置为true的话那么就是追加写,如果把这个值设置为false的话,那么就是覆盖写,相当于linux中的>(覆盖写) >>(追加写)
既然日志写好了,那么我们要做的事情就是需要对这个日志进行监控了,我们现在要做的事情不是特别复杂的监控,只对这个日志文件的大小进行监控,当这个日志文件达到了一定的大小的时候,我们肯定是需要进行处理的,那么怎么处理呢;我们可以发短信到自己的手机上通知自己(如果我们有相应的短信平台作为支撑的话),如果没有的话,那我们只能退而求其次,给我们发一封邮件把,由于现在微信的流行起立,其实我们发短信和发邮件是一个样子,因为微信会把我们的邮件提示出来,但是有一个前提就是你得每天打开微信,有点耗费手机的电量
发送邮件的话用到了javaMail来发送邮件
最后还剩下一个问题,我们需要去监控日志什么时候超过了我们制定的大小;现在处理用监听器监听可以每隔几小时查看一次,这部分代码贴出来(包括时间控件)
1 package net.skyedu.service; 2 3 import java.util.Timer; 4 5 import javax.servlet.ServletContextEvent; 6 import javax.servlet.ServletContextListener; 7 8 import net.skyedu.utils.MyTask; 9 10 public class MyListener implements ServletContextListener { 11 12 private Timer timer = null; 13 14 public void contextInitialized(ServletContextEvent event) { 15 timer = new Timer(true); 16 //设置任务计划,启动和间隔时间 17 timer.schedule(new MyTask(), 0, 12*60*60*1000); 18 } 19 20 public void contextDestroyed(ServletContextEvent event) { 21 timer.cancel(); 22 } 23 24 25 }
package net.skyedu.utils; import java.io.File; import java.util.TimerTask; public class MyTask extends TimerTask { public void run() { //一天的时间内搜索一次,如果说邮件的大小大于了指定的值,那么就必须发送邮件给管理员 File logfile = new File(Env.getInstance().getProperty("logPath")); //在写完之后判断文件的大小,如果说文件大于1024k的话发送邮件出来进行处理 if(logfile.exists()&&logfile.length()>20*1024){ LogUtil.sendMail("Score程序出现了问题,大概原因是因为日志文件太大了,需要去进行处理了;日志文件现在的大小为:"+logfile.length()); } } }
日志的处理到此差不多结束