Log4j.properties:
# # # Direct log messages to stdout # # #log4j. appender.stdout= org.apache.log4j.consoleappenderlog4j.appender.stdout.target=system.outlog4j.appender.stdout.layout= Org.apache.log4j.patternlayoutlog4j.appender.stdout.layout.conversionpattern=%d{yyyy-mm-dd HH:mm:ss,SSS} [%-5p] [ %c.%m ()]:%c{1}.java%l-%m%n### Direct log messages to MyFile # #log4j. appender.myfile= Org.apache.log4j.DailyRollingFileAppenderlog4j.appender.myfile.file = f:/eespace/log-test/logs/ Mylog.loglog4j.appender.myfile.datepattern= '. ' yyyy-mm-ddlog4j.appender.myfile.layout= Org.apache.log4j.patternlayoutlog4j.appender.myfile.layout.conversionpattern=%d{yyyy-mm-dd HH:mm:ss,SSS} [%-5p] [ %c.%m ()]:%c{1}.java%l-%m%n### Direct log mythreadfile to stdout # #log4j. appender.mythreadfile= Com.demo.hello.provider.log_test. Threaddailyrollingappenderdecoratorlog4j.appender.mythreadfile.maxfilesize= 60log4j.appender.mythreadfile.maxthreadsize=5log4j.appender.mythreadfile.filepath=f:/eespace/log-test/ Logslog4j.appender.myThreadfile.threadLOgfilename=thread_log.loglog4j.appender.mythreadfile.datepattern= '. ' yyyy-mm-ddlog4j.appender.mythreadfile.layout= Org.apache.log4j.patternlayoutlog4j.appender.mythreadfile.layout.conversionpattern=%d{yyyy-mm-dd HH:mm:ss,SSS} [ %-5P] [%c.%m ()]:%c{1}.java%l-%m%n### set log levels-for more verbose logging change ' info ' to ' Debug ' # # #log4j. Rootlo Gger=info, Stdout,myfile#mythreadfilelog4j.logger.com.demo.hello.provider.log_test=info, Stdout,myThreadfile
Threaddailyrollingappenderdecorator:
/** * @author Wumingkun * @version 1.0.0 * @Description */package com.demo.hello.provider.log_test;import Java.io.file;im Port Java.io.ioexception;import org.apache.log4j.dailyrollingfileappender;import org.apache.log4j.layout;/** * @ Author Wumingkun * */public class Threaddailyrollingappenderdecorator Extendsdailyrollingfileappender implements cloneable {private int maxfilesize;private int maxthreadsize;private string Filepath;private string threadlogfilename;d Ailyrollingfileappender fileappender;public Threaddailyrollingappenderdecorator () {super ();} Public threaddailyrollingappenderdecorator (Layout layout, String filename,string datepattern) throws IOException { Super (layout, filename, datepattern);} Public Threaddailyrollingappenderdecorator (Threaddailyrollingappenderdecorator fileappender,string threadName) Throws IOException {This (Fileappender.getlayout (), Fileappender.getfilename (ThreadName), Fileappender.getdatepattern ()); this.fileappender = Fileappender;} Public DailyrollingfileappeNDEr Getfileappender () {return fileappender;} public void Setfileappender (Dailyrollingfileappender fileappender) {this.fileappender = Fileappender;} public int getmaxfilesize () {return maxfilesize;} public void setmaxfilesize (int maxfilesize) {this.maxfilesize = MaxFileSize;} Public Object copy () {try {return this.clone ();} catch (Clonenotsupportedexception e) {e.printstacktrace ();} return null;} public int getmaxthreadsize () {return maxthreadsize;} public void setmaxthreadsize (int maxthreadsize) {this.maxthreadsize = maxthreadsize;} public void SetFilePath (String filePath) {this.filepath = FilePath;} Public String Getthreadlogfilename () {return threadlogfilename;} public void Setthreadlogfilename (String threadlogfilename) {this.threadlogfilename = Threadlogfilename;} public void init (String threadname) {this.name = Threadname;this.setfile (GetFileName (ThreadName)); try {this.setfile ( This.filename, True, false, this.buffersize);} catch (IOException e) {e.printstacktrace ();}} /** * @return */publicString GetFileName (String threadname) {return this.filepath + file.separator + threadname + file.separator+ This.threadlo Gfilename;}}
Threadloggerfactory:
/** * @author Wumingkun * @version 1.0.0 * @Description */package com.demo.hello.provider.log_test;import java.io.IOExcep Tion;import java.util.enumeration;import org.apache.log4j.appender;import org.apache.log4j.logger;/** * @author Wumingkun * */public class Threadloggerfactory {static final String prefix= "com.demo.hello.provider.log_test"; static Logger Parentlogger; static {parentlogger=logger.getlogger (prefix);} public static Logger GetLogger () {Logger Logger =logger.getlogger (Prefix+thread.currentthread (). GetName ()); Addappender (Logger,thread.currentthread (). GetName ()); return logger;} /** * @param name */private static void Addappender (Logger logger,string threadname) {enumeration<appender> appends =parentlogger.getallappenders (); if (!logger.getallappenders (). hasMoreElements ()) {while (Appends.hasmoreelements ( ) {Appender Appender = (Appender) appends.nextelement (); if (Appender instanceof threaddailyrollingappenderdecorator) { Threaddailyrollingappenderdecorator myappender= (ThreaddaiLyrollingappenderdecorator) appender;try {logger.addappender (new Threaddailyrollingappenderdecorator (Myappender, ThreadName));} catch (IOException e) {e.printstacktrace ();} Continue;} Logger.addappender (Appender);}}}
Threadlogtest:
/** * * @author Wumingkun * @version 1.0.0 * @Description */package com.demo.hello.provider.log_test;import java.util . Enumeration;import org.apache.log4j.appender;import org.apache.log4j.logger;/** * @author Wumingkun * */public class threadlogtest {static Logger Logger=logger.getlogger (Threadlogtest.class);/** * @param args */public static void main ( String[] args) {MyThread mythread=new MyThread (); for (int i=1;i<11;i++) {new Thread (MyThread, "MyThread" +i). Start ();}} Class MyThread implements runnable{/* (non-javadoc) * @see java.lang.runnable#run () */public void Run () {Logger logger=thr Eadloggerfactory.getlogger (); Logger.debug (Thread.CurrentThread (). GetName () + "-----Debug"); Logger.info ( Thread.CurrentThread (). GetName () + "-----info");}}
Results:
watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvd29izw5kawfua3vu/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/ Dissolve/70/gravity/southeast ">
log4j implement each thread to save a log file