在线等:Logger在控制台重复输出问题,而且还是有规律的重复输出

binxigogo 2008-09-04 04:47:47

package com.wang.test;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

/**
* 日志输出到登陆系统用户所在的根目录的邮政储蓄日志的文件夹下,
* 并且根据系统日期命名日志文件
* @author wang
*
*/
public class LoggerUtil {

/** 日志文件存储容量 **/
//private static int file_size = 5*1024*1024;

/** 存放的文件夹 **/
private static String file_name = "邮政储蓄日志";

//private static ;

/**
* 记录一条不带参数的消息。
* @param level 某个消息级别标识符,例如 SEVERE。
* @param msg 字符串消息(或消息类别中的键)。
* @param className 记录日志的类
*/
public static void log(Level level,String msg,Object className) {

Logger logger = Logger.getLogger(className.getClass().getName());
try {
setLogingProperties(logger);
logger.log(level, msg);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

/**
* 记录带有一个对象参数的消息。
* @param level 某个消息级别标识符,例如 SEVERE。
* @param msg 字符串消息(或消息类别中的键)。
* @param className 记录日志的类
* @param obj 消息的参数。
*/
public static void log(Level level,String msg,Object className,Object obj) {
try {
Logger logger = Logger.getLogger(className.getClass().getName());
setLogingProperties(logger);

logger.log(level, msg, obj);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

/**
* 设置Logger配置
* @param logger
* @throws SecurityException
* @throws IOException
*/
private static void setLogingProperties(Logger logger) throws SecurityException, IOException {
FileHandler fh = new FileHandler(getLogName(),true);

Handler ch = new ConsoleHandler();

logger.addHandler(fh);

logger.setLevel(Level.ALL);
SimpleFormatter sf = new SimpleFormatter();
fh.setFormatter(sf);
logger.addHandler(ch);
ch.close();
}

/**
* 得到要记录的日志的路径及文件名称
* @return
*/
private static String getLogName() {
StringBuffer logPath = new StringBuffer();
logPath.append(System.getProperty("user.home"));
logPath.append("\\"+file_name);
File file = new File(logPath.toString());
if (!file.exists())
file.mkdir();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
logPath.append("\\"+sdf.format(new Date())+".log");

return logPath.toString();
}

public static void main(String [] args) throws InterruptedException {
LoggerUtil.log(Level.INFO, "llllllllllllll", new Object() );
LoggerUtil.log(Level.INFO, "ddd", new Object());
LoggerUtil.log(Level.INFO, "fffffff",new Object());
LoggerUtil.log(Level.INFO, "c", new Object());
}
}


这是我写的一个类,测试中在控制台输出:
2008-9-4 16:43:42 com.wang.test.LoggerUtil log
信息: llllllllllllll
2008-9-4 16:43:43 com.wang.test.LoggerUtil log
信息: ddd
2008-9-4 16:43:43 com.wang.test.LoggerUtil log
信息: ddd
2008-9-4 16:43:44 com.wang.test.LoggerUtil log
信息: fffffff
2008-9-4 16:43:44 com.wang.test.LoggerUtil log

信息: fffffff
2008-9-4 16:43:44 com.wang.test.LoggerUtil log
信息: fffffff
2008-9-4 16:43:46 com.wang.test.LoggerUtil log
信息: c
2008-9-4 16:43:46 com.wang.test.LoggerUtil log
信息: c
2008-9-4 16:43:46 com.wang.test.LoggerUtil log
信息: c
2008-9-4 16:43:46 com.wang.test.LoggerUtil log
信息: c


不知道为什么输出的多出了1个“ddd” 2个“fffffff”,3个“c”,
为什么有这么多重复输出忘高手指点一二。弄不明白哦!
解决立马给分!在线等
...全文
379 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
binxigogo 2008-09-05
  • 打赏
  • 举报
回复
我把JRE/Lib下的logging.properties文件已经删除了,在删除配置的情况下输出是很多重复值,不知道如何解决哦,望高手指教
mayuanfei 2008-09-04
  • 打赏
  • 举报
回复
呀.那真奇怪了.除非你改动JRE/Lib下的logging.properties文件.因为Java的Util最终引用的也是Log4j.这里是配置输出控制台的

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

binxigogo 2008-09-04
  • 打赏
  • 举报
回复
我要不加Handler ch = new ConsoleHandler();
在控制台就没有输出,只有日志文件中有
mayuanfei 2008-09-04
  • 打赏
  • 举报
回复

/**
* 设置Logger配置
* @param logger
* @throws SecurityException
* @throws IOException
*/
private static void setLogingProperties(Logger logger) throws SecurityException, IOException {
FileHandler fh = new FileHandler(getLogName(),true);
/*默认的logger就是打印到控制台上.你没加一次就会多打印一行.所以这里注销掉加入控制台的代码.*/
//Handler ch = new ConsoleHandler();

/*这里也是只需要加入一次写入文件的Handler*/
if(logger.getHandlers().length==0)
logger.addHandler(fh);

logger.setLevel(Level.ALL);
SimpleFormatter sf = new SimpleFormatter();
fh.setFormatter(sf);
// logger.addHandler(ch);
//ch.close();
}
qingting2016 2008-09-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bentu610 的回复:]
同问
[/Quote]
bentu610 2008-09-04
  • 打赏
  • 举报
回复
同问

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