- 指定文件大小的滚动日志【文件大小到达指定尺寸的时候产生一个新的文件】
1 package com.byttersoft.util.log4j;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.Writer;
6
7 import org.apache.log4j.FileAppender;
8 import org.apache.log4j.Layout;
9 import org.apache.log4j.helpers.CountingQuietWriter;
10 import org.apache.log4j.helpers.LogLog;
11 import org.apache.log4j.helpers.OptionConverter;
12 import org.apache.log4j.spi.LoggingEvent;
13
14 public class RollingFileAppender extends FileAppender {
15 protected long maxFileSize = 10485760L;
16
17 protected int maxBackupIndex = 1;
18
19 private long nextRollover = 0L;
20
21
22 public RollingFileAppender() {
23 }
24
25 public RollingFileAppender(Layout layout, String filename, boolean append)
26 throws IOException {
27 super(layout, filename, append);
28 }
29
30 public RollingFileAppender(Layout layout, String filename)
31 throws IOException {
32 super(layout, filename);
33 }
34
35 public int getMaxBackupIndex() {
36 return this.maxBackupIndex;
37 }
38
39 public long getMaximumFileSize() {
40 return this.maxFileSize;
41 }
42
43 public void rollOver() {
44 if (this.qw != null) {
45 long size = ((CountingQuietWriter) this.qw).getCount();
46 LogLog.debug("rolling over count=" + size);
47
48 this.nextRollover = (size + this.maxFileSize);
49 }
50 LogLog.debug("maxBackupIndex=" + this.maxBackupIndex);
51
52 boolean renameSucceeded = true;
53
54 int lastIndex=this.fileName.lastIndexOf(".");
55 String fileNameBegin=this.fileName;
56 String fileNameEnd="";
57 if(lastIndex!=-1){
58 fileNameBegin=this.fileName.substring(0,lastIndex);
59 fileNameEnd=this.fileName.substring(lastIndex);
60 }
61 if (this.maxBackupIndex > 0) {
62 File file = new File(fileNameBegin + "(" + this.maxBackupIndex + ")" + fileNameEnd);
63 if (file.exists()) {
64 renameSucceeded = file.delete();
65 }
66
67 for (int i = this.maxBackupIndex - 1; (i >= 1) && (renameSucceeded); i--) {
68 file = new File(fileNameBegin + "(" + i + ")" + fileNameEnd);
69 if (file.exists()) {
70 File target = new File(fileNameBegin + "(" + (i+1) + ")" + fileNameEnd);
71 LogLog.debug("Renaming file " + file + " to " + target);
72 renameSucceeded = file.renameTo(target);
73 }
74 }
75
76 if (renameSucceeded) {
77 File target = new File(fileNameBegin + "(" + 1 + ")" + fileNameEnd);
78
79 closeFile();
80
81 file = new File(this.fileName);
82 LogLog.debug("Renaming file " + file + " to " + target);
83 renameSucceeded = file.renameTo(target);
84
85 if (!renameSucceeded) {
86 try {
87 setFile(this.fileName, true, this.bufferedIO,
88 this.bufferSize);
89 } catch (IOException e) {
90 LogLog.error("setFile(" + this.fileName
91 + ", true) call failed.", e);
92 }
93
94 }
95
96 }
97
98 }
99
100 if (renameSucceeded) {
101 try {
102 setFile(this.fileName, false, this.bufferedIO, this.bufferSize);
103 this.nextRollover = 0L;
104 } catch (IOException e) {
105 LogLog.error("setFile(" + this.fileName
106 + ", false) call failed.", e);
107 }
108 }
109 }
110
111 public synchronized void setFile(String fileName, boolean append,
112 boolean bufferedIO, int bufferSize) throws IOException {
113 super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
114 if (append) {
115 File f = new File(fileName);
116 ((CountingQuietWriter) this.qw).setCount(f.length());
117 }
118 }
119
120 public void setMaxBackupIndex(int maxBackups) {
121 this.maxBackupIndex = maxBackups;
122 }
123
124 public void setMaximumFileSize(long maxFileSize) {
125 this.maxFileSize = maxFileSize;
126 }
127
128 public void setMaxFileSize(String value) {
129 this.maxFileSize = OptionConverter.toFileSize(value,
130 this.maxFileSize + 1L);
131 }
132
133 protected void setQWForFiles(Writer writer) {
134 this.qw = new CountingQuietWriter(writer, this.errorHandler);
135 }
136
137 protected void subAppend(LoggingEvent event) {
138 super.subAppend(event);
139 if ((this.fileName != null) && (this.qw != null)) {
140 long size = ((CountingQuietWriter) this.qw).getCount();
141 if ((size >= this.maxFileSize) && (size >= this.nextRollover))
142 rollOver();
143 }
144 }
145 }
- 按天滚动生成日志 DailyRollingFileAppender 【每天产生一个日志文件】
1 package com.byttersoft.util.log4j;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.text.SimpleDateFormat;
6 import java.util.Date;
7 import java.util.Locale;
8 import java.util.TimeZone;
9
10 import org.apache.log4j.FileAppender;
11 import org.apache.log4j.Layout;
12 import org.apache.log4j.helpers.LogLog;
13 import org.apache.log4j.spi.LoggingEvent;
14
15 public class DailyRollingFileAppender extends FileAppender {
16 static final int TOP_OF_TROUBLE = -1;
17 static final int TOP_OF_MINUTE = 0;
18 static final int TOP_OF_HOUR = 1;
19 static final int HALF_DAY = 2;
20 static final int TOP_OF_DAY = 3;
21 static final int TOP_OF_WEEK = 4;
22 static final int TOP_OF_MONTH = 5;
23 private String datePattern = "'.'yyyy-MM-dd";
24 private String scheduledFilename;
25 private String formatName;
26 private long nextCheck = System.currentTimeMillis() - 1L;
27
28 Date now = new Date();
29 SimpleDateFormat sdf;
30 RollingCalendar rc = new RollingCalendar();
31
32 int checkPeriod = -1;
33
34 static final TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");
35
36
37 //添加按
38
39 public DailyRollingFileAppender() {
40 }
41
42 public DailyRollingFileAppender(Layout layout, String filename,
43 String datePattern) throws IOException {
44 super(layout, filename, true);
45 this.datePattern = datePattern;
46 activateOptions();
47 }
48
49 public DailyRollingFileAppender(Layout layout, String filename, boolean append)
50 throws IOException {
51 super(layout, filename, append);
52 }
53
54 public DailyRollingFileAppender(Layout layout, String filename)
55 throws IOException {
56 super(layout, filename);
57 }
58
59 public void setDatePattern(String pattern) {
60 this.datePattern = pattern;
61 }
62
63 public String getDatePattern() {
64 return this.datePattern;
65 }
66
67 public void activateOptions() {
68 super.activateOptions();
69 if ((this.datePattern != null) && (this.fileName != null)) {
70 this.now.setTime(System.currentTimeMillis());
71 this.sdf = new SimpleDateFormat(this.datePattern);
72 int type = computeCheckPeriod();
73 printPeriodicity(type);
74 this.rc.setType(type);
75 File file = new File(this.fileName);
76 this.formatName=this.sdf.format(new Date(
77 file.lastModified()));
78 this.scheduledFilename = (this.fileName + this.formatName);
79 } else {
80 LogLog.error("Either File or DatePattern options are not set for appender ["
81 + this.name + "].");
82 }
83 }
84
85 void printPeriodicity(int type) {
86 switch (type) {
87 case 0:
88 LogLog.debug("Appender [" + this.name
89 + "] to be rolled every minute.");
90 break;
91 case 1:
92 LogLog.debug("Appender [" + this.name
93 + "] to be rolled on top of every hour.");
94
95 break;
96 case 2:
97 LogLog.debug("Appender [" + this.name
98 + "] to be rolled at midday and midnight.");
99
100 break;
101 case 3:
102 LogLog.debug("Appender [" + this.name
103 + "] to be rolled at midnight.");
104
105 break;
106 case 4:
107 LogLog.debug("Appender [" + this.name
108 + "] to be rolled at start of week.");
109
110 break;
111 case 5:
112 LogLog.debug("Appender [" + this.name
113 + "] to be rolled at start of every month.");
114
115 break;
116 default:
117 LogLog.warn("Unknown periodicity for appender [" + this.name + "].");
118 }
119 }
120
121 int computeCheckPeriod() {
122 RollingCalendar rollingCalendar = new RollingCalendar(gmtTimeZone,
123 Locale.ENGLISH);
124
125 Date epoch = new Date(0L);
126 if (this.datePattern != null) {
127 for (int i = 0; i <= 5; i++) {
128 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
129 this.datePattern);
130 simpleDateFormat.setTimeZone(gmtTimeZone);
131 String r0 = simpleDateFormat.format(epoch);
132 rollingCalendar.setType(i);
133 Date next = new Date(rollingCalendar.getNextCheckMillis(epoch));
134 String r1 = simpleDateFormat.format(next);
135
136 if ((r0 != null) && (r1 != null) && (!r0.equals(r1))) {
137 return i;
138 }
139 }
140 }
141 return -1;
142 }
143
144 void rollOver() throws IOException {
145 if (this.datePattern == null) {
146 this.errorHandler
147 .error("Missing DatePattern option in rollOver().");
148 return;
149 }
150 String formatNameNew = this.sdf.format(this.now);
151 String datedFilename = this.fileName + formatNameNew;
152
153 if (this.scheduledFilename.equals(datedFilename)) {
154 return;
155 }
156
157 closeFile();
158
159 //修改滚存文件
160 int lastIndex=this.fileName.lastIndexOf(".");
161 String fileNameBegin=this.fileName;
162 String fileNameEnd="";
163 if(lastIndex!=-1){
164 fileNameBegin=this.fileName.substring(0,lastIndex);
165 fileNameEnd=this.fileName.substring(lastIndex);
166 }
167
168 File target = new File(fileNameBegin+this.formatName+fileNameEnd);
169 if (target.exists()) {
170 target.delete();
171 }
172
173 File file = new File(this.fileName);
174 boolean result = file.renameTo(target);
175 if (result)
176 LogLog.debug(this.fileName + " -> " + fileNameBegin+this.formatName+fileNameEnd);
177 else {
178 LogLog.error("Failed to rename [" + this.fileName + "] to ["
179 + fileNameBegin+this.formatName+fileNameEnd + "].");
180 }
181
182 int maxBackupIndex=getMaxBackupIndex();
183 for(int i=1;i<=maxBackupIndex;i++){
184 target = new File(fileNameBegin+this.formatName+"("+i+")"+fileNameEnd);
185 if (target.exists()) {
186 target.delete();
187 }
188
189 file = new File(fileNameBegin+"("+i+")"+fileNameEnd);
190 if(file.exists()){
191 result = file.renameTo(target);
192 if (result)
193 LogLog.debug(fileNameBegin+"("+i+")"+fileNameEnd + " -> " + fileNameBegin+this.formatName+"("+i+")"+fileNameEnd);
194 else {
195 LogLog.error("Failed to rename [" + fileNameBegin+"("+i+")"+fileNameEnd + "] to ["
196 + fileNameBegin+this.formatName+"("+i+")"+fileNameEnd + "].");
197 }
198 }
199 }
200
201
202 try {
203 setFile(this.fileName, false, this.bufferedIO, this.bufferSize);
204 } catch (IOException e) {
205 this.errorHandler.error("setFile(" + this.fileName
206 + ", false) call failed.");
207 }
208 this.scheduledFilename = datedFilename;
209 this.formatName = formatNameNew;
210 }
211
212 public int getMaxBackupIndex() {
213 return 0;
214 }
215
216 protected void subAppend(LoggingEvent event) {
217 long n = System.currentTimeMillis();
218 if (n >= this.nextCheck) {
219 this.now.setTime(n);
220 this.nextCheck = this.rc.getNextCheckMillis(this.now);
221 try {
222 rollOver();
223 } catch (IOException ioe) {
224 LogLog.error("rollOver() failed.", ioe);
225 }
226 }
227
228 super.subAppend(event);
229 }
230 }
- 按天及固定大小滚动生成日志 DailyRollingAllFileAppender【日期和滚存同时进行】
1 package com.byttersoft.util.log4j;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.io.Writer;
6
7 import org.apache.log4j.Layout;
8 import org.apache.log4j.helpers.CountingQuietWriter;
9 import org.apache.log4j.helpers.LogLog;
10 import org.apache.log4j.helpers.OptionConverter;
11 import org.apache.log4j.spi.LoggingEvent;
12
13 public class DailyRollingAllFileAppender extends DailyRollingFileAppender {
14 protected long maxFileSize = 10485760L;
15
16 protected int maxBackupIndex = 1;
17
18 private long nextRollover = 0L;
19
20
21 public DailyRollingAllFileAppender() {
22 }
23
24 public DailyRollingAllFileAppender(Layout layout, String filename,
25 String datePattern) throws IOException {
26 super(layout, filename, datePattern);
27 }
28
29 public DailyRollingAllFileAppender(Layout layout, String filename, boolean append)
30 throws IOException {
31 super(layout, filename, append);
32 }
33
34 public DailyRollingAllFileAppender(Layout layout, String filename)
35 throws IOException {
36 super(layout, filename);
37 }
38
39 public int getMaxBackupIndex() {
40 return this.maxBackupIndex;
41 }
42
43 public long getMaximumFileSize() {
44 return this.maxFileSize;
45 }
46
47 public void rollOverOther() {
48 if (this.qw != null) {
49 long size = ((CountingQuietWriter) this.qw).getCount();
50 LogLog.debug("rolling over count=" + size);
51
52 this.nextRollover = (size + this.maxFileSize);
53 }
54 LogLog.debug("maxBackupIndex=" + this.maxBackupIndex);
55
56 boolean renameSucceeded = true;
57
58 int lastIndex=this.fileName.lastIndexOf(".");
59 String fileNameBegin=this.fileName;
60 String fileNameEnd="";
61 if(lastIndex!=-1){
62 fileNameBegin=this.fileName.substring(0,lastIndex);
63 fileNameEnd=this.fileName.substring(lastIndex);
64 }
65 if (this.maxBackupIndex > 0) {
66 File file = new File(fileNameBegin + "(" + this.maxBackupIndex + ")" + fileNameEnd);
67 if (file.exists()) {
68 renameSucceeded = file.delete();
69 }
70
71 for (int i = this.maxBackupIndex - 1; (i >= 1) && (renameSucceeded); i--) {
72 file = new File(fileNameBegin + "(" + i + ")" + fileNameEnd);
73 if (file.exists()) {
74 File target = new File(fileNameBegin + "(" + (i+1) + ")" + fileNameEnd);
75 LogLog.debug("Renaming file " + file + " to " + target);
76 renameSucceeded = file.renameTo(target);
77 }
78 }
79
80 if (renameSucceeded) {
81 File target = new File(fileNameBegin + "(" + 1 + ")" + fileNameEnd);
82
83 closeFile();
84
85 file = new File(this.fileName);
86 LogLog.debug("Renaming file " + file + " to " + target);
87 renameSucceeded = file.renameTo(target);
88
89 if (!renameSucceeded) {
90 try {
91 setFile(this.fileName, true, this.bufferedIO,
92 this.bufferSize);
93 } catch (IOException e) {
94 LogLog.error("setFile(" + this.fileName
95 + ", true) call failed.", e);
96 }
97
98 }
99
100 }
101
102 }
103
104 if (renameSucceeded) {
105 try {
106 setFile(this.fileName, false, this.bufferedIO, this.bufferSize);
107 this.nextRollover = 0L;
108 } catch (IOException e) {
109 LogLog.error("setFile(" + this.fileName
110 + ", false) call failed.", e);
111 }
112 }
113 }
114
115 public synchronized void setFile(String fileName, boolean append,
116 boolean bufferedIO, int bufferSize) throws IOException {
117 super.setFile(fileName, append, this.bufferedIO, this.bufferSize);
118 if (append) {
119 File f = new File(fileName);
120 ((CountingQuietWriter) this.qw).setCount(f.length());
121 }
122 }
123
124 public void setMaxBackupIndex(int maxBackups) {
125 this.maxBackupIndex = maxBackups;
126 }
127
128 public void setMaximumFileSize(long maxFileSize) {
129 this.maxFileSize = maxFileSize;
130 }
131
132 public void setMaxFileSize(String value) {
133 this.maxFileSize = OptionConverter.toFileSize(value,
134 this.maxFileSize + 1L);
135 }
136
137 protected void setQWForFiles(Writer writer) {
138 this.qw = new CountingQuietWriter(writer, this.errorHandler);
139 }
140
141 protected void subAppend(LoggingEvent event) {
142 super.subAppend(event);
143 if ((this.fileName != null) && (this.qw != null)) {
144 long size = ((CountingQuietWriter) this.qw).getCount();
145 if ((size >= this.maxFileSize) && (size >= this.nextRollover))
146 rollOverOther();
147 }
148 }
149 }
- 滚动日历
1 package com.byttersoft.util.log4j;
2
3 import java.util.Date;
4 import java.util.GregorianCalendar;
5 import java.util.Locale;
6 import java.util.TimeZone;
7
8 class RollingCalendar extends GregorianCalendar
9 {
10 private static final long serialVersionUID = -3560331770601814177L;
11 int type = -1;
12
13 RollingCalendar()
14 {
15 }
16
17 RollingCalendar(TimeZone tz, Locale locale) {
18 super(tz, locale);
19 }
20
21 void setType(int type) {
22 this.type = type;
23 }
24
25 public long getNextCheckMillis(Date now) {
26 return getNextCheckDate(now).getTime();
27 }
28
29 public Date getNextCheckDate(Date now) {
30 setTime(now);
31
32 switch (this.type) {
33 case 0:
34 set(13, 0);
35 set(14, 0);
36 add(12, 1);
37 break;
38 case 1:
39 set(12, 0);
40 set(13, 0);
41 set(14, 0);
42 add(11, 1);
43 break;
44 case 2:
45 set(12, 0);
46 set(13, 0);
47 set(14, 0);
48 int hour = get(11);
49 if (hour < 12) {
50 set(11, 12);
51 } else {
52 set(11, 0);
53 add(5, 1);
54 }
55 break;
56 case 3:
57 set(11, 0);
58 set(12, 0);
59 set(13, 0);
60 set(14, 0);
61 add(5, 1);
62 break;
63 case 4:
64 set(7, getFirstDayOfWeek());
65 set(11, 0);
66 set(12, 0);
67 set(13, 0);
68 set(14, 0);
69 add(3, 1);
70 break;
71 case 5:
72 set(5, 1);
73 set(11, 0);
74 set(12, 0);
75 set(13, 0);
76 set(14, 0);
77 add(2, 1);
78 break;
79 default:
80 throw new IllegalStateException("Unknown periodicity type.");
81 }
82 return getTime();
83 }
84 }
- 工具类
1 package com.byttersoft.util.log4j;
2
3 import java.io.IOException;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import org.apache.log4j.Appender;
8 import org.apache.log4j.FileAppender;
9 import org.apache.log4j.Level;
10 import org.apache.log4j.LogManager;
11 import org.apache.log4j.Logger;
12 import org.apache.log4j.PatternLayout;
13
14 import com.byttersoft.framework.exception.BtRuntimeException;
15 import com.byttersoft.util.StringUtil;
16
17 /**
18 * log4j日志管理Util类
19 * @author zhengg
20 *
21 */
22 public class Log4jManageUtil {
23
24 public static Map LOG_TYPE=new HashMap();
25
26 static{
27 LOG_TYPE.put("DATE_SIZE", "com.byttersoft.util.log4j.DailyRollingAllFileAppender");//日期和滚存同时进行
28 LOG_TYPE.put("DATE", "com.byttersoft.util.log4j.DailyRollingFileAppender");//明天生成一个日志文件
29 LOG_TYPE.put("SIZE", "com.byttersoft.util.log4j.RollingFileAppender");//根据大小生成文件
30 }
31
32 /**
33 * 通过日志别称获取日志对象
34 * @param logName
35 * @return
36 */
37 public static Logger getLogger(String logName){
38 Logger log=LogManager.getLogger(logName);
39 if(log==null){
40 throw new BtRuntimeException("日志("+logName+")不存在。");
41 }
42 return log;
43 }
44
45 /**
46 * 通过类class获取日志对象
47 * @param logName
48 * @return
49 */
50 public static Logger getLogger(Class<?> clazz){
51 return LogManager.getLogger(clazz);
52 }
53
54 /**
55 * 通过日志别称设置日志级别
56 * @param logName 日志别称
57 * @param level 日志级别(ERROR,WARN,INFO,DEBUG)
58 */
59 public static void setLevel(String logName,String level){
60 getLogger(logName).setLevel(Level.toLevel(level,Level.DEBUG));
61 }
62
63 /**
64 * 通过类class设置日志级别
65 * @param clazz
66 * @param level 日志级别(ERROR,WARN,INFO,DEBUG)
67 */
68 public static void setLevel(Class<?> clazz,String level){
69 getLogger(clazz).setLevel(Level.toLevel(level,Level.DEBUG));
70 }
71
72 /**
73 * 获取生成日志方式类
74 * @param logName
75 * @param appName
76 * @return
77 */
78 public static FileAppender getFileAppender(String logName,String appName){
79 Appender appender=getLogger(logName).getAppender(appName);
80 if(appender==null){
81 throw new BtRuntimeException("日志Appender("+appName+")不存在。");
82 }
83 return (FileAppender) appender;
84 }
85
86 /**
87 * 设置日志记录格式
88 * @param logName
89 * @param className 只支持(DailyRollingFileAppender、RollingFileAppender、DailyRollingAllFileAppender)三种格式
90 * @param file 文件地址
91 * @param conPattern 设置输出方式
92 * @param datePattern 设置日期添加格式和生成日期格式
93 * @param maxFileSize 设置文件滚存大小
94 * @param maxBackupIndex 设置最大文件个数
95 * @throws IOException
96 */
97 public static void setAppender(String logName,String className,String file,String conPattern,String datePattern,String maxFileSize,Integer maxBackupIndex) throws IOException{
98 Logger log=LogManager.getLogger(logName);
99 FileAppender app=(FileAppender)log.getAppender(logName);
100 if(!StringUtil.isBlank_new(className)||app==null){//更改记录日志类型
101 PatternLayout layout=new PatternLayout();
102 layout.setConversionPattern(conPattern);
103 if(String.valueOf(className).indexOf(".DailyRollingFileAppender")!=-1){
104 app=new DailyRollingFileAppender(layout, file, datePattern);
105 }else if(String.valueOf(className).indexOf(".RollingFileAppender")!=-1){
106 app=new RollingFileAppender(layout, file);
107 }else{
108 app=new DailyRollingAllFileAppender(layout, file, datePattern);
109 }
110 if(app!=null){
111 log.removeAllAppenders();
112 app.setName(logName);
113 log.addAppender(app);
114 }
115 }
116 app.setFile(file);//设置文件地址
117 if(!StringUtil.isBlank_new(conPattern)){//ConversionPattern设置输出方式
118 PatternLayout layout=new PatternLayout();
119 layout.setConversionPattern(conPattern);
120 app.setLayout(layout);
121 }
122 String classNameNew=app.getClass().toString();
123 if(!StringUtil.isBlank_new(datePattern)
124 &&(classNameNew.indexOf(".DailyRollingAllFileAppender")!=-1
125 ||classNameNew.indexOf(".DailyRollingFileAppender")!=-1)){//设置日志添加日期格式和生成日志格式
126 DailyRollingFileAppender drfApp=(DailyRollingFileAppender)app;
127 drfApp.setDatePattern(datePattern);
128 }
129 if(!StringUtil.isBlank_new(maxFileSize)){//设置文件大小
130 if(classNameNew.indexOf(".DailyRollingAllFileAppender")!=-1){
131 DailyRollingAllFileAppender drafApp=(DailyRollingAllFileAppender)app;
132 drafApp.setMaxFileSize(maxFileSize);
133 }else if(classNameNew.indexOf(".RollingFileAppender")!=-1){
134 RollingFileAppender rfApp=(RollingFileAppender)app;
135 rfApp.setMaxFileSize(maxFileSize);
136 }
137 }
138 if(maxBackupIndex!=null){//设置最大文件个数
139 if(classNameNew.indexOf(".DailyRollingAllFileAppender")!=-1){
140 DailyRollingAllFileAppender drafApp=(DailyRollingAllFileAppender)app;
141 drafApp.setMaxBackupIndex(maxBackupIndex);
142 }else if(classNameNew.indexOf(".RollingFileAppender")!=-1){
143 RollingFileAppender rfApp=(RollingFileAppender)app;
144 rfApp.setMaxBackupIndex(maxBackupIndex);
145 }
146 }
147 }
148
149 /**
150 * 设置日志文件地址
151 * @param logName
152 * @param file
153 * @throws IOException
154 */
155 public static void setFile(String logName,String file) throws IOException{
156 setAppender(logName, null, file, null, null, null,null);
157 }
158
159 public static void main(String[] args) {
160 Logger log=LogManager.getLogger("VPAYSendDataLog");
161
162 // log.setLevel(level)
163 // Appender app=new dailyRollinga
164 // log.getAppender(name);
165 Appender app=log.getAppender("VPAYSendDataLog");
166 String className=app.getClass().toString();
167 System.out.println(app.getClass().toString());
168 if(className.indexOf("DailyRollingAllFileAppender")!=-1){
169 DailyRollingAllFileAppender dra=(DailyRollingAllFileAppender) app;
170 dra.getMaxBackupIndex();
171 dra.setFile("D:\\ss/s/\\ss");
172 }
173 // for(int i=0;i<4;i++){
174 // Layout layout=new PatternLayout("%d - %m%n");
175 // Appender app=new DailyRollingFileAppender(layout, "D:\\tj\\logs/"+i+"ss.txt","'.'yyyy-MM-dd'.txt'");
176 // log.addAppender(app);
177 // }
178 // app.set
179 //// RollingFileAppender fa=
180 // log.addAppender(app);
181 // Enumeration enu=log.getAllAppenders();
182 // while(enu.hasMoreElements()){
183 // Appender app=(Appender) enu.nextElement();
184 // System.out.println(app.getName());
185 // }
186
187 log.info("1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
188 log.info("2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
189 log.info("3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
190 log.info("4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
191 log.info("5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
192 log.info("6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
193 log.info("7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
194 log.info("8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
195 }
196
197 }
- 项目启动加载类。可自己扩展在项目页面中动态设置
1 package com.byttersoft.util.log4j;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.util.List;
6
7 import javax.servlet.ServletContextEvent;
8 import javax.servlet.ServletContextListener;
9
10 import org.apache.log4j.LogManager;
11 import org.apache.log4j.Logger;
12
13 import com.byttersoft.admin.bean.ErpInterfaceLogTypeSearchBean;
14 import com.byttersoft.admin.service.ErpInterfaceLogTypeService;
15 import com.byttersoft.dataexchange.base.TaskBase;
16 import com.byttersoft.persistence.admin.entity.ErpInterfaceLogType;
17 import com.byttersoft.util.SpringContextUtil;
18
19 public class Log4jInit implements ServletContextListener {
20
21 private Logger log=LogManager.getRootLogger();
22
23 public void contextDestroyed(ServletContextEvent arg0) {
24 log.info("==========log4j日志初始化信息进行销毁==========");
25 }
26
27 public void contextInitialized(ServletContextEvent arg0) {
28 log.info("==========log4j日志系统初始化开始==========");
29 ErpInterfaceLogTypeSearchBean searchBean=new ErpInterfaceLogTypeSearchBean();
30 searchBean.setAvailableFlag(1);
31 ErpInterfaceLogTypeService service = (ErpInterfaceLogTypeService)SpringContextUtil.getBean("erpInterfaceLogTypeService");;
32 List logTypeList=service.getErpInterfaceLogType(searchBean);
33 for(ErpInterfaceLogType logType:logTypeList){
34 try {
35 String filePath=logType.getLogFile()+"/"+logType.getCode()+"/"+logType.getCode()+".log";
36 File file=new File(filePath);
37 if(file.exists()){
38 File file1=new File(logType.getLogFile()+"/"+logType.getCode());
39 file1.mkdirs();
40 file.createNewFile();
41 }
42 Log4jManageUtil.setAppender(logType.getCode(),
43 Log4jManageUtil.LOG_TYPE.get(logType.getLogType()),
44 filePath,
45 logType.getConPattern(),
46 logType.getDatePattern(),
47 logType.getMaxFileSize(),
48 logType.getMaxBackupIndex());
49 Log4jManageUtil.setLevel(logType.getCode(), logType.getLogLevel());
50 } catch (IOException e) {
51 e.printStackTrace();
52 log.error(e.getMessage());
53 }
54 log.info("==========log4j日志系统初始化:"+logType.getName()+"("+logType.getCode()+")成功!");
55 }
56 log.info("==========log4j日志系统初始化结束==========");
57 log.info("==========允许定时任务启动开始设置=========="+TaskBase.isProcess);
58 TaskBase.isProcess=true;
59 log.info("==========允许定时任务启动结束设置=========="+TaskBase.isProcess);
60
61 }
62
63 }
- 数据库表【oracle】
此表存储要 打印的日志类名称、打印模板、日志文件大小、日志文件存储类型、日志级别
其他数据库及程序的查询,很简单。都自己实现吧
1 CREATE TABLE
2 ERP_INTERFACE_LOG_TYPE
3 (
4 NAME VARCHAR2(50),
5 CODE VARCHAR2(50),
6 AVAILABLE_FLAG NUMBER DEFAULT 1,
7 UUID VARCHAR2(32) NOT NULL,
8 LOG_FILE VARCHAR2(100) DEFAULT 'D:/logs',
9 LOG_TYPE VARCHAR2(50) DEFAULT 'DATE_SIZE',
10 CON_PATTERN VARCHAR2(50) DEFAULT '%d - %m%n',
11 DATE_PATTERN VARCHAR2(50),
12 MAX_FILE_SIZE VARCHAR2(50) DEFAULT '20MB',
13 MAX_BACKUP_INDEX NUMBER DEFAULT 20,
14 LOG_LEVEL VARCHAR2(20) DEFAULT 'DEBUG' ,
15 CONSTRAINT ERP_INTERFACE_LOG_PK_VALUE PRIMARY KEY (UUID)
16 );
17 COMMENT ON TABLE ERP_INTERFACE_LOG_TYPE
18 IS
19 '接口类型信息记录';
20 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.NAME
21 IS
22 '日志名称';
23 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.CODE
24 IS
25 '日志别称';
26 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.AVAILABLE_FLAG
27 IS
28 '是否可用(是:1,否:0)';
29 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.UUID
30 IS
31 'ID';
32 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.LOG_FILE
33 IS
34 '日志地址';
35 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.LOG_TYPE
36 IS
37 'DATE_SIZE(明天生成一个文件且一天中感觉大小滚存),DATE明天生成一个文件,SIZE感觉大小滚存文件';
38 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.CON_PATTERN
39 IS
40 '设置输出方式';
41 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.DATE_PATTERN
42 IS
43 '设置日志添加日期格式和生成日志格式';
44 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.MAX_FILE_SIZE
45 IS
46 '设置文件大小 KB/MB';
47 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.MAX_BACKUP_INDEX
48 IS
49 '最多文件个数';
50 COMMENT ON COLUMN ERP_INTERFACE_LOG_TYPE.LOG_LEVEL
51 IS
52 '日志级别:错误ERROR,警告WARN,信息INFO,调试DEBUG';