多线程日志———每个线程拥有独立的日志

前言

程序有做到同时存在几个任务线程
如果只有一份日志,那么任务线程多了的话,日志信息就难以查找
因此我思考了了一下,如果每一个线程都存在自己的日志,那么就可以完美的解决这个问题
就像进程一样

首先需要自己创建一个Looger实例

我的需求主要是日志文件是新的就可以

import java.io.IOException;  
  
import org.apache.log4j.ConsoleAppender;  
import org.apache.log4j.Level;  
import org.apache.log4j.Logger;  
import org.apache.log4j.PatternLayout;  
  
import threadlogger.appender.ThreadSeperateDailyRollingFileAppender;  
  
  
public class ThreadLogger  
{  

    public static Logger getLogger(String logFile,Class clazz)  
    {       
       // 创建一个Logger实例, 就以线程名命名  

        Logger logger = Logger.getLogger(clazz);  
          
        PatternLayout layout = new PatternLayout("%-4r %-5p [%d{yyyy-MM-dd HH:mm:ss,SSS}] %l%t: %m%n");  
 
        // 文件输出  
        DailyRollingFileAppender appender= null;  
        try  
        {  
            appender = new DailyRollingFileAppender(layout, logfile,"'.'yyyy-MM-dd'.log'");  
        }  
        catch (IOException e)  
        {  
            e.printStackTrace();  
        }  
        logger.addAppender(appender);   
        return logger;  
    }  
  
}

使用(简化),我觉得每个线程任务code是唯一的,因此打印的日志相同任务code的都是同一份日志文件

public class ThreadLog implements Runnable{
     private String code;
     private Logger logger;
     ThreadLogString code){
         this.code  = code;
         logger  = ThreadLogger.getLogger(code,ThreadLog .class);
     }
     run(){};
     .........
}

结果
。。。。。。。
日志一片混乱,线程不安全,日志重复打印都出来了

上述结果最后定位

就是线程的问题,和重复打印没什么关系

  • 原先我在声明logger的时候还是有加上static 关键字
    后来又去掉了
  • 后来我甚至加上了ThreadLocal 线程本地变量来声明logger
    但是还是不行

最后慢慢的查找原因,发现Logger 他没有提供被被实例化的方法,只有通过工厂.getLogger()来获取实例,并且每一个名称相同的实例都是同一个

关键:每一个logger名称相同的实例都是同一个
所以想要线程独立日志,日志类logger的名称也得是惟一的

最后代码修改

public class ThreadLogger  
{  

    public static Logger getLogger(String logFile,Class clazz)  
    {       
       // 创建一个Logger实例, 就以线程名命名  

        Logger logger = Logger.getLogger(logFile + clazz);  
          
        PatternLayout layout = new PatternLayout("%-4r %-5p [%d{yyyy-MM-dd HH:mm:ss,SSS}] %l%t: %m%n");  
 
        // 文件输出  
        DailyRollingFileAppender appender= null;  
        try  
        {  
            appender = new DailyRollingFileAppender(layout, logfile,"'.'yyyy-MM-dd'.log'");  
        }  
        catch (IOException e)  
        {  
            e.printStackTrace();  
        }  
        logger.addAppender(appender);   
        return logger;  
    }  
  
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值