如题:现在要做一个日志工具类.主要是保存系统生成的日志.
现在遇到多线程访问时不同步的问题.KLinkLog.initKingLog("c://kinghi1.log", KLinkLog2.DEBUG, "c://log", 100);
KLinkLog.writeLog(KLinkLog2.NORMAL, "kinghi-test1-"+this.hashCode());
initKingLog和writeLog都是synchronized的.假如出现当一个线程写C://kinghi1.log.而另一个线程写C://kinghi2.log时.
出现的线程又写到了kinghi1.log.也写到了kinghi2.log代码如下:public class KLinkLog {
public final static int DEBUG = 3;
//日志名
private static String logName = "./Kinghi.log";
//日志级别
private static int level = 2;
//备份路径
private static String bakPath = null;
//日志文件最大大小
private static int maxSize = 100;
//日期格式化
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.SSS"); private KLinkLog() { } public static synchronized void initKingLog(String logName,int level,String bakPath,int maxSize)
{
//参数检测
if(level == KLinkLog.NONE || level < KLinkLog.NONE || level > KLinkLog.DEBUG
|| logName == null ||logName.equals("")
|| maxSize <=0)
{
return;
}
else
{
KLinkLog.logName = logName;
KLinkLog.level = level;
KLinkLog.bakPath = bakPath;
KLinkLog.maxSize = maxSize;
} }
/**
* 向日志中写日志
* @param level 日志级别
* @param message //写入消息
* @return 返回1为没有写入.返回0为写入成功
*/
public static int writeLog(int level, String message)
{
//.............I/O操作
}
}解决100分送上.
现在遇到多线程访问时不同步的问题.KLinkLog.initKingLog("c://kinghi1.log", KLinkLog2.DEBUG, "c://log", 100);
KLinkLog.writeLog(KLinkLog2.NORMAL, "kinghi-test1-"+this.hashCode());
initKingLog和writeLog都是synchronized的.假如出现当一个线程写C://kinghi1.log.而另一个线程写C://kinghi2.log时.
出现的线程又写到了kinghi1.log.也写到了kinghi2.log代码如下:public class KLinkLog {
public final static int DEBUG = 3;
//日志名
private static String logName = "./Kinghi.log";
//日志级别
private static int level = 2;
//备份路径
private static String bakPath = null;
//日志文件最大大小
private static int maxSize = 100;
//日期格式化
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.SSS"); private KLinkLog() { } public static synchronized void initKingLog(String logName,int level,String bakPath,int maxSize)
{
//参数检测
if(level == KLinkLog.NONE || level < KLinkLog.NONE || level > KLinkLog.DEBUG
|| logName == null ||logName.equals("")
|| maxSize <=0)
{
return;
}
else
{
KLinkLog.logName = logName;
KLinkLog.level = level;
KLinkLog.bakPath = bakPath;
KLinkLog.maxSize = maxSize;
} }
/**
* 向日志中写日志
* @param level 日志级别
* @param message //写入消息
* @return 返回1为没有写入.返回0为写入成功
*/
public static int writeLog(int level, String message)
{
//.............I/O操作
}
}解决100分送上.
楼主【luoyahu】截止到2008-07-16 09:08:26的历史汇总数据(不包括此帖):
发帖的总数量:5 发帖的总分数:150 每贴平均分数:30
回帖的总数量:5 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:1 结贴的总分数:10
无满意结贴数:0 无满意结贴分:0
未结的帖子数:4 未结的总分数:140
结贴的百分比:20.00 % 结分的百分比:6.67 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
楼主该结一些帖子了
private static String logName = "./Kinghi.log "; 类变量logName在writeLog方法第二次执行时已经被改为C://kinghi2.log,所以会发生这种情况(其它类变量也要注意,如果不变的话最好做成类常量)解决的办法:1.使用方法内的局部变量 2.把类变量包装在ThreadLocal内,这样不同的线程拥有不同的变量拷贝,互不干扰