zoukankan      html  css  js  c++  java
  • log4j1 修改FileAppender解决当天的文件没有日期后缀

    直接上代码:

    /*
     * Licensed to the Apache Software Foundation (ASF) under one or more
     * contributor license agreements.  See the NOTICE file distributed with
     * this work for additional information regarding copyright ownership.
     * The ASF licenses this file to You under the Apache License, Version 2.0
     * (the "License"); you may not use this file except in compliance with
     * the License.  You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package org.apache.log4j;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InterruptedIOException;
    import java.io.Writer;
    
    import org.apache.log4j.helpers.LogLog;
    import org.apache.log4j.helpers.QuietWriter;
    import org.apache.log4j.spi.ErrorCode;
    
    import reyo.sdk.utils.DateTimeUtils;
    import reyo.sdk.utils.StringUtils;
    
    // Contibutors: Jens Uwe Pipka <jens.pipka@gmx.de>
    //              Ben Sandee
    
    /**
     *  FileAppender appends log events to a file.
     *
     *  <p>Support for <code>java.io.Writer</code> and console appending
     *  has been deprecated and then removed. See the replacement
     *  solutions: {@link WriterAppender} and {@link ConsoleAppender}.
     *
     * @author Ceki Gülcü
     * */
    public class FileAppender extends WriterAppender {
    
    	/** Controls file truncatation. The default value for this variable
    	 * is <code>true</code>, meaning that by default a
    	 * <code>FileAppender</code> will append to an existing file and not
    	 * truncate it.
    	 *
    	 * <p>This option is meaningful only if the FileAppender opens the
    	 * file.
    	 */
    	protected boolean fileAppend = true;
    
    	/**
    	 The name of the log file. */
    	protected String fileName = null;
    
    	/**
    	 Do we do bufferedIO? */
    	protected boolean bufferedIO = false;
    
    	/**
    	 * Determines the size of IO buffer be. Default is 8K.
    	 */
    	protected int bufferSize = 8 * 1024;
    
    	/**
    	 The default constructor does not do anything.
    	*/
    	public FileAppender() {
    	}
    
    	/**
    	Instantiate a <code>FileAppender</code> and open the file
    	designated by <code>filename</code>. The opened filename will
    	become the output destination for this appender.
    	
    	<p>If the <code>append</code> parameter is true, the file will be
    	appended to. Otherwise, the file designated by
    	<code>filename</code> will be truncated before being opened.
    	
    	<p>If the <code>bufferedIO</code> parameter is <code>true</code>,
    	then buffered IO will be used to write to the output file.
    	
    	*/
    	public FileAppender(Layout layout, String filename, boolean append, boolean bufferedIO, int bufferSize)
    			throws IOException {
    		this.layout = layout;
    		this.setFile(filename, append, bufferedIO, bufferSize);
    	}
    
    	/**
    	Instantiate a FileAppender and open the file designated by
    	<code>filename</code>. The opened filename will become the output
    	destination for this appender.
    	
    	<p>If the <code>append</code> parameter is true, the file will be
    	appended to. Otherwise, the file designated by
    	<code>filename</code> will be truncated before being opened.
    	*/
    	public FileAppender(Layout layout, String filename, boolean append) throws IOException {
    		this.layout = layout;
    		this.setFile(filename, append, false, bufferSize);
    	}
    
    	/**
    	 Instantiate a FileAppender and open the file designated by
    	<code>filename</code>. The opened filename will become the output
    	destination for this appender.
    	
    	<p>The file will be appended to.  */
    	public FileAppender(Layout layout, String filename) throws IOException {
    		this(layout, filename, true);
    	}
    
    	/**
    	 The <b>File</b> property takes a string value which should be the
    	 name of the file to append to.
    	
    	 <p><font color="#DD0044"><b>Note that the special values
    	 "System.out" or "System.err" are no longer honored.</b></font>
    	
    	 <p>Note: Actual opening of the file is made when {@link
    	 #activateOptions} is called, not when the options are set.  */
    	public void setFile(String file) {
    		// Trim spaces from both ends. The users probably does not want
    		// trailing spaces in file names.
    		String val = file.trim();
    		fileName = val;
    	}
    
    	/**
    	  Returns the value of the <b>Append</b> option.
    	 */
    	public boolean getAppend() {
    		return fileAppend;
    	}
    
    	/** Returns the value of the <b>File</b> option. */
    	public String getFile() {
    		return fileName;
    	}
    
    	/**
    	 If the value of <b>File</b> is not <code>null</code>, then {@link
    	 #setFile} is called with the values of <b>File</b>  and
    	 <b>Append</b> properties.
    	
    	 @since 0.8.1 */
    	@Override
    	public void activateOptions() {
    
    		String filetype = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
    		if (StringUtils.isEmpty(filetype)) {
    			fileName = fileName + DateTimeUtils.getCurrentDate() + ".log";
    		}
    
    		if (fileName != null) {
    			try {
    				setFile(fileName, fileAppend, bufferedIO, bufferSize);
    			} catch (java.io.IOException e) {
    				errorHandler.error("setFile(" + fileName + "," + fileAppend + ") call failed.", e,
    						ErrorCode.FILE_OPEN_FAILURE);
    			}
    		} else {
    			//LogLog.error("File option not set for appender ["+name+"].");
    			LogLog.warn("File option not set for appender [" + name + "].");
    			LogLog.warn("Are you using FileAppender instead of ConsoleAppender?");
    		}
    	}
    
    	/**
    	 Closes the previously opened file.
    	 */
    	protected void closeFile() {
    		if (this.qw != null) {
    			try {
    				this.qw.close();
    			} catch (java.io.IOException e) {
    				if (e instanceof InterruptedIOException) {
    					Thread.currentThread().interrupt();
    				}
    				// Exceptionally, it does not make sense to delegate to an
    				// ErrorHandler. Since a closed appender is basically dead.
    				LogLog.error("Could not close " + qw, e);
    			}
    		}
    	}
    
    	/**
    	 Get the value of the <b>BufferedIO</b> option.
    	
    	 <p>BufferedIO will significatnly increase performance on heavily
    	 loaded systems.
    	
    	*/
    	public boolean getBufferedIO() {
    		return this.bufferedIO;
    	}
    
    	/**
    	 Get the size of the IO buffer.
    	*/
    	public int getBufferSize() {
    		return this.bufferSize;
    	}
    
    	/**
    	 The <b>Append</b> option takes a boolean value. It is set to
    	 <code>true</code> by default. If true, then <code>File</code>
    	 will be opened in append mode by {@link #setFile setFile} (see
    	 above). Otherwise, {@link #setFile setFile} will open
    	 <code>File</code> in truncate mode.
    	
    	 <p>Note: Actual opening of the file is made when {@link
    	 #activateOptions} is called, not when the options are set.
    	 */
    	public void setAppend(boolean flag) {
    		fileAppend = flag;
    	}
    
    	/**
    	 The <b>BufferedIO</b> option takes a boolean value. It is set to
    	 <code>false</code> by default. If true, then <code>File</code>
    	 will be opened and the resulting {@link java.io.Writer} wrapped
    	 around a {@link BufferedWriter}.
    	
    	 BufferedIO will significatnly increase performance on heavily
    	 loaded systems.
    	
    	*/
    	public void setBufferedIO(boolean bufferedIO) {
    		this.bufferedIO = bufferedIO;
    		if (bufferedIO) {
    			immediateFlush = false;
    		}
    	}
    
    	/**
    	 Set the size of the IO buffer.
    	*/
    	public void setBufferSize(int bufferSize) {
    		this.bufferSize = bufferSize;
    	}
    
    	/**
    	<p>Sets and <i>opens</i> the file where the log output will
    	go. The specified file must be writable.
    	
    	<p>If there was already an opened file, then the previous file
    	is closed first.
    	
    	<p><b>Do not use this method directly. To configure a FileAppender
    	or one of its subclasses, set its properties one by one and then
    	call activateOptions.</b>
    	
    	@param fileName The path to the log file.
    	@param append   If true will append to fileName. Otherwise will
    	    truncate fileName.  */
    	public synchronized void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize)
    			throws IOException {
    		LogLog.debug("setFile called: " + fileName + ", " + append);
    
    		// It does not make sense to have immediate flush and bufferedIO.
    		if (bufferedIO) {
    			setImmediateFlush(false);
    		}
    
    		reset();
    		FileOutputStream ostream = null;
    		try {
    			//
    			//   attempt to create file
    			//
    			ostream = new FileOutputStream(fileName, append);
    		} catch (FileNotFoundException ex) {
    			//
    			//   if parent directory does not exist then
    			//      attempt to create it and try to create file
    			//      see bug 9150
    			//
    			String parentName = new File(fileName).getParent();
    			if (parentName != null) {
    				File parentDir = new File(parentName);
    				if (!parentDir.exists() && parentDir.mkdirs()) {
    					ostream = new FileOutputStream(fileName, append);
    				} else {
    					throw ex;
    				}
    			} else {
    				throw ex;
    			}
    		}
    		Writer fw = createWriter(ostream);
    		if (bufferedIO) {
    			fw = new BufferedWriter(fw, bufferSize);
    		}
    		this.setQWForFiles(fw);
    		this.fileName = fileName;
    		this.fileAppend = append;
    		this.bufferedIO = bufferedIO;
    		this.bufferSize = bufferSize;
    		writeHeader();
    		LogLog.debug("setFile ended");
    	}
    
    	/**
    	 Sets the quiet writer being used.
    	
    	 This method is overriden by {@link RollingFileAppender}.
    	 */
    	protected void setQWForFiles(Writer writer) {
    		this.qw = new QuietWriter(writer, errorHandler);
    	}
    
    	/**
    	 Close any previously opened file and call the parent's
    	 <code>reset</code>.  */
    	@Override
    	protected void reset() {
    		closeFile();
    		this.fileName = null;
    		super.reset();
    	}
    }
    

    运行效果:

     

  • 相关阅读:
    mockito测试final类/static方法/自己new的对象
    flink 1.11.2 学习笔记(5)-处理消息延时/乱序的三种机制
    linux查找操作
    分析MongoDB架构案例
    legend3---bootstrap modal框出现蒙层,无法点击modal框内容(z-index问题)
    legend3---laravel报419错误
    laravel自定义中间件实例
    laravel中间件Middleware原理解析及实例
    git: Failed to connect to github.com port 443: Timed out
    记忆规律
  • 原文地址:https://www.cnblogs.com/interdrp/p/7735481.html
Copyright © 2011-2022 走看看