【问题标题】:How to generate separate log files for each and every file processed using java log4j?如何为使用 java log4j 处理的每个文件生成单独的日志文件?
【发布时间】:2016-01-29 03:50:28
【问题描述】:

我需要为每个处理的输入文件获取一个单独的日志文件。 我已经使用 java、log4j、javamail api 编写了一个应用程序来验证 xml。它需要输入 ini 文件(以获取要验证的 xml 文件的路径)。一旦处理了文件,它应该在去之前生成日志文件具有文件名的下一个文件。 最后,如果有任何错误,我必须为每个 ini 文件触发错误邮件。 现状: 从ini文件名中获取xml路径,经过验证,但如果我处理多个文件,它会生成一个日志。我需要为每个日志文件单独的日志文件。我将附上我的整个源代码。 请帮助我如何使用 java log4j 实现这一目标

我的一段java代码:

static void sendmail() throws IOException,    
MessagingException,AddressException
   {
          String to1=CarParser1.to1;
          DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy 
HH:mm:ss");
          Calendar cal = Calendar.getInstance();
            String to2 = CarParser1.to2;
            String to3= CarParser1.to3;
            String to4=CarParser1.to4;
            String from = CarParser1.from;
            String host = CarParser1.host;
            Properties properties = System.getProperties();
            properties.setProperty("mail.smtp.host", host);
            Session session = Session.getDefaultInstance(properties);
            MimeMessage message = new MimeMessage(session); 
            int m_toterr,m_totwarn;
            String getfilepath="";
            String pathLogFile = "D:/logfile.log";
            Enumeration enumeration = 
CarParser1.logger.getRootLogger().getAllAppenders();
            try {
                m_toterr=validatexml.Total_err;
                message.setFrom(new InternetAddress(from));   
                message.addRecipient(Message.RecipientType.TO, new 
InternetAddress(to1));

                message.setSubject("RE : CAR Validation Report at : 
"+dateFormat.format(cal.getTime())); 

                 while ( enumeration.hasMoreElements() )
                 {
                       Appender appender = (Appender) 
enumeration.nextElement();
                       if ( appender instanceof FileAppender )
                       {
                          pathLogFile  = 
((FileAppender)appender).getFile(); //here you get the path
                          break;
                       }
                    }
                    StringBuffer sb = new StringBuffer();
                    FileInputStream fstream = new 
 FileInputStream(pathLogFile);
                    BufferedReader br = new BufferedReader(new 
 InputStreamReader(fstream));

                    String singleLine;
                    while ((singleLine = br.readLine()) != null) 
                    {    if(singleLine.startsWith("Error")||
 singleLine.startsWith("pls")||
 singleLine.startsWith("Total")){


                      sb.append(singleLine + "<br><br>");
                    }
                    }
                    br.close();
                    String allLines = sb.toString();
                  message.setContent(allLines, "text/html; charset=ISO-
8859-1");
                 Transport.send(message);



                System.out.println("Email Sent successfully....");
                CarParser1.logger.info("Email Sent Successfully...");
                System.out.println();

            } 
            catch (MessagingException mex) 
            {
                System.out.println("Invalid Email Address.please provide 
a valid email id to send with");
                mex.printStackTrace();


            }



   }
}

我的 Log4j.properties:

#Log to Console as STDOUT
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd 
HH:mm:ss}      %-5p %c %3x - %m%n
#Log to file FILE
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=D:\logfile.log
log4j.appender.file.DatePattern='.'dd/MM/yyyy HH:mm:ss
log4j.appender.file.append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern= %d{yyyy-MM-dd HH:mm:ss}   
%-5p %c %3x - %m%n
# LOG4J daily rolling log files configuration
log4j.rootLogger=DEBUG, RollingAppender
log4j.appender.RollingAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingAppender.File=D:\logfile.log
log4j.appender.RollingAppender.DatePattern='.'yyyy-MM-dd 
log4j.appender.RollingAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingAppender.layout.ConversionPattern= %m%n

请点击下面的链接下载我的整个项目文档。 https://www.dropbox.com/s/m0sfw35t1obxl7s/project_docs.zip?dl=0

提前致谢 期待帮助,因为我今天提交的时间已经截止。

单独日志文件的代码:

File dir=new File("D:/newlog");
            if(!dir.exists()){
            dir.mkdir();}


            String fileName=CarParser1.si_orderid;
            File logfile=new File(dir,fileName+"_log.txt");
            if(!logfile.exists()){
            logfile.createNewFile();
            }

FileUtils.writeStringToFile(logfile,CarParser1.sb.toString());
//appending
 sb.append("\nCAR VAlidating at Path:"+final_filepath+" for the Order ID 
:"+si_orderid);
sb.append("\nUnit ID : "+si_unitid+" for the Order ID: "+si_orderid);

但我得到的 O/P 为

支持 Java 1.7 或更低版本 CAR Validating at Path:\fms\fms_workarea\BDOPS\OPSBANK-II\SIGNALS\EFLOW\CAR\ABPEL\January-2016\Batch_16.01.16\6668662\ItemFile 订单 ID:6668662Unit ID:2518073 订单 ID:6668662Order ID EqualUNIT IDEqualSupplier ID Equal

即使我在代码上写了,也没有下一行。 请指导我将结果写为已读,逐行输出为已读。

提前致谢

【问题讨论】:

    标签: java logging log4j jakarta-mail


    【解决方案1】:

    Log4J 的工作原理: 日志文件将仅写入 log4j.properties/.xml 中提到的文件配置。例子 : log4j.appender.RollingAppender.File=D:\logfile.log

    我们可以将信息、调试、错误等不同级别的日志记录配置到不同的日志文件中。

    如果您需要为不同的输入文件写入不同的日志文件,请执行以下操作。 1)创建一个 StringBuffer 对象并附加您要记录它的所有信息 2) 然后创建一个具有所需名称的新文件对象并将其从 Stringbuffer 对象中转储。

    【讨论】:

    • 谢谢先生的回复。你能用示例代码指导我吗。因为我对这个日志记录很陌生。
    • 请您指导我提供相同的示例代码。谢谢
    • 亲爱的harisudan,请查看我的更新,请帮助我从那个问题中恢复过来
    • 请使用示例代码并根据您的需要进行自定义。尝试 { StringBuffer logContent = new StringBuffer(); logContent.append("文件打开"); logContent.append("消息发送");文件 file = new File("filepath/custome_message_log_filename.txt"); // 如果文件不存在,则创建它 if (!file.exists()) { file.createNewFile(); } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(logContent.toString()); bw.close(); } catch (IOException e) { e.printStackTrace(); }
    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多