用log4j输出日志文件。
多线程运行时,每个线程的日志都写到一个文件中了,很混乱。
有办法在运行时指定输出的文件名吗

解决方案 »

  1.   

    1、配置log4j的配置文件#log4j.properties配置log4j.rootLogger=ALL, A1
    log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.A1.File=C:/log4j/TEST.log
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.DatePattern='.'yyyy-MM-dd-HH-mm
    log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
    2、java中重新设置输出文件import org.apache.log4j.DailyRollingFileAppender;
    import org.apache.log4j.Logger;public class SetLogFileName {
     public SetLogFileName(String filename){
    DailyRollingFileAppender appender = (DailyRollingFileAppender)Logger.getRootLogger().getAppender("A1");
    appender.setFile( "c:/log4j/"+filename+".log");//动态地修改这个文件名 
    appender.activateOptions();
     }
    }3、调用log4j输出文件import org.apache.log4j.Logger;public class OutPutLog {
    static Logger logger = Logger.getLogger(OutPutLog.class);
    /**
    * @param args
    */
    public static void main(String[] args) {
    SetLogFileName D = new SetLogFileName("trust");
    // TODO Auto-generated method stub
    logger.info("PIG");}
    }
      

  2.   


    这个方法好像可以。
    不过,有没有清晰明了的方法,直接设置logger?
    我用log4j主要就是在配置文件中控制输出等级,
    输出文件的位置想在程序里决定。
      

  3.   

    给你个例子把,希望能帮到你
    /*
     * 文 件 名:  Logger.java
     * 版    权:  
     * 描    述:  <描述>
     * 修 改 人:  
     * 修改时间:  2012-12-25
     * 修改内容:  <修改内容>
     */
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.logging.FileHandler;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.logging.SimpleFormatter;import cn.com.newdt.travelitinerary.vo.LogType;
    /**
     * <日志控制类>
     * <完成日志输出>
     * 
     * @author  
     * @see  [相关类/方法]
     * @since  [产品/模块版本]
     * 日志输出到服务器D盘''文件夹下,
     * 并且根据系统日期每天都会生成对应的终端日志文件
     *
     */
    public class  LoggerUtil{
    /** 存放的文件夹 **/
        private static String file_name = "日志";
        
        /**
         * 得到要记录的日志的路径及文件名称
         * @return
         */
        private static String getLogName(String terminalNo,String type) {
            StringBuffer logPath = new StringBuffer();
            logPath.append("D:\\"+file_name);
            File file = new File(logPath.toString());
            if (!file.exists())
                file.mkdir();
            logPath.append("\\"+terminalNo);
            file = new File(logPath.toString());
            if (!file.exists())
                file.mkdir();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            logPath.append("\\"+sdf.format(new Date())+"");
            file = new File(logPath.toString());
            if (!file.exists())
                file.mkdir();
            logPath.append("\\"+type+".log");
            return logPath.toString();
        }
        
        /**
         * 配置Logger对象输出日志文件路径
         * @param logger 
         * @throws SecurityException
         * @throws IOException
         */
        public static void setLogingProperties(Logger logger,String terminalNo,String type,String info) throws SecurityException, IOException {
            setLogingProperties(logger,Level.ALL,terminalNo,type,info);
        }
        
        /**
         * 配置Logger对象输出日志文件路径
         * @param logger
         * @param level 在日志文件中输出level级别以上的信息
         * @throws SecurityException
         * @throws IOException
         */
        public static void setLogingProperties(Logger logger,Level level,String terminalNo,String type,String info) {
            try {
             FileHandler fh = new FileHandler(getLogName(terminalNo,type),true);
                logger.addHandler(fh);//日志输出文件
                //logger.setLevel(level);
                fh.setFormatter(new SimpleFormatter());//输出格式
                //logger.addHandler(new ConsoleHandler());//输出到控制台
                logger.info(info);
                fh.close();
            } catch (SecurityException e) {
                logger.log(Level.SEVERE, "安全性错误", e);
            } catch (IOException e) {
                logger.log(Level.SEVERE,"读取文件日志错误", e);
            }
        }
        
        public static Logger getLogger(String name,String terminalNo,String info){
         Logger logger = Logger.getLogger(name);
         try {
    LoggerUtil.setLogingProperties(logger,terminalNo,name,info);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return logger;
        
        }
        
        public static void main(String [] args) {
         String terminalNo = "GZHCAN0004";//相当于一个线程
    LogType type =LogType.valueOf("EPP");
            Logger logger = LoggerUtil.getLogger(type.toString(),terminalNo,"..........");
            
        }
    }
    -------------------------------------------
    public enum LogType {
               
    APP, NET, RECEIPTPRINTER, READCARD, EPP, IDCARD, RECHARGECARD, SAFEDOOR, SERVICE, allLog; public String toString() {
    switch (this) {
    case APP:
    return "APP";
    case NET:
    return "NET";
    case RECEIPTPRINTER:
    return "RECEIPTPRINTER";
    case READCARD:
    return "READCARD";
    case EPP:
    return "EPP";
    case IDCARD:
    return "IDCARD";
    case RECHARGECARD:
    return "RECHARGECARD";
    case SAFEDOOR:
    return "SAFEDOOR";
    case SERVICE:
    return "SERVICE";
    case allLog:
    return "allLog";
    default:
    return "APP";
    }
    }
    }
      

  4.   

    上面的方法是用JDK自带的logger类实现的,log4j无法实现你说的功能