为java.util.logging自定义文件处理器及日志输出格式

为java.util.logging自定义文件处理器及日志输出格式
文章分类:Java编程

       最近闲来无事,刚好拾起了来公司的第一个项目,发现里面的logging功能有点弱,竟然不支持按日期文件名输出,更惨的是由于引入了些apache的公用了包,一个项目里竟然同时出现logging,log4j,commons-logging,这年头引用下开源包还要用不同的loger.记得log4j好像支持输出的文件按日期来分类的,jdk自带的logging好像还没有,于是google了一把,发现JAVA中自定义日志输出格式及自定义文件处理器的实现 ,功能还不错,有些bug及不合理的地方,于是再修改下,凑合用用.

      直接代码:

FileStreamHandler实现

Java代码 复制代码 收藏代码

  1. package com.xunlei.demo.util;  
  2. import java.io.BufferedOutputStream;  
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.OutputStream;  
  7. import java.text.SimpleDateFormat;  
  8. import java.util.Date;  
  9. import java.util.HashMap;  
  10. import java.util.Map;  
  11. import java.util.TreeSet;  
  12. import java.util.logging.Filter;  
  13. import java.util.logging.Formatter;  
  14. import java.util.logging.Handler;  
  15. import java.util.logging.Level;  
  16. import java.util.logging.LogManager;  
  17. import java.util.logging.LogRecord;  
  18. import java.util.logging.Logger;  
  19. import java.util.logging.StreamHandler;  
  20. /**
  21. * 自定义日志文件处理器---日期及文件大小存储,并自动清除过期日志文件
  22. * @author ZengDong
  23. * @since 2008-9-11下午11:16:39
  24. */
  25. public class XLFileStreamHandler extends StreamHandler {  
  26. /**
  27.      * 抄自FileHandler的实现,用于跟踪写入文件的字节数 这样以便提高效率
  28.      */
  29. private class MeteredStream extends OutputStream {  
  30. private OutputStream out;  
  31. // 记录当前写入字节数
  32. private int written;  
  33.         MeteredStream(OutputStream out, int written) {  
  34. this.out = out;  
  35. this.written = written;  
  36.         }  
  37. public void close() throws IOException {  
  38.             out.close();  
  39.         }  
  40. public void flush() throws IOException {  
  41.             out.flush();  
  42.         }  
  43. public void write(byte buff[]) throws IOException {  
  44.             out.write(buff);  
  45.             written += buff.length;  
  46.         }  
  47. public void write(byte buff[], int off, int len) throws IOException {  
  48.             out.write(buff, off, len);  
  49.             written += len;  
  50.         }  
  51. public void write(int b) throws IOException {  
  52.             out.write(b);  
  53.             written++;  
  54.         }  
  55.     }  
  56. private class XLLogFile extends File {  
  57. private static final long serialVersionUID = 952141123094287978L;  
  58. private Date date;  
  59. private String dateString;  
  60. private int sid;  
  61. public int getSid() {  
  62. return this.sid;  
  63.         }  
  64. public void setSid(int sid) {  
  65. this.sid = sid;  
  66.         }  
  67. public Date getDate() {  
  68. return this.date;  
  69.         }  
  70. public void setDate(Date date) {  
  71. this.date = date;  
  72.         }  
  73. public String getDateString() {  
  74. return this.dateString;  
  75.         }  
  76. public void setDateString(String dateString) {  
  77. this.dateString = dateString;  
  78.         }  
  79. public int compareTo(File another) {  
  80.             XLLogFile ano = (XLLogFile) another;  
  81. int dateComResult = date.compareTo(ano.getDate());  
  82. if (dateComResult == 0) {  
  83. return sid - ano.getSid();  
  84.             }  
  85. return dateComResult;  
  86.         }  
  87.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  88. public XLLogFile(String pathname) {  
  89. super(pathname);  
  90. try {  
  91. int dot = pathname.lastIndexOf('.');  
  92. int split = pathname.lastIndexOf(splitDateIndexChar);  
  93. int underline = pathname.lastIndexOf('_');  
  94.                 dateString = pathname.substring(underline + 1, split);  
  95.                 String numStr = pathname.substring(split + 1, dot);  
  96.                 date = sdf.parse(dateString);  
  97.                 sid = Integer.valueOf(numStr);  
  98.             } catch (Exception e) {  
  99.                 System.err.println("log对应文件夹中包含了不符合XLLOG格式的文件!!");  
  100.                 e.printStackTrace();  
  101.             }  
  102.         }  
  103.     }  
  104. private static final String undifine = "xlcallcenter";  
  105. // 是否将日志写入已存在的日志文件中
  106. private boolean append;  
  107. // 保存几天之内的日志文件
  108. // 时间间隔小于等于0时表明不删除历史记录
  109. private int dateinterval = 5;  
  110. // 保存存在的日志文件
  111. private Map > files;  
  112. // 每个日志希望写入的最大字节数,如果日志达到最大字节数则当天日期的一个新的编号的日志文件将被创建,最新的日志记录在最大编号的文件中
  113. // 文件大小为小于等于0时表明不限制日志文件大小
  114. private int limit = 1048576 * 5;  
  115. // 输出流
  116. private MeteredStream msOut;  
  117. // 文件路径, 可以是个目录或希望的日志名称,如果是个目录则日志为"callcenter_zd"
  118. // 指定日志名称时不需要包括日期,程序会自动生成日志文件的生成日期及相应的编号
  119. private String pattern = "./log/xunleidemo";  
  120. private char splitDateIndexChar = '#';  
  121. public XLFileStreamHandler() throws Exception {  
  122.         configure();  
  123.         openWriteFiles();  
  124.     }  
  125. /**
  126.      * 初始化自定义文件流处理器
  127.      * 
  128.      * @param fileUrl
  129.      *            文件路径, 可以是个目录或希望的日志名称,如果是个目录则日志为"callcenter_zd"
  130.      *            指定日志名称时不需要包括日期,程序会自动生成日志文件的生成日期及相应的编号
  131.      * @param limit
  132.      *            每个日志希望写入的最大字节数,如果日志达到最大字节数则当天日期的一个新的编
  133.      *            号的日志文件将被创建,最新的日志记录在最大编号的文件中
  134.      * @param dateinterval
  135.      *            保存几天之内的日志文件
  136.      * @param append
  137.      *            是否将日志写入已存在的日志文件中
  138.      * @throws java.lang.Exception
  139.      */
  140. public XLFileStreamHandler(String fileUrl, int limit, int dateinterval,  
  141. boolean append) throws Exception {  
  142. super();  
  143. this.pattern = fileUrl;  
  144. this.limit = limit;  
  145. this.dateinterval = dateinterval;  
  146. this.append = append;         
  147.         openWriteFiles();  
  148.     }  
  149. /**
  150.      * 检查当前日志时间,删除过期日志
  151.      */
  152. private void deleteExpiredLog() {  
  153. try {  
  154. // 今天作为基准
  155.             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
  156.             String today = sdf.format(new Date().getTime());  
  157. // 删除过期日志
  158. for (String keyDate : files.keySet()) {  
  159. if ((sdf.parse(today).getTime() - sdf.parse(keyDate).getTime())  
  160.                         / (86400 * 1000) > dateinterval) {  
  161.                     TreeSet traceDateFiles = files.get(keyDate);  
  162. for (File deletingFile : traceDateFiles) {  
  163. // if(deletingFile.exists()) {
  164.                         deletingFile.delete();  
  165. // }
  166.                     }  
  167.            
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值