2008-10-10 13 views
59

में वर्तमान दिनांक शामिल करने के लिए लॉग फ़ाइल नाम सेट करना मैं वर्तमान दिनांक रखने के लिए log4j और log4net एपेंडर के लिए लॉग फ़ाइल नाम सेट करना चाहता हूं। हम दैनिक रोलओवर कर रहे हैं लेकिन वर्तमान लॉग फ़ाइल में कोई तारीख नहीं है। लॉग फ़ाइल नाम प्रारूपलॉग 4j

logname.2008-10-10.log 

कोई भी ऐसा करने के लिए मेरे लिए सबसे अच्छा तरीका जानता है?

संपादित करें: मैं यह उल्लेख करना भूल गया कि हम इसे log4net में भी करना चाहते हैं। इसके अलावा किसी भी समाधान को जेबॉस में प्रयोग करने योग्य होने की आवश्यकता होगी।

उत्तर

45

DailyRollingFileAppender वह है जो आप वास्तव में खोज रहे हैं।

<appender name="roll" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="File" value="application.log" /> 
    <param name="DatePattern" value=".yyyy-MM-dd" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" 
      value="%d{yyyy-MMM-dd HH:mm:ss,SSS} [%t] %c %x%n %-5p %m%n"/> 
    </layout> 
    </appender> 
+24

यह बस एक लॉग "application.log" कहा जाता है फ़ाइल बनाने नहीं होगा FileAppender सेट कर सकते हैं और केवल लुढ़का लॉग फ़ाइलों में datepattern जगह? – Tim

+3

परिणामस्वरूप आपको प्रत्येक दिन एक अलग लॉग फ़ाइल मिल जाएगी। लेकिन आज के लॉग फ़ाइल को बिना किसी तारीख के application.log के रूप में नामित किया जाएगा। और ज्यादातर मामलों में यह ठीक है। – gedevan

+1

"डेटपेटर्न" पर दो टिप्पणियां: - मैं ".yyyy-MM-dd का उपयोग करता हूं।लो \ g "सभी लॉग फ़ाइलों के लिए एक ही एक्सटेंशन प्राप्त करने के लिए। - जी से पहले बैकस्लैश की आवश्यकता है (कम से कम लॉग 4नेट के लिए) .NET को पूर्वनिर्धारित" जी "प्रारूप को लागू करने के लिए। – gyrolf

12

मैं 99% यकीन है कि RollingFileAppender/DailyRollingFileAppender, जबकि यह आप तारीख-रोलिंग कार्यक्षमता आप चाहते हैं देता है, निर्दिष्ट करने के लिए है कि मौजूदा लॉग फ़ाइल DatePattern रूप में अच्छी तरह का उपयोग करना चाहिए किसी भी तरह से नहीं है हूँ।

आप रोलिंगफाइलएपेंडर (या DailyRollingFileAppender, मैं भूल जाता हूं जो लॉग 4नेट में है) को उपclass करने और नामकरण तर्क को संशोधित करने में सक्षम हो सकता है।

10

मैंने एक एपेंडर बनाया है जो ऐसा करेगा। http://stauffer.james.googlepages.com/DateFormatFileAppender.java

/* 
* Copyright (C) The Apache Software Foundation. All rights reserved. 
* 
* This software is published under the terms of the Apache Software 
* License version 1.1, a copy of which has been included with this 
* distribution in the LICENSE.txt file. */ 

package sps.log.log4j; 

import java.io.IOException; 
import java.io.File; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import org.apache.log4j.*; 
import org.apache.log4j.helpers.LogLog; 
import org.apache.log4j.spi.LoggingEvent; 

/** 
* DateFormatFileAppender is a log4j Appender and extends 
* {@link FileAppender} so each log is 
* named based on a date format defined in the File property. 
* 
* Sample File: 'logs/'yyyy/MM-MMM/dd-EEE/HH-mm-ss-S'.log' 
* Makes a file like: logs/2004/04-Apr/13-Tue/09-45-15-937.log 
* @author James Stauffer 
*/ 
public class DateFormatFileAppender extends FileAppender { 

    /** 
    * The default constructor does nothing. 
    */ 
    public DateFormatFileAppender() { 
    } 

    /** 
    * Instantiate a <code>DailyRollingFileAppender</code> and open the 
    * file designated by <code>filename</code>. The opened filename will 
    * become the ouput destination for this appender. 
    */ 
    public DateFormatFileAppender (Layout layout, String filename) throws IOException { 
    super(layout, filename, true); 
    } 

    private String fileBackup;//Saves the file pattern 
    private boolean separate = false; 

    public void setFile(String file) { 
    super.setFile(file); 
    this.fileBackup = getFile(); 
    } 

    /** 
    * If true each LoggingEvent causes that file to close and open. 
    * This is useful when the file is a pattern that would often 
    * produce a different filename. 
    */ 
    public void setSeparate(boolean separate) { 
    this.separate = separate; 
    } 

    protected void subAppend(LoggingEvent event) { 
    if(separate) { 
     try {//First reset the file so each new log gets a new file. 
      setFile(getFile(), getAppend(), getBufferedIO(), getBufferSize()); 
     } catch(IOException e) { 
      LogLog.error("Unable to reset fileName."); 
     } 
    } 
    super.subAppend(event); 
    } 


