基本想法就是再每个doPost里建立新的logger实例,各线程里的logger实例互不影响。测试了下基本能达到要求。还有2个要求没有实现,请大家帮我想象办法。1.要求ERROR信息和INFO信息格式不同。ERROR要求详细的格式,INFO只是简单的输出程序流程。
2.还要求有一个总的日志文件,里面也是按请求保存日志信息,包括ERROR信息,和INFO信息。
代码,自己写一个MyLog类,构造函数初始化,然后返回新的logger
1. import org.apache.log4j.*;
2.
3. public class MyLog
4. {
5. private RollingFileAppender fileAppendar = null;
6. private ConsoleAppender consoleAppendar = null;
7. private PatternLayout layout = null;
8. private String pattrenlayput = "[%p]-[%l]-[%m]%n";
9. private Logger MainLogger = null;
10.
11. /*
12. * FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7
13. */
14. public MyLog(String FileName, String cname) throws Exception
15. {
16. layout = new PatternLayout(pattrenlayput);
17. // log文件设置
18. fileAppendar = new RollingFileAppender(layout, FileName, true);
19. fileAppendar.setMaximumFileSize(4 * 1024);
20. fileAppendar.setMaxBackupIndex(10);
21. // 控制台设置
22. consoleAppendar = new ConsoleAppender(layout, "System.out");
23. // 清除原日志格式
24. // LogManager.resetConfiguration();
25. MainLogger = Logger.getLogger(cname);
26. // // 设置级别
27. MainLogger.setLevel(Level.INFO);
28. MainLogger.addAppender(fileAppendar);
29. MainLogger.addAppender(consoleAppendar);
30. }
31.
32. public Logger GetLog()
33. {
34. return MainLogger;
35. }
36. }
测试代码:需要注意的就是
LogManager.resetConfiguration(); 这个方法清除以前的输出格式信息,应该是log4j默认格式。DateTime.NowDT();是自己写的个时间方法,这里返回年月日,精确到毫秒。MyLog创建2个Logger实例,第二个参数名字不能一样,如果一样就回打印重复(原理我不理解) ,所以给的参数是精确到毫秒的字符串。 1. import org.apache.log4j.*;
2.
3. class TestDes
4. {
5. // public static Logge logger = new MyLog("")
6. public static void main(String[] args)
7. {
8.
9. try
10. {
11. String FileName = "G:\\" + DateTime.NowDT();//
12. LogManager.resetConfiguration();
13.
14.
15. Logger test1 = new MyLog("G:\\a1.log",DateTime.NowDT()).GetLog();
16.
17. Logger test2 = new MyLog("G:\\a2.log",DateTime.NowDT()).GetLog();
18.
19.
20. test1.error("输出error");
21. test2.info("输出info");
22. } catch ( Exception e )
23. {
24. e.printStackTrace();
25. }
26. }
27. }
2.还要求有一个总的日志文件,里面也是按请求保存日志信息,包括ERROR信息,和INFO信息。
代码,自己写一个MyLog类,构造函数初始化,然后返回新的logger
1. import org.apache.log4j.*;
2.
3. public class MyLog
4. {
5. private RollingFileAppender fileAppendar = null;
6. private ConsoleAppender consoleAppendar = null;
7. private PatternLayout layout = null;
8. private String pattrenlayput = "[%p]-[%l]-[%m]%n";
9. private Logger MainLogger = null;
10.
11. /*
12. * FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7
13. */
14. public MyLog(String FileName, String cname) throws Exception
15. {
16. layout = new PatternLayout(pattrenlayput);
17. // log文件设置
18. fileAppendar = new RollingFileAppender(layout, FileName, true);
19. fileAppendar.setMaximumFileSize(4 * 1024);
20. fileAppendar.setMaxBackupIndex(10);
21. // 控制台设置
22. consoleAppendar = new ConsoleAppender(layout, "System.out");
23. // 清除原日志格式
24. // LogManager.resetConfiguration();
25. MainLogger = Logger.getLogger(cname);
26. // // 设置级别
27. MainLogger.setLevel(Level.INFO);
28. MainLogger.addAppender(fileAppendar);
29. MainLogger.addAppender(consoleAppendar);
30. }
31.
32. public Logger GetLog()
33. {
34. return MainLogger;
35. }
36. }
测试代码:需要注意的就是
LogManager.resetConfiguration(); 这个方法清除以前的输出格式信息,应该是log4j默认格式。DateTime.NowDT();是自己写的个时间方法,这里返回年月日,精确到毫秒。MyLog创建2个Logger实例,第二个参数名字不能一样,如果一样就回打印重复(原理我不理解) ,所以给的参数是精确到毫秒的字符串。 1. import org.apache.log4j.*;
2.
3. class TestDes
4. {
5. // public static Logge logger = new MyLog("")
6. public static void main(String[] args)
7. {
8.
9. try
10. {
11. String FileName = "G:\\" + DateTime.NowDT();//
12. LogManager.resetConfiguration();
13.
14.
15. Logger test1 = new MyLog("G:\\a1.log",DateTime.NowDT()).GetLog();
16.
17. Logger test2 = new MyLog("G:\\a2.log",DateTime.NowDT()).GetLog();
18.
19.
20. test1.error("输出error");
21. test2.info("输出info");
22. } catch ( Exception e )
23. {
24. e.printStackTrace();
25. }
26. }
27. }
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货