如题:现在要做一个日志工具类.主要是保存系统生成的日志.
现在遇到多线程访问时不同步的问题.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分送上.

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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  %                  
    楼主该结一些帖子了
      

  2.   

    用 ThreadLocal 可以避免不同线程中的 static 成员冲突的问题。
      

  3.   

    //日志名 
    private   static   String   logName   =   "./Kinghi.log "; 类变量logName在writeLog方法第二次执行时已经被改为C://kinghi2.log,所以会发生这种情况(其它类变量也要注意,如果不变的话最好做成类常量)解决的办法:1.使用方法内的局部变量 2.把类变量包装在ThreadLocal内,这样不同的线程拥有不同的变量拷贝,互不干扰