自定义实现log4j的FileAppender
2014-09-01 15:17
555 查看
log4j 工作中自己用的FileAppender
功能:默认创建一个文件 ,当文件大小超过配置文件中的限度的时候,压缩到一个压缩包中,
压缩包中的文件的数量可以再配置文件中配置;
log4j.properties文件的配置(文件大小1M,压缩包中最多压缩8个文件)
---------------------------------
-------------------------------------
--------------------------------------------------------------------
-------------------------------------------
package com.tangdou;
public abstract interface BIPropertiesListener {
public abstract void onBIPropertiesChange();
}
-----------------------------
-----------------------------------------------------------
--------------------------------------------
--------------------------------------------
最后测试
功能:默认创建一个文件 ,当文件大小超过配置文件中的限度的时候,压缩到一个压缩包中,
压缩包中的文件的数量可以再配置文件中配置;
log4j.properties文件的配置(文件大小1M,压缩包中最多压缩8个文件)
log4j.rootLogger=INFO,console,file # console log4j.logger.console=ERROR,console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d %-5p [%C] %m%n #log4j.appender.console.layout.ConversionPattern=%-5p [%C][%L] %m%n # file log4j.logger.file=ERROR,file log4j.appender.file=com.tangdou.BackupRollingFileAppenderProxy log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n # windows #log4j.appender.file.file=D:/log/mms.log{0} #log4j.appender.file.backupPath=D:/log/WEB-INF/log/bak log4j.appender.file.file=D:/tangdou.log{0} log4j.appender.file.backupPath=${catalina.base}/logs/log/WEB-INF/log/bak #linux #log4j.appender.file.file=D:/log/zzEquipmentManager.log{0} #log4j.appender.file.backupPath=D:/log/WEB-INF/log/bak log4j.appender.file.maxFileSize=1024KB log4j.appender.file.maxBackupIndex=8
---------------------------------
package com.tangdou; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.apache.commons.io.IOUtils; import org.apache.log4j.RollingFileAppender; import org.apache.log4j.helpers.LogLog; public class BackupRollingFileAppender extends RollingFileAppender { public static final String ZIP_SUFFIX = ".zip"; public static final String ZIP_DATE_FMT = "yyyyMMddHHmmss"; public static final String ZIP_NAME_LIST_SEPARATOR = "_"; private String backupPath; private String backupFilePrefix; private String filePattern; public void rollOver() { int maxbakIndex = getMaxBackupIndex(); if (maxbakIndex > 0) if (new File(MessageFormat.format(getFilePattern(), new Object[] { Integer.valueOf(maxbakIndex) })).exists()) { try { backup(); } catch (IOException e) { LogLog.error("Cannot backup logs", e); } } if (this.maxBackupIndex > 0) { File file = new File(MessageFormat.format(getFilePattern(), new Object[] { Integer.valueOf(this.maxBackupIndex) })); if (file.exists()) { file.delete(); } for (int i = this.maxBackupIndex - 1; i >= 1; --i) { file = new File(MessageFormat.format(getFilePattern(), new Object[] { Integer.valueOf(i) })); if (file.exists()) { File target = new File(MessageFormat.format( getFilePattern(), new Object[] { Integer.valueOf(i + 1) })); LogLog.debug("Renaming file " + file + " to " + target); file.renameTo(target); } } File target = new File(MessageFormat.format(getFilePattern(), new Object[] { Integer.valueOf(1) })); closeFile(); file = new File(getFile()); LogLog.debug("Renaming file " + file + " to " + target); file.renameTo(target); } try { setFile(getFile(), false, this.bufferedIO, this.bufferSize); } catch (IOException e) { LogLog.error("setFile(" + getFile() + ", false) call failed.", e); } } public void backup() throws IOException { File bakDir = getBackupDir(); File bakFile = new File(bakDir, Long.toString(System .currentTimeMillis())); long backupFileMinLastModified = -1L; long backupFileMaxLastModified = -1L; int maxbakIndex = getMaxBackupIndex(); ZipOutputStream zos = null; boolean succeed = false; try { zos = new ZipOutputStream(new FileOutputStream(bakFile)); for (int i = 1; i <= maxbakIndex; ++i) { File file = new File(MessageFormat.format(getFilePattern(), new Object[] { Integer.valueOf(i) })); if (file.exists()) { long lastModified = file.lastModified(); if (backupFileMinLastModified == -1L) { backupFileMinLastModified = lastModified; } else if (backupFileMinLastModified > lastModified) { backupFileMinLastModified = lastModified; } if (backupFileMaxLastModified < lastModified) { backupFileMaxLastModified = lastModified; } ZipEntry entry = new ZipEntry(file.getName()); entry.setSize(file.length()); entry.setTime(lastModified); zos.putNextEntry(entry); FileInputStream fis = null; try { fis = new FileInputStream(file); IOUtils.copyLarge(fis, zos); } finally { IOUtils.closeQuietly(fis); } zos.closeEntry(); } } zos.finish(); succeed = true; } finally { IOUtils.closeQuietly(zos); if ((!(succeed)) && (bakFile.exists())) { bakFile.delete(); } } if ((backupFileMinLastModified != -1L) && (backupFileMaxLastModified != -1L)) { StringBuffer name = new StringBuffer(getBackupFilePrefix()); Date minDate = new Date(backupFileMinLastModified); name.append("_").append(toString(minDate, "yyyyMMddHHmmss", "")); Date maxDate = new Date(backupFileMaxLastModified); name.append("_").append(toString(minDate, "yyyyMMddHHmmss", "")); name.append(".zip"); File f = new File(bakDir, name.toString()); bakFile.renameTo(f); if (succeed) { for (int i = 1; i <= maxbakIndex; ++i) { File file = new File(MessageFormat.format(getFilePattern(), new Object[] { Integer.valueOf(i) })); if (file.exists()) { file.delete(); } } } } else { LogLog.warn("Not file to backup."); } } public String getBackupFilePrefix() { if (StringUtils.isEmpty(this.backupFilePrefix)) { String name = new File(StringUtils.replace(getFilePattern(), "{", "}", new IStringReplaceProcess() { @Override public String doReplace(String paramString, int paramInt1, int paramInt2) { return null; } })).getName(); if (name.lastIndexOf(".") != -1) { name = StringUtils.substringBeforeLast(name, "."); } while (name.endsWith(".")) { name = StringUtils.substringBeforeLast(name, "."); } return name; } return this.backupFilePrefix; } public void setFile(String file) { this.filePattern = file; String fileToUse = StringUtils.replace(file, "{", "}", new IStringReplaceProcess() { @Override public String doReplace(String paramString, int paramInt1, int paramInt2) { // TODO Auto-generated method stub return null; } }); super.setFile(fileToUse); } public String getFilePattern() { return this.filePattern; } public void setBackupFilePrefix(String backupFilePrefix) { this.backupFilePrefix = backupFilePrefix; } private File getBackupDir() throws IOException { File bakDir = new File(this.backupPath); if ((!(bakDir.exists())) && (!(bakDir.mkdirs()))) { throw new IOException("Cannot create log backup dir [" + this.backupPath + "]"); } return bakDir; } public String getBackupPath() { return this.backupPath; } public void setBackupPath(String backupPath) { this.backupPath = backupPath; } public String toString(Date date, String dateFormatString, String defaultValue) { if (date == null) { return defaultValue; } try { return new SimpleDateFormat(dateFormatString).format(date); } catch (Throwable e) { } return defaultValue; } }
-------------------------------------
package com.tangdou; import java.io.File; import java.io.IOException; import org.apache.log4j.Appender; import org.apache.log4j.Layout; import org.apache.log4j.Logger; import org.apache.log4j.spi.ErrorHandler; import org.apache.log4j.spi.Filter; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.OptionHandler; public class BackupRollingFileAppenderProxy implements Appender, OptionHandler { private static final Logger log = Logger .getLogger(BackupRollingFileAppenderProxy.class); private BackupRollingFileAppender appender = new BackupRollingFileAppender(); private String evalPrefix = "${"; private String evalSuffix = "}"; private String append; private String bufferedIO; private String bufferSize; private String encoding; private String file; private String immediateFlush; private String maxBackupIndex; private String maxFileSize; private String maximumFileSize; private String backupPath; public void addFilter(Filter newFilter) { this.appender.addFilter(newFilter); } public void clearFilters() { this.appender.clearFilters(); } public void close() { this.appender.close(); } public void doAppend(LoggingEvent event) { this.appender.doAppend(event); } public ErrorHandler getErrorHandler() { return this.appender.getErrorHandler(); } public Filter getFilter() { return this.appender.getFilter(); } public Layout getLayout() { return this.appender.getLayout(); } public String getName() { return this.appender.getName(); } public boolean requiresLayout() { return this.appender.requiresLayout(); } public void setErrorHandler(ErrorHandler errorHandler) { this.appender.setErrorHandler(errorHandler); } public void setLayout(Layout layout) { this.appender.setLayout(layout); } public void setName(String name) { this.appender.setName(name); } public void activateOptions() { String value; if (StringUtils.isNotEmpty(this.append)) { String flag = BIPropertiesBean.replace(this.append, this.evalPrefix, this.evalSuffix); this.appender.setAppend(ConvertUtils.toBool(flag)); } if (StringUtils.isNotEmpty(this.bufferedIO)) { String bio = BIPropertiesBean.replace(this.bufferedIO, this.evalPrefix, this.evalSuffix); this.appender.setBufferedIO(ConvertUtils.toBool(bio)); } if (StringUtils.isNotEmpty(this.bufferSize)) { String bs = BIPropertiesBean.replace(this.bufferSize, this.evalPrefix, this.evalSuffix); this.appender.setBufferSize(ConvertUtils.toInt(bs)); } if (StringUtils.isNotEmpty(this.encoding)) { value = BIPropertiesBean.replace(this.encoding, this.evalPrefix, this.evalSuffix); this.appender.setEncoding(value); } if (StringUtils.isNotEmpty(this.file)) { String f = BIPropertiesBean.replace(this.file, this.evalPrefix, this.evalSuffix); this.appender.setFile(f); } if (StringUtils.isNotEmpty(this.immediateFlush)) { value = BIPropertiesBean.replace(this.immediateFlush, this.evalPrefix, this.evalSuffix); this.appender.setImmediateFlush(ConvertUtils.toBool(value)); } if (StringUtils.isNotEmpty(this.maxBackupIndex)) { String maxBackups = BIPropertiesBean.replace(this.maxBackupIndex, this.evalPrefix, this.evalSuffix); this.appender.setMaxBackupIndex(ConvertUtils.toInt(maxBackups)); } if (StringUtils.isNotEmpty(this.maxFileSize)) { value = BIPropertiesBean.replace(this.maxFileSize, this.evalPrefix, this.evalSuffix); this.appender.setMaxFileSize(value); } if (StringUtils.isNotEmpty(this.maximumFileSize)) { String maxFileSize = BIPropertiesBean.replace(this.maximumFileSize, this.evalPrefix, this.evalSuffix); this.appender.setMaximumFileSize(ConvertUtils.toLong(maxFileSize)); } if (StringUtils.isNotEmpty(this.backupPath)) { String bp = BIPropertiesBean.replace(this.backupPath, this.evalPrefix, this.evalSuffix); this.appender.setBackupPath(bp); } boolean hasFile = true; File testFile = new File(this.appender.getFile()); if (!(testFile.exists())) { hasFile = false; boolean mkd = true; boolean cnf = true; String parentName = new File(this.appender.getFile()).getParent(); if (parentName != null) { File parentDir = new File(parentName); if (!(parentDir.exists())) { mkd = parentDir.mkdirs(); if (mkd) { log.info("Success"); } else { log.error("Fail"); } } try { cnf = testFile.createNewFile(); if (cnf) { log.info("Success to create new file."); } else { log.error("Fail to create new file."); } hasFile = true; } catch (IOException e) { log.error(null, e); } } } if (hasFile) { this.appender.activateOptions(); } } public void setAppend(String append) { this.append = append; } public void setBufferedIO(String bufferedIO) { this.bufferedIO = bufferedIO; } public void setBufferSize(String bufferSize) { this.bufferSize = bufferSize; } public void setEncoding(String encoding) { this.encoding = encoding; } public void setFile(String file) { this.file = file; } public String getFile() { return this.appender.getFile(); } public void setImmediateFlush(String immediateFlush) { this.immediateFlush = immediateFlush; } public void setMaxBackupIndex(String maxBackupIndex) { this.maxBackupIndex = maxBackupIndex; } public void setMaxFileSize(String maxFileSize) { this.maxFileSize = maxFileSize; } public void setMaximumFileSize(String maximumFileSize) { this.maximumFileSize = maximumFileSize; } public String getBackupPath() { return this.appender.getBackupPath(); } public void setBackupPath(String backupPath) { this.backupPath = backupPath; } public void setEvalPrefix(String evalPrefix) { this.evalPrefix = evalPrefix; } public void setEvalSuffix(String evalSuffix) { this.evalSuffix = evalSuffix; } }
--------------------------------------------------------------------
package com.tangdou; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.Vector; import org.apache.log4j.Logger; public class BIPropertiesBean { private static final Logger log = Logger.getLogger(BIPropertiesBean.class); private static Properties properties = new Properties(); public static final String WEB_APP_ROOT_KEY = "webAppRootKey"; public static final String WEB_APP_TEMP_ROOT_KEY = "webAppTempRootKey"; public static final String BI_ENCODING_KEY = "bi.i18n.encoding"; public static final String WEB_SERVERINFO_KEY = "webServerInfo"; public static final String TOMCAT_WEB_SERVER_PREFIX = "Apache Tomcat"; public static final String WEBLOGIC_WEB_SERVER_PREFIX = "WebLogic Server"; private static Vector<BIPropertiesListener> propertiesListeners = new Vector(); protected static void setProperties(Properties properties) { Properties desProperties = properties; properties = properties; desProperties.clear(); fireBIPropertiesListener(); } protected static void clear() { properties.clear(); } protected static Object put(Object key, Object value) { return properties.put(key, value); } protected static void putAll(Map t) { properties.putAll(t); } protected static Object remove(Object key) { return properties.remove(key); } protected static void fireBIPropertiesListener() { Vector bipll = null; synchronized (propertiesListeners) { bipll = (Vector) propertiesListeners.clone(); } for (Iterator localIterator = bipll.iterator(); localIterator.hasNext();) { BIPropertiesListener bipl = (BIPropertiesListener) localIterator .next(); try { bipl.onBIPropertiesChange(); } catch (Throwable t) { log.error(null, t); } } } public static void addBIPropertiesListener(BIPropertiesListener l) { synchronized (propertiesListeners) { if (!(propertiesListeners.contains(l))) { propertiesListeners.add(l); } } } public static void removeBIPropertiesListener(BIPropertiesListener l) { synchronized (propertiesListeners) { if (propertiesListeners.contains(l)) { propertiesListeners.remove(l); } } } public static String getServerInfo() { return properties.getProperty("webServerInfo"); } public static boolean isTomcatServer() { String serverInfo = getServerInfo(); if (log.isDebugEnabled()) { StringBuffer msg = new StringBuffer(); msg.append("isTomcatServer() [").append(serverInfo).append("]"); msg.append(" startsWith [").append("Apache Tomcat").append("]?"); log.debug(msg.toString()); } if (serverInfo != null) { return serverInfo.startsWith("Apache Tomcat"); } return false; } public static boolean isWeblogicServer() { String serverInfo = getServerInfo(); if (log.isDebugEnabled()) { StringBuffer msg = new StringBuffer(); msg.append("isWeblogicServer() [").append(serverInfo).append("]"); msg.append(" startsWith [").append("WebLogic Server").append("]?"); log.debug(msg.toString()); } if (serverInfo != null) { return serverInfo.startsWith("WebLogic Server"); } return false; } public static boolean contains(Object value) { return properties.contains(value); } public static boolean containsKey(Object key) { return properties.containsKey(key); } public static boolean containsValue(Object value) { return properties.containsValue(value); } public static int getProperty(String key, int defaultValue) { String property = getProperty(key); return ConvertUtils.toInt(property, defaultValue); } public static long getProperty(String key, long defaultValue) { String property = getProperty(key); return ConvertUtils.toLong(property, defaultValue); } public static boolean getProperty(String key, boolean defaultValue) { String property = getProperty(key); return ConvertUtils.toBool(property, defaultValue); } public static String getProperty(String key) { return getProperty(key, null); } public static String getProperty(String key, IPropertyProcess process) { return getProperty(key, null, process); } public static String getProperty(String key, String defaultValue, IPropertyProcess process) { String value = properties.getProperty(key, defaultValue); if (process != null) { StringBuffer msg; if (log.isDebugEnabled()) { msg = new StringBuffer(); msg.append("before process property key [").append(key) .append("]"); msg.append(" value [").append(value).append("]"); log.debug(msg.toString()); } value = process.process(key, value); if (log.isDebugEnabled()) { msg = new StringBuffer(); msg.append("after process property key [").append(key) .append("]"); msg.append(" value [").append(value).append("]"); log.debug(msg.toString()); } } return value; } public static String replaceEval(String valueString) { return replaceEval(valueString, null); } public static String replaceEval(String valueString, IPropertyProcess process) { return StringUtils.replaceEval(valueString, new IStringReplaceProcess() { @Override public String doReplace(String paramString, int paramInt1, int paramInt2) { // TODO Auto-generated method stub return null; } }); } public static String replace(String valueString, String prefix, String suffix) { return replace(valueString, prefix, suffix, null); } public static String replace(String valueString, String prefix, String suffix, IPropertyProcess process) { return StringUtils.replace(valueString, prefix, suffix, new IStringReplaceProcess() { @Override public String doReplace(String paramString, int paramInt1, int paramInt2) { // TODO Auto-generated method stub return null; } }); } public static boolean isEmpty() { return properties.isEmpty(); } public static Enumeration propertyNames() { return properties.propertyNames(); } public static int size() { return properties.size(); } }
-------------------------------------------
package com.tangdou;
public abstract interface BIPropertiesListener {
public abstract void onBIPropertiesChange();
}
-----------------------------
package com.tangdou; import org.apache.log4j.Logger; public abstract class ConvertUtils { private static final Logger log = Logger.getLogger(ConvertUtils.class); private static final String WEB_INF = "/WEB-INF/"; public static final String DATE_FMT = "yyyy-MM-dd"; public static final String TIME_FMT = "HH:mm:ss"; public static final String DT_FMT = "yyyy-MM-dd HH:mm:ss"; public static final String DEFAULT_FMT = "yyyy-MM-dd"; public static int[] toInt(Object[] objects) { if (objects == null) { return null; } int[] intObjects = new int[objects.length]; for (int i = 0; i < intObjects.length; ++i) { intObjects[i] = toInt(objects[i]); } return intObjects; } public static int toInt(Object object) { if (object instanceof Integer) { return ((Integer) object).intValue(); } if (object instanceof Short) { return ((Short) object).intValue(); } if (object instanceof Double) { return ((Double) object).intValue(); } if (object instanceof Long) { return ((Long) object).intValue(); } if (object instanceof Float) { return ((Float) object).intValue(); } if (object instanceof Number) { return ((Number) object).intValue(); } return Integer.parseInt(object.toString()); } public static int toInt(Object object, int defaultValue) { try { return toInt(object); } catch (Throwable e) { } return defaultValue; } public static short toShort(Object object) { if (object instanceof Short) { return ((Short) object).shortValue(); } if (object instanceof Integer) { return ((Integer) object).shortValue(); } if (object instanceof Double) { return ((Double) object).shortValue(); } if (object instanceof Long) { return ((Long) object).shortValue(); } if (object instanceof Float) { return ((Float) object).shortValue(); } if (object instanceof Number) { return ((Number) object).shortValue(); } return Short.parseShort(object.toString()); } public static short toShort(Object object, short defaultValue) { try { return toShort(object); } catch (Throwable e) { } return defaultValue; } public static float toFloat(Object object) { if (object instanceof Float) { return ((Float) object).floatValue(); } if (object instanceof Short) { return ((Short) object).floatValue(); } if (object instanceof Integer) { return ((Integer) object).floatValue(); } if (object instanceof Long) { return ((Long) object).floatValue(); } if (object instanceof Double) { return ((Double) object).floatValue(); } if (object instanceof Number) { return ((Number) object).floatValue(); } return Float.parseFloat(object.toString()); } public static float toFloat(Object object, float defaultValue) { try { return toFloat(object); } catch (Throwable e) { } return defaultValue; } public static double toDouble(Object object) { if (object instanceof Double) { return ((Double) object).doubleValue(); } if (object instanceof Short) { return ((Short) object).doubleValue(); } if (object instanceof Integer) { return ((Integer) object).doubleValue(); } if (object instanceof Long) { return ((Long) object).doubleValue(); } if (object instanceof Float) { return ((Float) object).doubleValue(); } if (object instanceof Number) { return ((Number) object).doubleValue(); } return Double.parseDouble(object.toString()); } public static double toDouble(Object object, double defaultValue) { try { return toDouble(object); } catch (Throwable e) { } return defaultValue; } public static double[] toDouble(Object[] doubleArray) { if (doubleArray == null) { return null; } double[] returnDoubleArray = new double[doubleArray.length]; for (int i = 0; i < returnDoubleArray.length; ++i) { returnDoubleArray[i] = toDouble(doubleArray[i]); } return returnDoubleArray; } public static double[] toDouble(Object[] doubleArray, double[] defaultValue) { try { return toDouble(doubleArray); } catch (Throwable e) { } return defaultValue; } public static Double toDoubleObject(Object object) { return Double.valueOf(toDouble(object)); } public static Double toDoubleObject(Object object, Double defaultValue) { try { return toDoubleObject(object); } catch (Throwable e) { } return defaultValue; } public static Double[] toDoubleObject(Object[] doubleArray) { if (doubleArray == null) { return null; } Double[] returnDoubleArray = new Double[doubleArray.length]; for (int i = 0; i < returnDoubleArray.length; ++i) { returnDoubleArray[i] = toDoubleObject(doubleArray[i]); } return returnDoubleArray; } public static Double[] toDoubleObject(Object[] doubleArray, Double[] defaultValues) { try { return toDoubleObject(doubleArray); } catch (Throwable e) { } return defaultValues; } public static long toLong(Object object) { if (object instanceof Long) { return ((Long) object).longValue(); } if (object instanceof Double) { return ((Double) object).longValue(); } if (object instanceof Short) { return ((Short) object).longValue(); } if (object instanceof Integer) { return ((Integer) object).longValue(); } if (object instanceof Float) { return ((Float) object).longValue(); } if (object instanceof Number) { return ((Number) object).longValue(); } return Long.parseLong(object.toString()); } public static long toLong(Object object, long defaultValue) { try { return toLong(object); } catch (Throwable e) { } return defaultValue; } public static Boolean toBoolean(Object object) { if (object == null) { Boolean obj = null; return obj; } return Boolean.valueOf(toBool(object)); } public static boolean toBool(Object object) { if (object instanceof Boolean) { return ((Boolean) object).booleanValue(); } return Boolean.parseBoolean(object.toString()); } public static boolean toBool(Object object, boolean defaultValue) { try { return toBool(object); } catch (Throwable e) { } return defaultValue; } public static boolean toBool(int object) { return (object == 1); } }
-----------------------------------------------------------
package com.tangdou; public abstract interface IPropertyProcess { public abstract String process(String paramString1, String paramString2); }
--------------------------------------------
</pre><pre name="code" class="java">package com.tangdou; public abstract interface IStringReplaceProcess { public abstract String doReplace(String paramString, int paramInt1, int paramInt2); }
--------------------------------------------
package com.tangdou; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.StringTokenizer; import org.apache.commons.lang.ArrayUtils; public abstract class StringUtils extends org.apache.commons.lang.StringUtils { public static final String EVAL_PREFIX = "${"; public static final String EVAL_SUFFIX = "}"; public static String removeEnd(String src, int length) { if ((src == null) || (src.length() <= 1)) { return null; } return src.substring(0, src.length() - length); } public static String deleteExceptBlank(String psql) { String sql = deleteHtml(psql); StringBuffer sb = new StringBuffer(sql + " $"); int blankCount = 0; char ch = sb.charAt(0); int i = 0; int k = 0; int[] pos = new int[sb.length()]; while (ch != '$') { ch = sb.charAt(i); if (ch == ' ') { ++blankCount; } else { blankCount = 0; } if (blankCount > 1) { pos[k] = i; ++k; } ++i; } StringBuffer sb1 = new StringBuffer(); boolean isBlank = false; for (int i1 = 0; i1 < sb.length(); ++i1) { isBlank = false; if ((k > 0) && (i1 <= pos[(k - 1)])) { for (int i2 = 0; i2 < k; ++i2) { if (i1 == pos[i2]) { isBlank = true; } } if (!(isBlank)) { sb1.append(sb.charAt(i1)); } } else { sb1.append(sb.charAt(i1)); } } sb1.deleteCharAt(sb1.lastIndexOf("$")); sql = sb1.toString(); return sql; } public static String deleteHtml(String psql) { psql = psql + "$"; StringBuffer sb = new StringBuffer(psql); for (int i = 0; i < psql.length() - 1; ++i) { char ch = psql.charAt(i); if ((ch == '\r') || (ch == '\n')) { sb.replace(i, i + 1, " "); } } sb.deleteCharAt(sb.length() - 1); String sql2 = sb.toString(); return sql2; } public static String deleteAllBlank(String str) { String sql1 = str; StringBuffer sb = new StringBuffer(sql1); if (sql1.indexOf("$") == -1) { sb.append("$"); } char ch = sb.charAt(0); int i = 0; int k = 0; int[] pos = new int[sb.length() + 1]; while (ch != '$') { if (ch == ' ') { pos[k] = i; ++k; } ++i; ch = sb.charAt(i); } for (i = 0; i < k; ++i) { sb.deleteCharAt(pos[i] - i); } sb.deleteCharAt(sb.lastIndexOf("$")); return sb.toString(); } public static String blankIfNull(Object obj) { return ((obj == null) ? "" : obj.toString()); } public static String repeatSymbolSplittedString(String element, int num, String split) { StringBuffer sb = new StringBuffer(250); for (int i = 0; i < num; ++i) { if (i != 0) { sb.append(split); } sb.append(element); } return sb.toString(); } public static String repeatSymbolSplittedString(String element, int num) { return repeatSymbolSplittedString(element, num, ", "); } public static int getRepeatCount(String src, char c) { int count = 0; for (int i = 0; i < src.length(); ++i) { if (src.charAt(i) == c) { ++count; } } return count; } public static String addQuoteToStr(String inputStr, String token, String quote) { String result = inputStr; String[] splitStr = inputStr.split(token); for (int i = 0; i < splitStr.length; ++i) { splitStr[i] = quote + splitStr[i] + quote; } result = ArrayUtils.toString(splitStr); return result; } public static String addQuoteToStr(String inputStr) { return addQuoteToStr(inputStr, ",", "'"); } public static String addQuoteToStr(String[] str) { String inputStr = ""; if ((str != null) && (str.length > 0)) { for (int i = 0; i < str.length; ++i) { inputStr = inputStr + str[i] + ","; } return addQuoteToStr(inputStr, ",", "'"); } return "''"; } public static String[][] lstToTwoDimStringArr(List lst) { if (lst == null) { return null; } String[][] arr = new String[lst.size()][]; for (int i = 0; i < lst.size(); ++i) { List _lst = (List) lst.get(i); String[] str = (String[]) _lst.toArray(new String[_lst.size()]); arr[i] = str; } return arr; } public static String addCommaToArray(Object[] obj) { String inputStr = ""; if ((obj != null) && (obj.length > 0)) { for (int i = 0; i < obj.length; ++i) { if (!("".equals(obj[i]))) { inputStr = inputStr + obj[i].toString() + ","; } } return inputStr.substring(0, inputStr.length() - 1); } return ""; } public static String ellipse(String src, int byteLength, String tail) { char c; if (src == null) return src; StringBuffer s = new StringBuffer(); for (int i = 0; (i < src.length()) && (byteLength > 0); ++i) { c = src.charAt(i); s.append(c); byteLength -= String.valueOf(c).getBytes().length; } if ((tail != null) && (byteLength <= 0)) { byteLength = tail.getBytes().length; for (int i = s.length() - 1; (i >= 0) && (byteLength > 0); --i) { c = s.charAt(i); s.deleteCharAt(i); byteLength -= String.valueOf(c).getBytes().length; } return tail; } return s.toString(); } public static String[] ellipse(String[] src, int byteLength, String tail) { String[] returnSrc = new String[src.length]; for (int i = 0; i < src.length; ++i) { returnSrc[i] = ellipse(src[i], byteLength, tail); } return returnSrc; } public static String replace(String valueString, String prefix, String suffix, IStringReplaceProcess process) { StringBuffer valueStringBuffer = new StringBuffer(valueString); int prefixIndex = 0; while ((prefixIndex = valueStringBuffer.indexOf(prefix, prefixIndex)) != -1) { int suffixIndex = valueStringBuffer.indexOf(suffix, prefixIndex + prefix.length()); if (suffixIndex == -1) { break; } int start = prefixIndex + prefix.length(); String code = valueStringBuffer.substring(start, suffixIndex); String msg = process.doReplace(code, start, suffixIndex); valueStringBuffer .delete(prefixIndex, suffixIndex + suffix.length()); if (isNotEmpty(msg)) { valueStringBuffer.insert(prefixIndex, msg); prefixIndex += msg.length(); } } return valueStringBuffer.toString(); } public static String replaceEval(String valueString, IStringReplaceProcess process) { return replace(valueString, "${", "}", process); } public static String valueOf(Collection collection, String token) { if ((collection == null) || (collection.isEmpty()) || (token == null)) { return null; } StringBuffer sb = new StringBuffer(); for (Iterator it = collection.iterator(); it.hasNext();) { String value = it.next().toString(); sb.append(value + token); } sb.delete(sb.length() - token.length(), sb.length()); return sb.toString(); } public static boolean startsWithIgnoreCase(String s1, String s2) { if ((s1 == null) || (s2 == null)) { return false; } return s1.toLowerCase(Locale.ENGLISH).startsWith( s2.toLowerCase(Locale.ENGLISH)); } public static boolean endsWithIgnoreCase(String s1, String s2) { if ((s1 == null) || (s2 == null)) { return false; } return s1.toLowerCase(Locale.ENGLISH).endsWith( s2.toLowerCase(Locale.ENGLISH)); } public static String trimBlank(String s) { return trimTrailingBlank(trimLeadingBlank(s)); } public static String trimLeadingBlank(String s) { if ((isEmpty(s)) || (!(s.startsWith(" ")))) { return s; } return trimLeadingBlank(substring(s, 1)); } public static String trimTrailingBlank(String s) { if ((isEmpty(s)) || (!(s.endsWith(" ")))) { return s; } return trimTrailingBlank(substring(s, 0, s.length() - 1)); } public static Map<String, String> strToMap(String value, String itemSplit, String keyValueSplit) { Map result = new HashMap(); if (value == null) { return result; } StringTokenizer token = new StringTokenizer(value, itemSplit); while (token.hasMoreElements()) { String item = token.nextToken(); result.put(substringBefore(item, keyValueSplit), substringAfter(item, keyValueSplit)); } return result; } }
最后测试
package com.tangdou; import org.apache.log4j.Logger; public class TestLog { public static void main(String[] args) { Logger log = Logger.getLogger(TestLog.class); log.info("aaaaa"); } }
相关文章推荐
- 自定义Appender ,实现输出log4j日志到GUI
- Log4j 重写 RollingFileAppender 实现按日期生成文件夹文件名
- Log4j2、Log4j、Logback自定义Appender实现
- log4j使用心得之四 -- 自定义DailyRollingFileAppender归档文件名
- 自定义log4j的Appender
- Log4j之自定义Appender
- log4j:ERROR A "org.jboss.logging.appender.FileAppender"
- 在log4j中使用自定义的Appender
- 扩展log4j系列[二]为DailyRollingFileAppender加上maxBackupIndex属性
- axjs2 file 实现log4j
- aop log4j mdc实现自定义字段存入数据库
- log4j使用DailyRollingFileAppender
- log4j-1.2.9自定义Appender
- Log4j RollingFileAppender 备份日志文件名 修改
- grails1.1 log4j DailyRollingFileAppender 配置 config.groovy
- log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.lo
- 使用log4j扩展包的RollingFileAppender生成带时间戳的日志文件
- 发现一个log4j的日志输出器(DatedFileAppender)
- 扩展log4j系列[一]DailyRollingFileAppender的按分钟生成日志修改为按n分钟生成日志
- 13.log4j.properties例子:org.apache.log4j.RollingFileAppender