    public 
    synchronized 
    void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize) 
                  throws IOException { 
    SimpleDateFormat sdf = new SimpleDateFormat(fileBackup); 
    String actualFileName = sdf.format(new Date()); 
    makeDirs(actualFileName); 
    super.setFile(actualFileName, append, bufferedIO, bufferSize); 
    } 

    /** 
    * Ensures that all of the directories for the given path exist. 
    * Anything after the last/or \ is assumed to be a filename. 
    */ 
    private void makeDirs (String path) { 
    int indexSlash = path.lastIndexOf("/"); 
    int indexBackSlash = path.lastIndexOf("\\"); 
    int index = Math.max(indexSlash, indexBackSlash); 
    if(index > 0) { 
     String dirs = path.substring(0, index); 
//  LogLog.debug("Making " + dirs); 
     File dir = new File(dirs); 
     if(!dir.exists()) { 
      boolean success = dir.mkdirs(); 
      if(!success) { 
       LogLog.error("Unable to create directories for " + dirs); 
      } 
     } 
    } 
    } 

} 
+0

जेम्स, क्या आप अपने उत्तर के अंदर कोड पोस्ट कर सकते हैं? Google पेज मेरे काम से अवरुद्ध है। –

11

अगर यह जावा में संभव है मैं नहीं जानता, लेकिन नेट में RollingFileAppender पर संपत्ति StaticLogFileName आप देता है कि आप क्या चाहते। डिफ़ॉल्ट सच है।

<staticLogFileName value="false"/> 

पूर्ण config:

<appender name="DefaultFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="application"/> 
    <staticLogFileName value="false"/> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
</appender> 

&quot;.log&quot; वैश्विक तारीख पैटर्न 'जी' लॉग में recognice DateFormat दे नहीं करने के लिए है।

+1

यह वही है जो मैं देख रहा था। – Raj

+0

बस स्पष्टीकरण के लिए: क्या एचटीएमएल इकाइयां 'yyyy-MM-dd " में '& quot' हैं। "'' '' '' '' '' '' ''~~ – chrki

35

log4j.properties फ़ाइल का उपयोग करना, और log4j 1.2.16

log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender 
log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy 
log4j.appender.LOGFILE.RollingPolicy.FileNamePattern=/logs/application_%d{yyyy-MM-dd}.log 
+3

^---^प्रो लेवल: 99 'log4j.appender.out.RollingPolicy.FileNamePattern = logs /% d {yyyy-MM-dd एचएच-एमएम-एसएस} क्रॉन-स्क्रिप्ट-एक्स/आउट.लॉग log4j .appender.err.RollingPolicy.FileNamePattern = लॉग /% d {yyyy-MM-dd HH-mm-ss} cron-script-x/err.log' – Alex

+0

अभी के अनुसार, डाउनलोड मिरर लिंक सभी टूटा हुआ है। आप अभी भी संग्रह संग्रह में लाइब्रेरी पा सकते हैं: http://archive.apache.org/dist/logging/log4j/companions/extras – mmutilva

+0

log4j.appender..DatePattern = yyyy-MM-dd चाल करेगा। फ़ाइल का नाम हर दिन रोल करेगा और अतिरिक्त निर्भरता की आवश्यकता नहीं है – vsingh

1

इस उदाहरण प्रत्येक मिनट के लिए लकड़हारा बनाने वाले हैं, आप बदलना DatePattern प्रत्येक दिन के लिए बदलना चाहते हैं के साथ अपने पोम apache-log4j-extras 1.1 सहित मूल्य।

<appender name="ASYNC" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="File" value="./applogs/logger.log" /> 
    <param name="Append" value="true" /> 
    <param name="Threshold" value="debug" /> 
    <appendToFile value="true" /> 
    <param name="DatePattern" value="'.'yyyy_MM_dd_HH_mm"/> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="fileNamePattern" value="./applogs/logger_%d{ddMMMyyyy HH:mm:ss}.log"/> 
     <param name="rollOver" value="TRUE"/> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{ddMMMyyyy HH:mm:ss,SSS}^[%X{l4j_mdc_key}]^[%c{1}]^ %-5p %m%n" /> 
    </layout> 
</appender> 
<root> 
    <level value="info" /> 
    <appender-ref ref="ASYNC" /> 
</root> 
2

दो जवाब जो DailyRollingFileAppender उल्लेख (क्षमा करें, मैं सीधे उन पर टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है, और मैं इस का उल्लेख करने की आवश्यकता है लगता है) के लिए एक प्रतिक्रिया के रूप में, मुझे लगता है कि दुर्भाग्य से चेतावनी दी हैं डेवलपर्स उस वर्ग के दस्तावेज ने दस्तावेज किया है कि यह सिंक्रनाइज़ेशन और डेटा हानि प्रदर्शित करता है, और सिफारिश करता है कि नए तैनाती के लिए विकल्पों का पालन किया जाना चाहिए।

DailyRollingFileAppender JavaDoc

1

आप गतिशील

SimpleLayout layout = new SimpleLayout();   
FileAppender appender = new FileAppender(layout,"logname."+new Date().toLocaleString(),false); 
logger.addAppender(appender); 
+0

फ़ाइल नाम में स्लैश "/" से सावधान रहें। मैं बल्कि उपयोगकर्ता: '" लॉगनाम "+ नई तिथि() प्रारूप (" yyyy-mm-dd-hh-MM ") +" लॉग "' –

+0

यह केवल ऐप स्टार्ट पर नई लॉग फ़ाइल बनाएगा और कट नहीं करेगा तारीख तक फाइलों के लिए आपके लॉग –

संबंधित मुद्दे